diff options
author | Atsuhiko Yamanaka | 2014-11-17 13:45:27 +0000 |
---|---|---|
committer | Szymon Ptaszkiewicz | 2014-12-02 14:15:42 +0000 |
commit | 7066a7209a9d2f386d2c3dd51d30f60cf5964a2e (patch) | |
tree | 871c59878836b5e3aa5bfce18947cac43c9b716c | |
parent | f1af3fa87ff7df9cfeb5ba71350044aa308df465 (diff) | |
download | eclipse.platform.team-7066a7209a9d2f386d2c3dd51d30f60cf5964a2e.tar.gz eclipse.platform.team-7066a7209a9d2f386d2c3dd51d30f60cf5964a2e.tar.xz eclipse.platform.team-7066a7209a9d2f386d2c3dd51d30f60cf5964a2e.zip |
Bug 179924 - [SSH2] SSH connection should respect ssh-agent in publickeyI20141216-0800I20141210-2000I20141210-0800I20141209-2000I20141209-1115I20141209-0800I20141208-2000I20141208-0800I20141207-2000
authentication
* The extension point identityrepository is added.
The connectors to ssh-agent and pageant will implement
IIdentityRepositoryFactory, and those implementations will be
given through this entry point.
* A preference page is added to manage connectors.
Connectors will provide an implementation of
IIdentityRespositoryFactory, which allows to communicate with agents
like ssh-agent and pageant.
Change-Id: Id1a8691ecb1202e204705c70831d4d18133f5979
13 files changed, 342 insertions, 17 deletions
diff --git a/bundles/org.eclipse.jsch.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jsch.core/META-INF/MANIFEST.MF index f63a52fe9..fec118872 100644 --- a/bundles/org.eclipse.jsch.core/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.jsch.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jsch.core;singleton:=true -Bundle-Version: 1.1.500.qualifier +Bundle-Version: 1.2.0.qualifier Bundle-Activator: org.eclipse.jsch.internal.core.JSchCorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/bundles/org.eclipse.jsch.core/plugin.xml b/bundles/org.eclipse.jsch.core/plugin.xml index 0bce2cd3c..2aff6e8bf 100644 --- a/bundles/org.eclipse.jsch.core/plugin.xml +++ b/bundles/org.eclipse.jsch.core/plugin.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.2"?> <!-- - Copyright (c) 2007, 2011 IBM Corporation and others. + Copyright (c) 2007, 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 @@ -13,6 +13,7 @@ <plugin> <extension-point id="authenticator" name="%Authenticator" schema="schema/authenticator.exsd" /> + <extension-point id="identityrepository" name="identityrepository" schema="schema/identity_repository.exsd"/> <extension point="org.eclipse.core.runtime.preferences"> <initializer diff --git a/bundles/org.eclipse.jsch.core/pom.xml b/bundles/org.eclipse.jsch.core/pom.xml index f0ab4dbcd..ef2c5412f 100644 --- a/bundles/org.eclipse.jsch.core/pom.xml +++ b/bundles/org.eclipse.jsch.core/pom.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2012, 2013 Eclipse Foundation and others. + Copyright (c) 2012, 2014 Eclipse Foundation and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Distribution License v1.0 which accompanies this distribution, and is available at @@ -19,6 +19,6 @@ </parent> <groupId>org.eclipse.jsch</groupId> <artifactId>org.eclipse.jsch.core</artifactId> - <version>1.1.500-SNAPSHOT</version> + <version>1.2.0-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/bundles/org.eclipse.jsch.core/schema/identity_repository.exsd b/bundles/org.eclipse.jsch.core/schema/identity_repository.exsd new file mode 100644 index 000000000..4f9a9b8dd --- /dev/null +++ b/bundles/org.eclipse.jsch.core/schema/identity_repository.exsd @@ -0,0 +1,114 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.jsch.core" xmlns="http://www.w3.org/2001/XMLSchema"> +<annotation> + <appInfo> + <meta.schema plugin="org.eclipse.jsch.core" id="identityrepository" name="identityrepository"/> + </appInfo> + <documentation> + This extension point allows a plug-in to register an identity repository factory. +This factory is expected to create an instance of <samp>com.jcraft.jsch.IdentityRepository</samp>, which abstracts communications with ssh-agent and Pageant. This extension point must implement the abstract class <samp>org.eclipse.jsch.core.AbstractIdentityRepositoryFactory</samp>. + </documentation> + </annotation> + + <element name="extension"> + <annotation> + <appInfo> + <meta.element /> + </appInfo> + </annotation> + <complexType> + <sequence> + <element ref="identityrepository"/> + </sequence> + <attribute name="point" type="string" use="required"> + <annotation> + <documentation> + a fully qualified identifier of the target extension point + </documentation> + </annotation> + </attribute> + </complexType> + </element> + + <element name="identityrepository"> + <complexType> + <sequence> + <element ref="run"/> + </sequence> + </complexType> + </element> + + <element name="run"> + <complexType> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + a fully qualified name of a class that implements <code>org.eclipse.jsch.core.AbstractIdentityRepositoryFactory</code> + </documentation> + <appInfo> + <meta.attribute kind="java" basedOn="org.eclipse.jsch.core.AbstractIdentityRepositoryFactory:"/> + </appInfo> + </annotation> + </attribute> + </complexType> + </element> + + <annotation> + <appInfo> + <meta.section type="since"/> + </appInfo> + <documentation> + 1.2 + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="examples"/> + </appInfo> + <documentation> + The following is an example of an identity repository factory for ssh-agent: +<p> +<pre> +<extension point = "org.eclipse.jsch.core.identityrepository"> + <identityrepository> + <run + class="com.jcraft.jsch.agentproxy.eclipse.sshagent.IdentityRepositoryFactory"> + </run> + </identityrepository> +</extension> +</pre> +</p> + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="apiinfo"/> + </appInfo> + <documentation> + The contributed class must implement <code>org.eclipse.jsch.core.AbstractIdentityRepositoryFactory</code>. + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="implementation"/> + </appInfo> + <documentation> + The Eclipse jsch-agent-proxy plugin defines identity repository factories. + </documentation> + </annotation> + + <annotation> + <appInfo> + <meta.section type="copyright"/> + </appInfo> + <documentation> + Copyright (c) 2014 IBM Corporation and others.<br> +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 <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> + </documentation> + </annotation> + +</schema> diff --git a/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/core/AbstractIdentityRepositoryFactory.java b/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/core/AbstractIdentityRepositoryFactory.java new file mode 100644 index 000000000..462773539 --- /dev/null +++ b/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/core/AbstractIdentityRepositoryFactory.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2014 JCraft,Inc. 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: + * JCraft,Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.jsch.core; + +import com.jcraft.jsch.IdentityRepository; + +/** + * This class abstracts the communications with the identity repository, + * and will be mainly used for ssh-agent. + * @since 1.2 + */ +public abstract class AbstractIdentityRepositoryFactory{ + /** + * This method will return an instance of + * <code>com.jcraft.com.jsch.IdentityRepository</code>. The ssh client will + * retrieve public keys from it, ask for signing data with a private key + * included in it. + * + * @return an instance of <code>IdentityRepository</code> + */ + public abstract IdentityRepository create(); +} diff --git a/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/IConstants.java b/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/IConstants.java index 872c79b31..964920ae0 100644 --- a/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/IConstants.java +++ b/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/IConstants.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2013 IBM Corporation and others. + * 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 @@ -55,6 +55,8 @@ public interface IConstants{ public static final String PREF_PREFERRED_AUTHENTICATION_METHODS="CVSSSH2PreferencePage.PREF_AUTH_METHODS"; //$NON-NLS-1$ public static final String PREF_PREFERRED_AUTHENTICATION_METHODS_ORDER="CVSSSH2PreferencePage.PREF_AUTH_METHODS_ORDER"; //$NON-NLS-1$ + public static final String PREF_PREFERRED_SSHAGENT="CVSSSH2PreferencePage.PREF_SSHAGENT"; //$NON-NLS-1$ + public static final String PREF_PREFERRED_KEYEXCHANGE_METHODS="CVSSSH2PreferencePage.PREF_KEX_METHODS"; //$NON-NLS-1$ public static final String PREF_PREFERRED_KEYEXCHANGE_METHODS_ORDER="CVSSSH2PreferencePage.PREF_KEX_METHODS_ORDER"; //$NON-NLS-1$ diff --git a/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/JSchCorePlugin.java b/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/JSchCorePlugin.java index 92c22430f..df1427909 100644 --- a/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/JSchCorePlugin.java +++ b/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/JSchCorePlugin.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * 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 @@ -12,15 +12,18 @@ package org.eclipse.jsch.internal.core; import java.util.Hashtable; +import java.util.ArrayList; import org.eclipse.core.net.proxy.IProxyService; import org.eclipse.core.runtime.*; +import org.eclipse.jsch.core.AbstractIdentityRepositoryFactory; import org.eclipse.jsch.core.IJSchService; import org.eclipse.osgi.util.NLS; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import org.osgi.util.tracker.ServiceTracker; +import com.jcraft.jsch.IdentityRepository; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; @@ -39,6 +42,7 @@ public class JSchCorePlugin extends Plugin{ private String current_pkeys=""; //$NON-NLS-1$ public static final String PT_AUTHENTICATOR="authenticator"; //$NON-NLS-1$ + public static final String PT_IDENTITYREPOSITORY="identityrepository"; //$NON-NLS-1$ private static JSchCorePlugin plugin; private ServiceTracker tracker; @@ -100,11 +104,86 @@ public class JSchCorePlugin extends Plugin{ } public synchronized JSch getJSch(){ - if(jsch==null) + if(jsch==null){ jsch=new JSch(); + setIdentityRepository(); + } return jsch; } + public synchronized void setIdentityRepository(){ + + IdentityRepository[] repositories = getPluggedInIdentityRepositries(); + String[] selected = Utils.getSelectedSSHAgent().split(","); //$NON-NLS-1$ + IdentityRepository irepo = null; + + for(int i=0; i<selected.length; i++){ + for(int j=0; j<repositories.length; j++){ + IdentityRepository _irepo = repositories[j]; + if(selected[i].equals(_irepo.getName()) && + _irepo.getStatus()==IdentityRepository.RUNNING){ + irepo = _irepo; + break; + } + } + if(irepo!=null) + break; + } + + if(irepo!=null){ + jsch.setIdentityRepository(irepo); + } + else{ + // set the internal default IdentityRepository + jsch.setIdentityRepository(null); + } + + } + + public IdentityRepository[] getPluggedInIdentityRepositries(){ + + IExtension[] extensions=Platform.getExtensionRegistry().getExtensionPoint( + JSchCorePlugin.ID, JSchCorePlugin.PT_IDENTITYREPOSITORY).getExtensions(); + + if(extensions.length==0) + return new IdentityRepository[0]; + + ArrayList tmp = new ArrayList(); + for(int i=0; i<extensions.length; i++){ + IExtension extension=extensions[i]; + IConfigurationElement[] configs=extension.getConfigurationElements(); + if(configs.length==0){ + JSchCorePlugin + .log( + IStatus.ERROR, + NLS + .bind( + "IdentityRepository {0} is missing required fields", (new Object[] {extension.getUniqueIdentifier()})), null);//$NON-NLS-1$ + continue; + } + try{ + IConfigurationElement config=configs[0]; + AbstractIdentityRepositoryFactory iirf = + (AbstractIdentityRepositoryFactory)config.createExecutableExtension("run");//$NON-NLS-1$ + tmp.add(iirf.create()); + } + catch(CoreException ex){ + JSchCorePlugin + .log( + IStatus.ERROR, + NLS + .bind( + "Unable to instantiate identity repository {0}", (new Object[] {extension.getUniqueIdentifier()})), ex);//$NON-NLS-1$ + } + } + + IdentityRepository[] repositories = new IdentityRepository[tmp.size()]; + for(int i=0; i<tmp.size(); i++){ + repositories[i]=(IdentityRepository)tmp.get(i); + } + return repositories; + } + public void loadKnownHosts(){ Preferences preferences=JSchCorePlugin.getPlugin().getPluginPreferences(); String ssh_home=preferences.getString(IConstants.KEY_SSH2HOME); diff --git a/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/Utils.java b/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/Utils.java index 44a714399..e822a4606 100644 --- a/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/Utils.java +++ b/bundles/org.eclipse.jsch.core/src/org/eclipse/jsch/internal/core/Utils.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2013 IBM Corporation and others. + * Copyright (c) 2007, 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 @@ -21,6 +21,7 @@ import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.core.runtime.preferences.InstanceScope; import org.osgi.service.prefs.BackingStoreException; +import com.jcraft.jsch.IdentityRepository; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Proxy; @@ -28,6 +29,7 @@ import com.jcraft.jsch.ProxyHTTP; import com.jcraft.jsch.ProxySOCKS5; import com.jcraft.jsch.Session; + /** * * @since 1.0 @@ -255,6 +257,18 @@ public class Utils{ IConstants.PREF_PREFERRED_AUTHENTICATION_METHODS, getDefaultAuthMethods(), null); } + public static String getAvailableSSHAgents(){ + IdentityRepository[] repositories = JSchCorePlugin.getPlugin().getPluggedInIdentityRepositries(); + String s=""; //$NON-NLS-1$ + for(int i=0; i<repositories.length; i++){ + IdentityRepository c = repositories[i]; + s+=c.getName(); + if(i+1<repositories.length) + s+=","; //$NON-NLS-1$ + } + return s; + } + public static String getMethodsOrder(){ IPreferencesService service = Platform.getPreferencesService(); return service.getString(JSchCorePlugin.ID, @@ -267,7 +281,19 @@ public class Utils{ IConstants.PREF_PREFERRED_AUTHENTICATION_METHODS, methods); service.getRootNode().node(InstanceScope.SCOPE).node(JSchCorePlugin.ID).put( IConstants.PREF_PREFERRED_AUTHENTICATION_METHODS_ORDER, order);} - + + public static String getSelectedSSHAgent(){ + IPreferencesService service = Platform.getPreferencesService(); + return service.getString(JSchCorePlugin.ID, + IConstants.PREF_PREFERRED_SSHAGENT, "", null); //$NON-NLS-1$ + } + + public static void setSelectedSSHAgents(String methods){ + IPreferencesService service=Platform.getPreferencesService(); + service.getRootNode().node(InstanceScope.SCOPE).node(JSchCorePlugin.ID).put( + IConstants.PREF_PREFERRED_SSHAGENT, methods); + } + public static String getEnabledPreferredKEXMethods(){ IPreferencesService service = Platform.getPreferencesService(); return service.getString(JSchCorePlugin.ID, diff --git a/bundles/org.eclipse.jsch.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.jsch.ui/META-INF/MANIFEST.MF index 2ad210124..7b980d4b5 100644 --- a/bundles/org.eclipse.jsch.ui/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.jsch.ui/META-INF/MANIFEST.MF @@ -2,13 +2,13 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jsch.ui;singleton:=true -Bundle-Version: 1.1.500.qualifier +Bundle-Version: 1.2.0.qualifier Bundle-Activator: org.eclipse.jsch.internal.ui.JSchUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)", org.eclipse.core.runtime;bundle-version="[3.3.0,4.0.0)", - org.eclipse.jsch.core;bundle-version="[1.0.0,2.0.0)", + org.eclipse.jsch.core;bundle-version="[1.2.0,2.0.0)", com.jcraft.jsch;bundle-version="[0.1.50,1.0.0)" Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: J2SE-1.4 diff --git a/bundles/org.eclipse.jsch.ui/pom.xml b/bundles/org.eclipse.jsch.ui/pom.xml index d5ed754da..e31169419 100644 --- a/bundles/org.eclipse.jsch.ui/pom.xml +++ b/bundles/org.eclipse.jsch.ui/pom.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2012, 2013 Eclipse Foundation and others. + Copyright (c) 2012, 2014 Eclipse Foundation and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Distribution License v1.0 which accompanies this distribution, and is available at @@ -19,6 +19,6 @@ </parent> <groupId>org.eclipse.jsch</groupId> <artifactId>org.eclipse.jsch.ui</artifactId> - <version>1.1.500-SNAPSHOT</version> + <version>1.2.0-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/Messages.java b/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/Messages.java index cfc1a61e5..583ab4293 100644 --- a/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/Messages.java +++ b/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/Messages.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2013 IBM Corporation and others. + * 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 @@ -94,6 +94,8 @@ public class Messages extends NLS{ public static String CVSSSH2PreferencePage_143; public static String CVSSSH2PreferencePage_144; public static String CVSSSH2PreferencePage_145; + public static String CVSSSH2PreferencePage_146; + public static String CVSSSH2PreferencePage_147; public static String KeyboardInteractiveDialog_0; public static String KeyboardInteractiveDialog_1; public static String KeyboardInteractiveDialog_2; diff --git a/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/messages.properties b/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/messages.properties index d228d5665..7d03e072a 100644 --- a/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/messages.properties +++ b/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/messages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2000, 2013 IBM Corporation and others. +# 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 @@ -84,6 +84,8 @@ CVSSSH2PreferencePage_142=You must select at least one key exchange method. CVSSSH2PreferencePage_143=You must select at least one MAC method. CVSSSH2PreferencePage_144=Key Exchange &Methods CVSSSH2PreferencePage_145=MA&C Methods +CVSSSH2PreferencePage_146=SSH Agent +CVSSSH2PreferencePage_147=Select preferred SSH Agent UserInfoPrompter_0=SSH2 Message UserInfoPrompter_1=SSH2 Message KeyboardInteractiveDialog_0=Keyboard Interactive authentication for {0}: {1} diff --git a/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/preference/PreferencePage.java b/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/preference/PreferencePage.java index 1945516f2..2c8359675 100644 --- a/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/preference/PreferencePage.java +++ b/bundles/org.eclipse.jsch.ui/src/org/eclipse/jsch/internal/ui/preference/PreferencePage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2013 IBM Corporation and others. + * 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 @@ -155,6 +155,10 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage 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); @@ -815,6 +819,7 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage private Button removeHostKeyButton; Table preferedAuthMethodTable; + Table preferedSSHAgentTable; Table preferedKeyExchangeMethodTable; Table preferedMACMethodTable; @@ -1313,6 +1318,51 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage 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$ @@ -1328,7 +1378,7 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage } } } - + void handleSelection(){ boolean empty=viewer.getSelection().isEmpty(); removeHostKeyButton.setEnabled(!empty); @@ -1473,8 +1523,10 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage public boolean performOk(){ boolean result=super.performOk(); storeAuthenticationMethodSettings(); + storeSSHAgentSettings(); storeKeyExchangeMethodSettings(); storeMACMethodSettings(); + if(result){ setErrorMessage(null); String home=ssh2HomeText.getText(); @@ -1499,6 +1551,7 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage } JSchCorePlugin.getPlugin().setNeedToLoadKnownHosts(true); JSchCorePlugin.getPlugin().setNeedToLoadKeys(true); + JSchCorePlugin.getPlugin().setIdentityRepository(); JSchCorePlugin.getPlugin().savePluginPreferences(); return result; } @@ -1525,6 +1578,22 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage 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; |