blob: 2c835967539dcf1e53f03a041bf2c8ef7f0922b0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Atsuhiko Yamanaka, JCraft,Inc. - initial API and implementation.
* IBM Corporation - ongoing maintenance
* Atsuhiko Yamanaka, JCraft,Inc. - re-implement the public key transfer by using IJSchLocation.
* Atsuhiko Yamanaka, JCraft,Inc. - Bug 351094 SSH2 Key Management Comment Field stuck on RSA-1024
*******************************************************************************/
package org.eclipse.jsch.internal.ui.preference;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jsch.core.IJSchLocation;
import org.eclipse.jsch.core.IJSchService;
import org.eclipse.jsch.internal.core.IConstants;
import org.eclipse.jsch.internal.core.JSchCorePlugin;
import org.eclipse.jsch.internal.core.Utils;
import org.eclipse.jsch.internal.ui.JSchUIPlugin;
import org.eclipse.jsch.internal.ui.Messages;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.HostKey;
import com.jcraft.jsch.HostKeyRepository;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.KeyPair;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
public class PreferencePage extends org.eclipse.jface.preference.PreferencePage
implements IWorkbenchPreferencePage{
private static final String SSH2_PREFERENCE_PAGE_CONTEXT="org.eclipse.jsch.ui.ssh2_preference_page_context"; //$NON-NLS-1$
private Label ssh2HomeLabel;
private Label privateKeyLabel;
Text ssh2HomeText;
Text privateKeyText;
private Button privateKeyAdd;
private Button ssh2HomeBrowse;
Button keyGenerateDSA;
Button keyGenerateRSA;
private Button keyLoad;
private Button keyExport;
Button saveKeyPair;
private Label keyCommentLabel;
Text keyCommentText;
private Label keyFingerPrintLabel;
Text keyFingerPrintText;
private Label keyPassphrase1Label;
Text keyPassphrase1Text;
private Label keyPassphrase2Label;
Text keyPassphrase2Text;
private Label publicKeylabel;
Text publicKeyText;
KeyPair kpair=null;
String kpairComment;
public static final String AUTH_SCHEME="";//$NON-NLS-1$
public PreferencePage(){
setDescription(Messages.CVSSSH2PreferencePage_18);
}
protected Control createContents(Composite parent){
Composite container=new Composite(parent, SWT.NULL);
GridLayout layout=new GridLayout();
container.setLayout(layout);
initializeDialogUnits(container);
TabFolder tabFolder=new TabFolder(container, SWT.NONE);
tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
TabItem tabItem=new TabItem(tabFolder, SWT.NONE);
tabItem.setText(Messages.CVSSSH2PreferencePage_19);
tabItem.setControl(createGeneralPage(tabFolder));
tabItem=new TabItem(tabFolder, SWT.NONE);
tabItem.setText(Messages.CVSSSH2PreferencePage_21);
tabItem.setControl(createKeyManagementPage(tabFolder));
tabItem=new TabItem(tabFolder, SWT.NONE);
tabItem.setText(Messages.CVSSSH2PreferencePage_133);
tabItem.setControl(createHostKeyManagementPage(tabFolder));
tabItem=new TabItem(tabFolder, SWT.NONE);
tabItem.setText(Messages.CVSSSH2PreferencePage_137);
tabItem.setControl(createPreferredAuthenticationPage(tabFolder));
tabItem=new TabItem(tabFolder, SWT.NONE);
tabItem.setText(Messages.CVSSSH2PreferencePage_144);
tabItem.setControl(createPreferredKeyExchangePage(tabFolder));
tabItem=new TabItem(tabFolder, SWT.NONE);
tabItem.setText(Messages.CVSSSH2PreferencePage_145);
tabItem.setControl(createPreferredMACPage(tabFolder));
tabItem=new TabItem(tabFolder, SWT.NONE);
tabItem.setText(Messages.CVSSSH2PreferencePage_146);
tabItem.setControl(createPreferredSSHAgentPage(tabFolder));
initControls();
Dialog.applyDialogFont(parent);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
SSH2_PREFERENCE_PAGE_CONTEXT);
return container;
}
private Control createGeneralPage(Composite parent){
Composite group=new Composite(parent, SWT.NULL);
GridLayout layout=new GridLayout();
layout.numColumns=3;
layout.marginHeight=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
group.setLayout(layout);
GridData data=new GridData();
data.horizontalAlignment=GridData.FILL;
group.setLayoutData(data);
ssh2HomeLabel=new Label(group, SWT.NONE);
ssh2HomeLabel.setText(Messages.CVSSSH2PreferencePage_23);
ssh2HomeText=new Text(group, SWT.SINGLE|SWT.BORDER);
ssh2HomeText.setFont(group.getFont());
GridData gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=1;
ssh2HomeText.setLayoutData(gd);
ssh2HomeBrowse=new Button(group, SWT.NULL);
ssh2HomeBrowse.setText(Messages.CVSSSH2PreferencePage_24);
gd=new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan=1;
ssh2HomeBrowse.setLayoutData(gd);
createSpacer(group, 3);
privateKeyLabel=new Label(group, SWT.NONE);
privateKeyLabel.setText(Messages.CVSSSH2PreferencePage_25);
privateKeyText=new Text(group, SWT.SINGLE|SWT.BORDER);
privateKeyText.setFont(group.getFont());
gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=1;
privateKeyText.setLayoutData(gd);
privateKeyAdd=new Button(group, SWT.NULL);
privateKeyAdd.setText(Messages.CVSSSH2PreferencePage_26);
gd=new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan=1;
privateKeyAdd.setLayoutData(gd);
ssh2HomeBrowse.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
String home=ssh2HomeText.getText();
if(!new File(home).exists()){
while(true){
int foo=home.lastIndexOf(java.io.File.separator, home.length());
if(foo==-1)
break;
home=home.substring(0, foo);
if(new File(home).exists())
break;
}
}
DirectoryDialog dd=new DirectoryDialog(getShell());
dd.setFilterPath(home);
dd.setMessage(Messages.CVSSSH2PreferencePage_27);
String dir=dd.open();
if(dir==null){ // cancel
return;
}
ssh2HomeText.setText(dir);
}
});
privateKeyAdd.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
String home=ssh2HomeText.getText();
FileDialog fd=new FileDialog(getShell(), SWT.OPEN|SWT.MULTI);
fd.setFilterPath(home);
Object o=fd.open();
if(o==null){ // cancel
return;
}
String[] files=fd.getFileNames();
String keys=privateKeyText.getText();
String dir=fd.getFilterPath();
if(dir.equals(home)){
dir="";} //$NON-NLS-1$
else{
dir+=java.io.File.separator;
}
for(int i=0; i<files.length; i++){
String foo=files[i];
if(keys.length()!=0)
keys=keys+","; //$NON-NLS-1$
keys=keys+dir+foo;
}
privateKeyText.setText(keys);
}
});
return group;
}
private Control createKeyManagementPage(Composite parent){
int columnSpan=3;
Composite group=new Composite(parent, SWT.NULL);
GridLayout layout=new GridLayout();
layout.numColumns=3;
layout.marginHeight=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
group.setLayout(layout);
GridData gd=new GridData();
gd.horizontalAlignment=GridData.FILL;
group.setLayoutData(gd);
keyGenerateDSA=new Button(group, SWT.NULL);
keyGenerateDSA.setText(Messages.CVSSSH2PreferencePage_131);
gd=new GridData();
gd.horizontalSpan=1;
keyGenerateDSA.setLayoutData(gd);
keyGenerateRSA=new Button(group, SWT.NULL);
keyGenerateRSA.setText(Messages.CVSSSH2PreferencePage_132);
gd=new GridData();
gd.horizontalSpan=1;
keyGenerateRSA.setLayoutData(gd);
keyLoad=new Button(group, SWT.NULL);
keyLoad.setText(Messages.CVSSSH2PreferencePage_128);
gd=new GridData();
gd.horizontalSpan=1;
keyLoad.setLayoutData(gd);
publicKeylabel=new Label(group, SWT.NONE);
publicKeylabel.setText(Messages.CVSSSH2PreferencePage_39);
gd=new GridData();
gd.horizontalSpan=columnSpan;
publicKeylabel.setLayoutData(gd);
publicKeyText=new Text(group, SWT.MULTI|SWT.BORDER|SWT.V_SCROLL|SWT.WRAP|SWT.LEFT_TO_RIGHT);
publicKeyText.setText(""); //$NON-NLS-1$
publicKeyText.setEditable(false);
gd=new GridData();
gd.horizontalSpan=columnSpan;
gd.horizontalAlignment=GridData.FILL;
gd.verticalAlignment=GridData.FILL;
gd.grabExcessHorizontalSpace=true;
gd.grabExcessVerticalSpace=true;
publicKeyText.setLayoutData(gd);
keyFingerPrintLabel=new Label(group, SWT.NONE);
keyFingerPrintLabel.setText(Messages.CVSSSH2PreferencePage_41);
keyFingerPrintText=new Text(group, SWT.SINGLE|SWT.BORDER|SWT.LEFT_TO_RIGHT);
keyFingerPrintText.setFont(group.getFont());
keyFingerPrintText.setEditable(false);
gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=2;
keyFingerPrintText.setLayoutData(gd);
keyCommentLabel=new Label(group, SWT.NONE);
keyCommentLabel.setText(Messages.CVSSSH2PreferencePage_42);
keyCommentText=new Text(group, SWT.SINGLE|SWT.BORDER);
keyCommentText.setFont(group.getFont());
gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=2;
keyCommentText.setLayoutData(gd);
keyCommentText.addModifyListener(new ModifyListener(){
public void modifyText(ModifyEvent e){
if(kpair==null)
return;
try{
ByteArrayOutputStream out=new ByteArrayOutputStream();
kpairComment = keyCommentText.getText();
kpair.writePublicKey(out, kpairComment);
out.close();
publicKeyText.setText(out.toString());
}
catch(IOException ee){
// Ignore
}
}
});
keyPassphrase1Label=new Label(group, SWT.NONE);
keyPassphrase1Label.setText(Messages.CVSSSH2PreferencePage_43);
keyPassphrase1Text=new Text(group, SWT.SINGLE|SWT.BORDER);
keyPassphrase1Text.setFont(group.getFont());
keyPassphrase1Text.setEchoChar('*');
gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=2;
keyPassphrase1Text.setLayoutData(gd);
keyPassphrase2Label=new Label(group, SWT.NONE);
keyPassphrase2Label.setText(Messages.CVSSSH2PreferencePage_44);
keyPassphrase2Text=new Text(group, SWT.SINGLE|SWT.BORDER);
keyPassphrase2Text.setFont(group.getFont());
keyPassphrase2Text.setEchoChar('*');
gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=2;
keyPassphrase2Text.setLayoutData(gd);
keyPassphrase1Text.addModifyListener(new ModifyListener(){
public void modifyText(ModifyEvent e){
String pass1=keyPassphrase1Text.getText();
String pass2=keyPassphrase2Text.getText();
if(kpair!=null&&pass1.equals(pass2)){
saveKeyPair.setEnabled(true);
}
else{
saveKeyPair.setEnabled(false);
}
if(pass2.length()==0){
setErrorMessage(null);
return;
}
if(pass1.equals(pass2)){
setErrorMessage(null);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_48);
}
}
});
keyPassphrase2Text.addModifyListener(new ModifyListener(){
public void modifyText(ModifyEvent e){
String pass1=keyPassphrase1Text.getText();
String pass2=keyPassphrase2Text.getText();
if(kpair!=null&&pass1.equals(pass2)){
saveKeyPair.setEnabled(true);
}
else{
saveKeyPair.setEnabled(false);
}
if(pass2.length()<pass1.length()){
if(pass1.startsWith(pass2)){
setErrorMessage(null);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_48);
}
return;
}
if(pass1.equals(pass2)){
setErrorMessage(null);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_48);
}
}
});
keyPassphrase2Text.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent e){
String pass1=keyPassphrase1Text.getText();
String pass2=keyPassphrase2Text.getText();
if(pass2.length()<pass1.length()){
if(pass1.startsWith(pass2)){
setErrorMessage(null);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_48);
}
return;
}
if(pass1.equals(pass2)){
setErrorMessage(null);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_48);
}
}
public void focusLost(FocusEvent e){
String pass1=keyPassphrase1Text.getText();
String pass2=keyPassphrase2Text.getText();
if(pass1.equals(pass2)){
setErrorMessage(null);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_48);
}
}
});
Composite buttons=new Composite(group, SWT.NONE);
layout=new GridLayout(2, true);
layout.marginWidth=0;
layout.marginHeight=0;
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
buttons.setLayout(layout);
gd=new GridData(GridData.HORIZONTAL_ALIGN_END);
gd.horizontalSpan=columnSpan;
buttons.setLayoutData(gd);
keyExport=new Button(buttons, SWT.NULL);
keyExport.setText(Messages.CVSSSH2PreferencePage_105);
gd=new GridData(GridData.FILL_BOTH);
keyExport.setLayoutData(gd);
saveKeyPair=new Button(buttons, SWT.NULL);
saveKeyPair.setText(Messages.CVSSSH2PreferencePage_45);
gd=new GridData(GridData.FILL_BOTH);
saveKeyPair.setLayoutData(gd);
SelectionAdapter keygenadapter=new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
boolean ok=true;
String _type=""; //$NON-NLS-1$
try{
int type=0;
if(e.widget==keyGenerateDSA){
type=KeyPair.DSA;
_type=IConstants.DSA;
}
else if(e.widget==keyGenerateRSA){
type=KeyPair.RSA;
_type=IConstants.RSA;
}
else{
return;
}
final KeyPair[] _kpair=new KeyPair[1];
final int __type=type;
final JSchException[] _e=new JSchException[1];
BusyIndicator.showWhile(getShell().getDisplay(), new Runnable(){
public void run(){
try{
_kpair[0]=KeyPair.genKeyPair(getJSch(), __type);
}
catch(JSchException e){
_e[0]=e;
}
}
});
if(_e[0]!=null){
throw _e[0];
}
kpair=_kpair[0];
ByteArrayOutputStream out=new ByteArrayOutputStream();
kpairComment=_type+"-1024"; //$NON-NLS-1$
kpair.writePublicKey(out, kpairComment);
out.close();
publicKeyText.setText(out.toString());
keyFingerPrintText.setText(kpair.getFingerPrint());
keyCommentText.setText(kpairComment);
keyPassphrase1Text.setText(""); //$NON-NLS-1$
keyPassphrase2Text.setText(""); //$NON-NLS-1$
updateControls();
}
catch(IOException ee){
ok=false;
}
catch(JSchException ee){
ok=false;
}
if(!ok){
MessageDialog.openError(getShell(),
Messages.CVSSSH2PreferencePage_error,
Messages.CVSSSH2PreferencePage_47);
}
}
};
keyGenerateDSA.addSelectionListener(keygenadapter);
keyGenerateRSA.addSelectionListener(keygenadapter);
keyLoad.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
boolean ok=true;
String home=ssh2HomeText.getText();
FileDialog fd=new FileDialog(getShell(), SWT.OPEN);
fd.setFilterPath(home);
Object o=fd.open();
if(o==null){ // cancel
return;
}
String pkey=fd.getFileName();
String pkeyab=(new File(fd.getFilterPath(), pkey)).getAbsolutePath();
try{
KeyPair _kpair=KeyPair.load(getJSch(), pkeyab);
PassphrasePrompt prompt=null;
while(_kpair.isEncrypted()){
if(prompt==null){
prompt=new PassphrasePrompt(NLS.bind(
Messages.CVSSSH2PreferencePage_126, new String[] {pkey}));
}
Display.getDefault().syncExec(prompt);
String passphrase=prompt.getPassphrase();
if(passphrase==null)
break;
if(_kpair.decrypt(passphrase)){
break;
}
MessageDialog.openError(getShell(),
Messages.CVSSSH2PreferencePage_error, NLS.bind(
Messages.CVSSSH2PreferencePage_129, new String[] {pkey}));
}
if(_kpair.isEncrypted()){
return;
}
kpair=_kpair;
String _type=(kpair.getKeyType()==KeyPair.DSA) ? IConstants.DSA
: IConstants.RSA;
kpairComment=_type+"-1024"; //$NON-NLS-1$
// TODO Bug 351094 The comment should be from kpair object,
// but the JSch API does not provided such a method.
// In the version 0.1.45, JSch will support such a method,
// and the following code should be replaced with it at that time.
java.io.FileInputStream fis=null;
try{
java.io.File f=new java.io.File(pkeyab+".pub"); //$NON-NLS-1$
int i=0;
fis=new java.io.FileInputStream(f);
byte[] buf=new byte[(int)f.length()];
while(i<buf.length){
int j=fis.read(buf, i, buf.length-i);
if(j<=0)
break;
i+=j;
}
String pubkey=new String(buf);
if(pubkey.indexOf(' ')>0
&&pubkey.indexOf(' ', pubkey.indexOf(' ')+1)>0){
int j=pubkey.indexOf(' ', pubkey.indexOf(' ')+1)+1;
kpairComment=pubkey.substring(j);
if(kpairComment.indexOf('\n')>0){
kpairComment=kpairComment.substring(0,
kpairComment.indexOf('\n'));
}
}
}
catch(IOException ioe){
// ignore if public-key does not exist.
}
finally{
if(fis!=null)
fis.close();
}
ByteArrayOutputStream out=new ByteArrayOutputStream();
kpair.writePublicKey(out, kpairComment);
out.close();
publicKeyText.setText(out.toString());
keyFingerPrintText.setText(kpair.getFingerPrint());
keyCommentText.setText(kpairComment);
keyPassphrase1Text.setText(""); //$NON-NLS-1$
keyPassphrase2Text.setText(""); //$NON-NLS-1$
updateControls();
}
catch(IOException ee){
ok=false;
}
catch(JSchException ee){
ok=false;
}
if(!ok){
MessageDialog.openError(getShell(),
Messages.CVSSSH2PreferencePage_error,
Messages.CVSSSH2PreferencePage_130);
}
}
});
keyExport.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
if(kpair==null)
return;
setErrorMessage(null);
final String[] target=new String[1];
final String title=Messages.CVSSSH2PreferencePage_106;
final String message=Messages.CVSSSH2PreferencePage_107;
Display.getDefault().syncExec(new Runnable(){
public void run(){
Display display=Display.getCurrent();
Shell shell=new Shell(display);
ExportDialog dialog=new ExportDialog(shell, title, message);
dialog.open();
shell.dispose();
target[0]=dialog.getTarget();
}
});
if(target[0]==null){
return;
}
String user=""; //$NON-NLS-1$
String host=""; //$NON-NLS-1$
int port=22;
if(target[0].indexOf('@')>0){
user=target[0].substring(0, target[0].indexOf('@'));
host=target[0].substring(target[0].indexOf('@')+1);
}
if(host.indexOf(':')>0){
try{
port=Integer.parseInt(host.substring(host.indexOf(':')+1));
}
catch(NumberFormatException ee){
port=-1;
}
host=host.substring(0, host.indexOf(':'));
}
if(user.length()==0||host.length()==0||port==-1){
setErrorMessage(NLS.bind(Messages.CVSSSH2PreferencePage_108,
new String[] {target[0]}));
return;
}
String options=""; //$NON-NLS-1$
try{
ByteArrayOutputStream bos=new ByteArrayOutputStream();
if(options.length()!=0){
try{
bos.write((options+" ").getBytes());} //$NON-NLS-1$
catch(IOException eeee){
// Ignore
}
}
kpair.writePublicKey(bos, kpairComment);
bos.close();
export_via_sftp(user, host, port, /* ".ssh/authorized_keys", //$NON-NLS-1$ */
bos.toByteArray());
}
catch(IOException ee){
// Ignore
}
catch(JSchException ee){
setErrorMessage(Messages.CVSSSH2PreferencePage_111);
}
}
});
saveKeyPair.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
if(kpair==null)
return;
String pass=keyPassphrase1Text.getText();
/*
* if(!pass.equals(keyPassphrase2Text.getText())){
* setErrorMessage(Policy.bind("CVSSSH2PreferencePage.48"));
* //$NON-NLS-1$ return; }
*/
if(pass.length()==0){
if(!MessageDialog.openConfirm(getShell(),
Messages.CVSSSH2PreferencePage_confirmation,
Messages.CVSSSH2PreferencePage_49)){
return;
}
}
kpair.setPassphrase(pass);
String home=ssh2HomeText.getText();
File _home=new File(home);
if(!_home.exists()){
if(!MessageDialog.openConfirm(getShell(),
Messages.CVSSSH2PreferencePage_confirmation, NLS.bind(
Messages.CVSSSH2PreferencePage_50, new String[] {home}))){
return;
}
if(!_home.mkdirs()){
setErrorMessage(Messages.CVSSSH2PreferencePage_100+home);
return;
}
}
FileDialog fd=new FileDialog(getShell(), SWT.SAVE);
fd.setFilterPath(home);
String file=(kpair.getKeyType()==KeyPair.RSA) ? "id_rsa" : "id_dsa"; //$NON-NLS-1$ //$NON-NLS-2$
fd.setFileName(file);
file=fd.open();
if(file==null){ // cancel
return;
}
if(new File(file).exists()){
if(!MessageDialog.openConfirm(getShell(),
Messages.CVSSSH2PreferencePage_confirmation, //
NLS.bind(Messages.CVSSSH2PreferencePage_53, new String[] {file}))){
return;
}
}
boolean ok=true;
try{
kpair.writePrivateKey(file);
kpair.writePublicKey(file+".pub", kpairComment); //$NON-NLS-1$
}
catch(Exception ee){
ok=false;
}
if(ok){
MessageDialog.openInformation(getShell(),
Messages.CVSSSH2PreferencePage_information,
Messages.CVSSSH2PreferencePage_55+"\n"+ //$NON-NLS-1$
Messages.CVSSSH2PreferencePage_57+file+"\n"+ //$NON-NLS-1$
Messages.CVSSSH2PreferencePage_59+file+".pub"); //$NON-NLS-1$
}
else{
return;
}
// The generated key should be added to privateKeyText.
String dir=fd.getFilterPath();
File mypkey=new java.io.File(dir, fd.getFileName());
String pkeys=privateKeyText.getText();
// Check if the generated key has been included in pkeys?
String[] pkeysa=pkeys.split(","); //$NON-NLS-1$
for(int i=0; i<pkeysa.length; i++){
File pkey=new java.io.File(pkeysa[i]);
if(!pkey.isAbsolute()){
pkey=new java.io.File(home, pkeysa[i]);
}
if(pkey.equals(mypkey))
return;
}
if(dir.equals(home)){
dir="";} //$NON-NLS-1$
else{
dir+=java.io.File.separator;
}
if(pkeys.length()>0)
pkeys+=","; //$NON-NLS-1$
pkeys=pkeys+dir+fd.getFileName();
privateKeyText.setText(pkeys);
}
});
return group;
}
private TableViewer viewer;
private Button removeHostKeyButton;
Table preferedAuthMethodTable;
Table preferedSSHAgentTable;
Table preferedKeyExchangeMethodTable;
Table preferedMACMethodTable;
Button up;
Button down;
Button kex_up;
Button kex_down;
Button mac_up;
Button mac_down;
class TableLabelProvider extends LabelProvider implements ITableLabelProvider{
public String getColumnText(Object element, int columnIndex){
HostKey entry=(HostKey)element;
switch(columnIndex){
case 0:
return entry.getHost();
case 1:
return entry.getType();
case 2:
return entry.getFingerPrint(getJSch());
default:
return null;
}
}
public Image getColumnImage(Object element, int columnIndex){
return null;
}
}
private Control createHostKeyManagementPage(Composite parent){
Composite group=new Composite(parent, SWT.NULL);
GridLayout layout=new GridLayout();
layout.marginHeight=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
layout.numColumns=2;
group.setLayout(layout);
GridData gd=new GridData();
gd.horizontalAlignment=GridData.FILL;
gd.verticalAlignment=GridData.FILL;
group.setLayoutData(gd);
Label label=new Label(group, SWT.NONE);
label.setText(Messages.CVSSSH2PreferencePage_139);
gd=new GridData();
gd.horizontalSpan=2;
label.setLayoutData(gd);
viewer=new TableViewer(group, SWT.MULTI|SWT.FULL_SELECTION|SWT.H_SCROLL
|SWT.V_SCROLL|SWT.BORDER);
Table table=viewer.getTable();
new TableEditor(table);
table.setHeaderVisible(true);
table.setLinesVisible(true);
gd=new GridData(GridData.FILL_BOTH);
gd.widthHint=convertWidthInCharsToPixels(30);
/*
* The hardcoded hint does not look elegant, but in reality it does not make
* anything bound to this 100-pixel value, because in any case the tree on
* the left is taller and that's what really determines the height.
*/
gd.heightHint=100;
table.setLayoutData(gd);
table.addListener(SWT.Selection, new Listener(){
public void handleEvent(Event e){
handleSelection();
}
});
// Create the table columns
new TableColumn(table, SWT.NULL);
new TableColumn(table, SWT.NULL);
new TableColumn(table, SWT.NULL);
TableColumn[] columns=table.getColumns();
columns[0].setText(Messages.CVSSSH2PreferencePage_134);
columns[1].setText(Messages.CVSSSH2PreferencePage_135);
columns[2].setText(Messages.CVSSSH2PreferencePage_136);
viewer.setColumnProperties(new String[] {
Messages.CVSSSH2PreferencePage_134, //
Messages.CVSSSH2PreferencePage_135, //
Messages.CVSSSH2PreferencePage_136});
viewer.setLabelProvider(new TableLabelProvider());
viewer.setContentProvider(new IStructuredContentProvider(){
public void dispose(){
// nothing to do
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput){
// nothing to do
}
public Object[] getElements(Object inputElement){
if(inputElement==null)
return null;
return (Object[])inputElement;
}
});
TableLayout tl=new TableLayout();
tl.addColumnData(new ColumnWeightData(30));
tl.addColumnData(new ColumnWeightData(20));
tl.addColumnData(new ColumnWeightData(70));
table.setLayout(tl);
Composite buttons=new Composite(group, SWT.NULL);
buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
layout=new GridLayout();
layout.marginHeight=0;
layout.marginWidth=0;
buttons.setLayout(layout);
removeHostKeyButton=new Button(buttons, SWT.PUSH);
removeHostKeyButton.setText(Messages.CVSSSH2PreferencePage_138);
int buttonWidth=SWTUtils
.calculateControlSize(SWTUtils.createDialogPixelConverter(parent),
new Button[] {removeHostKeyButton});
removeHostKeyButton.setLayoutData(SWTUtils.createGridData(buttonWidth,
SWT.DEFAULT, SWT.END, SWT.CENTER, false, false));
removeHostKeyButton.setEnabled(false);
removeHostKeyButton.addListener(SWT.Selection, new Listener(){
public void handleEvent(Event e){
removeHostKey();
}
});
Dialog.applyDialogFont(parent);
// JSchSession.loadKnownHosts(JSchContext.getDefaultContext().getJSch());
JSchCorePlugin.getPlugin().loadKnownHosts();
HostKeyRepository hkr=getJSch().getHostKeyRepository();
viewer.setInput(hkr.getHostKey());
handleSelection();
return group;
}
private Control createPreferredAuthenticationPage(Composite parent){
Composite root = new Composite(parent, SWT.NONE);
GridLayout layout=new GridLayout();
layout.marginHeight=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
layout.numColumns = 2;
root.setLayout(layout);
Label label=new Label(root, SWT.NONE);
GridData textLayoutData=new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false);
textLayoutData.horizontalSpan = 2;
label.setLayoutData(textLayoutData);
label.setText(Messages.CVSSSH2PreferencePage_4);
preferedAuthMethodTable=new Table(root, SWT.CHECK | SWT.BORDER);
GridData layoutData=new GridData(SWT.FILL, SWT.BEGINNING, true, true);
layoutData.verticalSpan = 3;
preferedAuthMethodTable.setLayoutData(layoutData);
layoutData.minimumHeight = 150;
layoutData.minimumWidth = 200;
populateAuthMethods();
up=new Button(root, SWT.PUSH);
up.setText(Messages.CVSSSH2PreferencePage_2);
up.setEnabled(false);
setButtonLayoutData(up);
down=new Button(root, SWT.PUSH);
down.setText(Messages.CVSSSH2PreferencePage_3);
down.setEnabled(false);
setButtonLayoutData(down);
preferedAuthMethodTable.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
boolean anySelected = false;
for(int i = 0; i < preferedAuthMethodTable.getItemCount(); i++){
anySelected |= preferedAuthMethodTable.getItem(i).getChecked();
}
if(anySelected){
setErrorMessage(null);
setValid(true);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_5);
setValid(false);
}
up.setEnabled(preferedAuthMethodTable.getSelectionIndex()>0);
down
.setEnabled(preferedAuthMethodTable.getSelectionIndex()<preferedAuthMethodTable
.getItemCount()-1);
}
});
up.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
int selectedIndex=preferedAuthMethodTable.getSelectionIndex();
if(selectedIndex == 1){ //this is the last possible swap
up.setEnabled(false);
}
down.setEnabled(true);
TableItem sourceItem = preferedAuthMethodTable.getItem(selectedIndex);
TableItem targetItem = preferedAuthMethodTable.getItem(selectedIndex-1);
//switch text
String stemp = targetItem.getText();
targetItem.setText(sourceItem.getText());
sourceItem.setText(stemp);
//switch selection
boolean btemp = targetItem.getChecked();
targetItem.setChecked(sourceItem.getChecked());
sourceItem.setChecked(btemp);
preferedAuthMethodTable.setSelection(targetItem);
}
});
down.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
int selectedIndex=preferedAuthMethodTable.getSelectionIndex();
if(selectedIndex == preferedAuthMethodTable.getItemCount()-2){ //this is the last possible swap
down.setEnabled(false);
}
up.setEnabled(true);
TableItem sourceItem = preferedAuthMethodTable.getItem(selectedIndex);
TableItem targetItem = preferedAuthMethodTable.getItem(selectedIndex+1);
//switch text
String stemp = targetItem.getText();
targetItem.setText(sourceItem.getText());
sourceItem.setText(stemp);
//switch selection
boolean btemp = targetItem.getChecked();
targetItem.setChecked(sourceItem.getChecked());
sourceItem.setChecked(btemp);
preferedAuthMethodTable.setSelection(targetItem);
}
});
return root;
}
private void populateAuthMethods(){
preferedAuthMethodTable.removeAll();
String[] methods = Utils.getEnabledPreferredAuthMethods().split(","); //$NON-NLS-1$
Set smethods = new HashSet(Arrays.asList(methods));
String[] order = Utils.getMethodsOrder().split(","); //$NON-NLS-1$
for(int i=0; i<order.length; i++){
TableItem tableItem= new TableItem(preferedAuthMethodTable, SWT.NONE);
tableItem.setText(0, order[i]);
if(smethods.contains(order[i])){
tableItem.setChecked(true);
}
}
}
private Control createPreferredKeyExchangePage(Composite parent){
Composite root = new Composite(parent, SWT.NONE);
GridLayout layout=new GridLayout();
layout.marginHeight=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
layout.numColumns = 2;
root.setLayout(layout);
Label label=new Label(root, SWT.NONE);
GridData textLayoutData=new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false);
textLayoutData.horizontalSpan = 2;
label.setLayoutData(textLayoutData);
label.setText(Messages.CVSSSH2PreferencePage_140);
preferedKeyExchangeMethodTable=new Table(root, SWT.CHECK | SWT.BORDER);
GridData layoutData=new GridData(SWT.FILL, SWT.BEGINNING, true, true);
layoutData.verticalSpan = 3;
preferedKeyExchangeMethodTable.setLayoutData(layoutData);
layoutData.minimumHeight = 150;
layoutData.minimumWidth = 200;
populateAuthMethods();
kex_up=new Button(root, SWT.PUSH);
kex_up.setText(Messages.CVSSSH2PreferencePage_2);
kex_up.setEnabled(false);
setButtonLayoutData(kex_up);
kex_down=new Button(root, SWT.PUSH);
kex_down.setText(Messages.CVSSSH2PreferencePage_3);
kex_down.setEnabled(false);
setButtonLayoutData(kex_down);
preferedKeyExchangeMethodTable.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
boolean anySelected = false;
for(int i = 0; i < preferedKeyExchangeMethodTable.getItemCount(); i++){
anySelected |= preferedKeyExchangeMethodTable.getItem(i).getChecked();
}
if(anySelected){
setErrorMessage(null);
setValid(true);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_142);
setValid(false);
}
kex_up.setEnabled(preferedKeyExchangeMethodTable.getSelectionIndex()>0);
kex_down
.setEnabled(preferedKeyExchangeMethodTable.getSelectionIndex()<preferedKeyExchangeMethodTable
.getItemCount()-1);
}
});
kex_up.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
int selectedIndex=preferedKeyExchangeMethodTable.getSelectionIndex();
if(selectedIndex == 1){ //this is the last possible swap
kex_up.setEnabled(false);
}
kex_down.setEnabled(true);
TableItem sourceItem = preferedKeyExchangeMethodTable.getItem(selectedIndex);
TableItem targetItem = preferedKeyExchangeMethodTable.getItem(selectedIndex-1);
//switch text
String stemp = targetItem.getText();
targetItem.setText(sourceItem.getText());
sourceItem.setText(stemp);
//switch selection
boolean btemp = targetItem.getChecked();
targetItem.setChecked(sourceItem.getChecked());
sourceItem.setChecked(btemp);
preferedKeyExchangeMethodTable.setSelection(targetItem);
}
});
kex_down.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
int selectedIndex=preferedKeyExchangeMethodTable.getSelectionIndex();
if(selectedIndex == preferedKeyExchangeMethodTable.getItemCount()-2){ //this is the last possible swap
kex_down.setEnabled(false);
}
kex_up.setEnabled(true);
TableItem sourceItem = preferedKeyExchangeMethodTable.getItem(selectedIndex);
TableItem targetItem = preferedKeyExchangeMethodTable.getItem(selectedIndex+1);
//switch text
String stemp = targetItem.getText();
targetItem.setText(sourceItem.getText());
sourceItem.setText(stemp);
//switch selection
boolean btemp = targetItem.getChecked();
targetItem.setChecked(sourceItem.getChecked());
sourceItem.setChecked(btemp);
preferedKeyExchangeMethodTable.setSelection(targetItem);
}
});
return root;
}
private void populateKeyExchangeMethods(){
preferedKeyExchangeMethodTable.removeAll();
String[] methods = Utils.getEnabledPreferredKEXMethods().split(","); //$NON-NLS-1$
Set smethods = new HashSet(Arrays.asList(methods));
String[] order = Utils.getKEXMethodsOrder().split(","); //$NON-NLS-1$
for(int i=0; i<order.length; i++){
TableItem tableItem= new TableItem(preferedKeyExchangeMethodTable, SWT.NONE);
tableItem.setText(0, order[i]);
if(smethods.contains(order[i])){
tableItem.setChecked(true);
}
}
}
private Control createPreferredMACPage(Composite parent){
Composite root = new Composite(parent, SWT.NONE);
GridLayout layout=new GridLayout();
layout.marginHeight=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
layout.numColumns = 2;
root.setLayout(layout);
Label label=new Label(root, SWT.NONE);
GridData textLayoutData=new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false);
textLayoutData.horizontalSpan = 2;
label.setLayoutData(textLayoutData);
label.setText(Messages.CVSSSH2PreferencePage_141);
preferedMACMethodTable=new Table(root, SWT.CHECK | SWT.BORDER);
GridData layoutData=new GridData(SWT.FILL, SWT.BEGINNING, true, true);
layoutData.verticalSpan = 3;
preferedMACMethodTable.setLayoutData(layoutData);
layoutData.minimumHeight = 150;
layoutData.minimumWidth = 200;
populateMACMethods();
mac_up=new Button(root, SWT.PUSH);
mac_up.setText(Messages.CVSSSH2PreferencePage_2);
mac_up.setEnabled(false);
setButtonLayoutData(mac_up);
mac_down=new Button(root, SWT.PUSH);
mac_down.setText(Messages.CVSSSH2PreferencePage_3);
mac_down.setEnabled(false);
setButtonLayoutData(mac_down);
preferedMACMethodTable.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
boolean anySelected = false;
for(int i = 0; i < preferedMACMethodTable.getItemCount(); i++){
anySelected |= preferedMACMethodTable.getItem(i).getChecked();
}
if(anySelected){
setErrorMessage(null);
setValid(true);
}
else{
setErrorMessage(Messages.CVSSSH2PreferencePage_143);
setValid(false);
}
mac_up.setEnabled(preferedMACMethodTable.getSelectionIndex()>0);
mac_down
.setEnabled(preferedMACMethodTable.getSelectionIndex()<preferedMACMethodTable
.getItemCount()-1);
}
});
mac_up.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
int selectedIndex=preferedMACMethodTable.getSelectionIndex();
if(selectedIndex == 1){ //this is the last possible swap
mac_up.setEnabled(false);
}
mac_down.setEnabled(true);
TableItem sourceItem = preferedMACMethodTable.getItem(selectedIndex);
TableItem targetItem = preferedMACMethodTable.getItem(selectedIndex-1);
//switch text
String stemp = targetItem.getText();
targetItem.setText(sourceItem.getText());
sourceItem.setText(stemp);
//switch selection
boolean btemp = targetItem.getChecked();
targetItem.setChecked(sourceItem.getChecked());
sourceItem.setChecked(btemp);
preferedMACMethodTable.setSelection(targetItem);
}
});
mac_down.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
int selectedIndex=preferedMACMethodTable.getSelectionIndex();
if(selectedIndex == preferedMACMethodTable.getItemCount()-2){ //this is the last possible swap
mac_down.setEnabled(false);
}
mac_up.setEnabled(true);
TableItem sourceItem = preferedMACMethodTable.getItem(selectedIndex);
TableItem targetItem = preferedMACMethodTable.getItem(selectedIndex+1);
//switch text
String stemp = targetItem.getText();
targetItem.setText(sourceItem.getText());
sourceItem.setText(stemp);
//switch selection
boolean btemp = targetItem.getChecked();
targetItem.setChecked(sourceItem.getChecked());
sourceItem.setChecked(btemp);
preferedMACMethodTable.setSelection(targetItem);
}
});
return root;
}
private Control createPreferredSSHAgentPage(Composite parent){
Composite root = new Composite(parent, SWT.NONE);
GridLayout layout=new GridLayout();
layout.marginHeight=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing=convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing=convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
layout.numColumns = 2;
root.setLayout(layout);
Label label=new Label(root, SWT.NONE);
GridData textLayoutData=new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false);
textLayoutData.horizontalSpan = 2;
label.setLayoutData(textLayoutData);
label.setText(Messages.CVSSSH2PreferencePage_147);
preferedSSHAgentTable=new Table(root, SWT.CHECK | SWT.BORDER);
GridData layoutData=new GridData(SWT.FILL, SWT.BEGINNING, true, true);
layoutData.verticalSpan = 3;
preferedSSHAgentTable.setLayoutData(layoutData);
layoutData.minimumHeight = 150;
layoutData.minimumWidth = 200;
populateSSHAgents();
return root;
}
private void populateSSHAgents(){
preferedSSHAgentTable.removeAll();
String[] methods = Utils.getAvailableSSHAgents().split(","); //$NON-NLS-1$
String[] selected = Utils.getSelectedSSHAgent().split(","); //$NON-NLS-1$
for(int i=0; i<methods.length; i++){
if(methods[i].length()==0)
continue;
TableItem tableItem= new TableItem(preferedSSHAgentTable, SWT.NONE);
tableItem.setText(0, methods[i]);
for(int j=0; j<selected.length; j++){
if(selected[j].equals(methods[i])){
tableItem.setChecked(true);
break;
}
}
}
}
private void populateMACMethods(){
preferedMACMethodTable.removeAll();
String[] methods = Utils.getEnabledPreferredMACMethods().split(","); //$NON-NLS-1$
Set smethods = new HashSet(Arrays.asList(methods));
String[] order = Utils.getMACMethodsOrder().split(","); //$NON-NLS-1$
for(int i=0; i<order.length; i++){
TableItem tableItem= new TableItem(preferedMACMethodTable, SWT.NONE);
tableItem.setText(0, order[i]);
if(smethods.contains(order[i])){
tableItem.setChecked(true);
}
}
}
void handleSelection(){
boolean empty=viewer.getSelection().isEmpty();
removeHostKeyButton.setEnabled(!empty);
}
void removeHostKey(){
IStructuredSelection selection=(IStructuredSelection)viewer.getSelection();
HostKeyRepository hkr=getJSch().getHostKeyRepository();
for(Iterator iterator=selection.iterator(); iterator.hasNext();){
HostKey hostkey=(HostKey)iterator.next();
hkr.remove(hostkey.getHost(), hostkey.getType());
viewer.remove(hostkey);
}
}
void export_via_sftp(String user, String host, int port, byte[] pkey) throws JSchException{
try{
int timeout = 60000;
IJSchService service = JSchUIPlugin.getPlugin().getJSchService();
if (service == null) {
MessageDialog.openInformation(getShell(), Messages.PreferencePage_0, Messages.PreferencePage_1);
return;
}
IJSchLocation location=service.getLocation(user, host, port);
// We hope that prompts for jsch are given by IJSchService, so "null" should be passed.
Session session = service.createSession(location, null);
session.setTimeout(timeout);
try {
service.connect(session, timeout, new NullProgressMonitor());
if(session.getServerVersion().indexOf("OpenSSH")==-1){ //$NON-NLS-1$
setErrorMessage(Messages.CVSSSH2PreferencePage_110);
return;
}
Channel channel=session.openChannel("sftp"); //$NON-NLS-1$
channel.connect();
ChannelSftp c=(ChannelSftp)channel;
SftpATTRS attr=null;
try{
attr=c.stat(".ssh");} //$NON-NLS-1$
catch(SftpException ee){
// Ignore
}
if(attr==null){
try{
c.mkdir(".ssh");} //$NON-NLS-1$
catch(SftpException ee){
setErrorMessage(ee.getMessage());
return;
}
}
try{
c.cd(".ssh");} //$NON-NLS-1$
catch(SftpException ee){
setErrorMessage(ee.getMessage());
return;
}
try{
ByteArrayInputStream bis=new ByteArrayInputStream(pkey);
c.put(bis, "authorized_keys", null, ChannelSftp.APPEND); //$NON-NLS-1$
bis.close();
checkPermission(c, "authorized_keys"); //$NON-NLS-1$
checkPermission(c, "."); // .ssh //$NON-NLS-1$
c.cd(".."); //$NON-NLS-1$
checkPermission(c, "."); // home directory //$NON-NLS-1$
}
catch(SftpException ee){
// setErrorMessage(debug+ee.message);
}
MessageDialog.openInformation(getShell(),
Messages.CVSSSH2PreferencePage_information,
NLS.bind(Messages.CVSSSH2PreferencePage_109, (user
+"@"+host+(port==22 ? "" : ":"+port)+":~/.ssh/authorized_keys"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
c.quit();
c.disconnect();
} finally {
session.disconnect();
}
} catch(IOException eee){
setErrorMessage(eee.toString());
}
}
private void checkPermission(ChannelSftp c, String path) throws SftpException{
SftpATTRS attr=c.stat(path);
int permissions=attr.getPermissions();
if((permissions&00022)!=0){
permissions&=~00022;
c.chmod(permissions, path);
}
}
void updateControls(){
boolean enable=(kpair!=null);
publicKeylabel.setEnabled(enable);
publicKeyText.setEnabled(enable);
keyFingerPrintLabel.setEnabled(enable);
keyFingerPrintText.setEnabled(enable);
keyCommentLabel.setEnabled(enable);
keyCommentText.setEnabled(enable);
keyPassphrase1Label.setEnabled(enable);
keyPassphrase1Text.setEnabled(enable);
keyPassphrase2Label.setEnabled(enable);
keyPassphrase2Text.setEnabled(enable);
keyExport.setEnabled(enable);
saveKeyPair.setEnabled(enable);
populateAuthMethods();
populateKeyExchangeMethods();
populateMACMethods();
up.setEnabled(false);
down.setEnabled(false);
kex_up.setEnabled(false);
kex_down.setEnabled(false);
mac_up.setEnabled(false);
mac_down.setEnabled(false);
}
public void init(IWorkbench workbench){
// super.init(workbench);
// initControls();
}
public void initialize(){
initControls();
}
private void initControls(){
Preferences preferences=JSchCorePlugin.getPlugin().getPluginPreferences();
ssh2HomeText.setText(preferences
.getString(org.eclipse.jsch.internal.core.IConstants.KEY_SSH2HOME));
privateKeyText.setText(preferences
.getString(org.eclipse.jsch.internal.core.IConstants.KEY_PRIVATEKEY));
updateControls();
}
public boolean performOk(){
boolean result=super.performOk();
storeAuthenticationMethodSettings();
storeSSHAgentSettings();
storeKeyExchangeMethodSettings();
storeMACMethodSettings();
if(result){
setErrorMessage(null);
String home=ssh2HomeText.getText();
File _home=new File(home);
if(!_home.exists()){
if(MessageDialog.openQuestion(getShell(),
Messages.CVSSSH2PreferencePage_question, NLS.bind(
Messages.CVSSSH2PreferencePage_99, new String[] {home}))){
if(!(_home.mkdirs())){
setErrorMessage(Messages.CVSSSH2PreferencePage_100+home);
return false;
}
}
}
Preferences preferences=JSchCorePlugin.getPlugin().getPluginPreferences();
preferences.setValue(
org.eclipse.jsch.internal.core.IConstants.KEY_SSH2HOME, home);
preferences.setValue(
org.eclipse.jsch.internal.core.IConstants.KEY_PRIVATEKEY,
privateKeyText.getText());
}
JSchCorePlugin.getPlugin().setNeedToLoadKnownHosts(true);
JSchCorePlugin.getPlugin().setNeedToLoadKeys(true);
JSchCorePlugin.getPlugin().setIdentityRepository();
JSchCorePlugin.getPlugin().savePluginPreferences();
return result;
}
private void storeAuthenticationMethodSettings(){
String selected = null;
String order = null;
for(int i = 0; i < preferedAuthMethodTable.getItemCount(); i++){
TableItem item=preferedAuthMethodTable.getItem(i);
if(item.getChecked()){
if(selected==null){
selected=item.getText();
}
else{
selected+=","+item.getText(); //$NON-NLS-1$
}
}
if(order == null){
order = item.getText();
} else {
order += "," + item.getText(); //$NON-NLS-1$
}
}
Utils.setEnabledPreferredAuthMethods(selected, order);
}
private void storeSSHAgentSettings(){
String selected = ""; //$NON-NLS-1$
for(int i = 0; i < preferedSSHAgentTable.getItemCount(); i++){
TableItem item=preferedSSHAgentTable.getItem(i);
if(item.getChecked()){
if(selected.length()==0){
selected=item.getText();
}
else{
selected+=","+item.getText(); //$NON-NLS-1$
}
}
}
Utils.setSelectedSSHAgents(selected);
}
private void storeKeyExchangeMethodSettings(){
String selected = null;
String order = null;
for(int i = 0; i < preferedKeyExchangeMethodTable.getItemCount(); i++){
TableItem item=preferedKeyExchangeMethodTable.getItem(i);
if(item.getChecked()){
if(selected==null){
selected=item.getText();
}
else{
selected+=","+item.getText(); //$NON-NLS-1$
}
}
if(order == null){
order = item.getText();
} else {
order += "," + item.getText(); //$NON-NLS-1$
}
}
Utils.setEnabledPreferredKEXMethods(selected, order);
}
private void storeMACMethodSettings(){
String selected = null;
String order = null;
for(int i = 0; i < preferedMACMethodTable.getItemCount(); i++){
TableItem item=preferedMACMethodTable.getItem(i);
if(item.getChecked()){
if(selected==null){
selected=item.getText();
}
else{
selected+=","+item.getText(); //$NON-NLS-1$
}
}
if(order == null){
order = item.getText();
} else {
order += "," + item.getText(); //$NON-NLS-1$
}
}
Utils.setEnabledPreferredMACMethods(selected, order);
}
public void performApply(){
performOk();
}
protected void performDefaults(){
super.performDefaults();
Utils.setEnabledPreferredAuthMethods(Utils.getDefaultAuthMethods(), Utils
.getDefaultAuthMethods());
Preferences preferences=JSchCorePlugin.getPlugin().getPluginPreferences();
ssh2HomeText
.setText(preferences
.getDefaultString(org.eclipse.jsch.internal.core.IConstants.KEY_SSH2HOME));
privateKeyText
.setText(preferences
.getDefaultString(org.eclipse.jsch.internal.core.IConstants.KEY_PRIVATEKEY));
updateControls();
}
protected void createSpacer(Composite composite, int columnSpan){
Label label=new Label(composite, SWT.NONE);
GridData gd=new GridData();
gd.horizontalSpan=columnSpan;
label.setLayoutData(gd);
}
JSch getJSch(){
return JSchCorePlugin.getPlugin().getJSch();
}
class PassphrasePrompt implements Runnable{
private String message;
private String passphrase;
PassphrasePrompt(String message){
this.message=message;
}
public void run(){
Display display=Display.getCurrent();
Shell shell=new Shell(display);
PassphraseDialog dialog=new PassphraseDialog(shell, message);
dialog.open();
shell.dispose();
passphrase=dialog.getPassphrase();
}
public String getPassphrase(){
return passphrase;
}
}
}