Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java2
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ModuleExpansionHandler.java2
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties18
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java4
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFile.java4
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFolder.java4
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java10
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java7
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java28
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java2
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java4
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java2
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FolderSyncInfo.java3
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ResourceSyncInfo.java1
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/RemoteFolderTreeBuilder.java10
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ResourceDeltaVisitor.java2
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ServerDateFormat.java8
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/StringMatcher.java776
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileUtil.java10
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java9
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Cipher.java38
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Client.java44
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Misc.java898
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Policy.java50
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHMethod.java52
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPlugin.java2
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java4
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/ServerPacket.java316
-rw-r--r--bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/messages.properties (renamed from bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPluginResources.properties)2
29 files changed, 1189 insertions, 1123 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java
index fb1d2132e..9d8ffb4c7 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java
@@ -18,7 +18,7 @@ public class ExpandModules extends Command {
* @see Command#getCommandId()
*/
protected String getCommandId() {
- return "expand-modules";
+ return "expand-modules"; //$NON-NLS-1$
}
/*
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ModuleExpansionHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ModuleExpansionHandler.java
index 2a0aefdee..657377c44 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ModuleExpansionHandler.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ModuleExpansionHandler.java
@@ -14,7 +14,7 @@ public class ModuleExpansionHandler extends ResponseHandler {
* @see ResponseHandler#getResponseID()
*/
public String getResponseID() {
- return "Module-expansion";
+ return "Module-expansion";//$NON-NLS-1$
}
/*
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties
index aea7aa4a5..e566369b9 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties
@@ -77,10 +77,17 @@ ResponseDispatcher.receiving=Receiving reponse
FileProperties.invalidEntryLine=Invalid entry line: {0}
+LocalResource.invalidResourceClass=Two different implementations of ICVSResource used
+LocalFile.invalidDateFormat=Invalid date format received: {0}
+LocalFile.moveFailed=Move from {0} to {1} failed
+LocalFolder.invalidChild=Invalid resource {0}
+
+RemoteResource.invalidResourceClass=Two different implementations of ICVSResource used
+RemoteResource.invalidOperation=Invalid operation performed on remote resource
RemoteFolder.errorFetchingRevisions=Error fetching file revision numbers
RemoteFolder.invalidChild=Resource {0} is not a child of folder {1}
-RemoteManagedResource.invalidOperation=Invalid operation performed on remote resource
-RemoteManagedFolder.invalidChild=Invalid folder {0} received during remote operation
+RemoteFolder.invalidChild=Invalid folder {0} received during remote operation
+RemoteFolder.errorFetchingRevisions=Error fetching file revisions
RemoteFile.noContentsReceived=No contents received from server for {0}
Session.readError=Read finished prematurely
@@ -166,4 +173,9 @@ FileModificationValidator.isReadOnly=File is Read Only.
EXTServerConnection.invalidPort=A port cannot be specified for the ext connection method.
EXTServerConnection.varsNotSet=Cannot run external ext program because CVS_RSH and CVS_SERVER variables are not initialized.
-EXTServerConnection.ioError=Error starting external connection program: {0}. Ensure that the path is correct and that you can connect manually using this program. \ No newline at end of file
+EXTServerConnection.ioError=Error starting external connection program: {0}. Ensure that the path is correct and that you can connect manually using this program.
+
+CVSRemoteSyncElement.alreadyManaged=Error making a remote folder in sync with the server. The local folder is already managed.
+Util.Internal_error,_resource_does_not_start_with_root_3=Internal error, resource does not start with root
+
+
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java
index fb12638b9..2601ebf00 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java
@@ -159,7 +159,7 @@ public class CVSRemoteSyncElement extends RemoteSyncElement {
if (local.exists()) {
// We could have an incoming change or deletion
if (remote == null) {
- info = new ResourceSyncInfo(local.getName(), ResourceSyncInfo.ADDED_REVISION, ResourceSyncInfo.DUMMY_TIMESTAMP, CVSProvider.isText(local.getName())?"":"-kb", local.getParent().getFolderSyncInfo().getTag(), null);
+ info = new ResourceSyncInfo(local.getName(), ResourceSyncInfo.ADDED_REVISION, ResourceSyncInfo.DUMMY_TIMESTAMP, CVSProvider.isText(local.getName())?ResourceSyncInfo.USE_SERVER_MODE:ResourceSyncInfo.BINARY_TAG, local.getParent().getFolderSyncInfo().getTag(), null);
revision = info.getRevision();
} else {
info = remote.getSyncInfo();
@@ -249,7 +249,7 @@ public class CVSRemoteSyncElement extends RemoteSyncElement {
} else {
// If the folder already has CVS info, check that the remote and local match
if(local.isManaged() && local.isCVSFolder() && ! remote.getFolderSyncInfo().equals(local.getFolderSyncInfo())) {
- throw new CVSException(IStatus.ERROR, 0, "Error making a remote folder in sync with the server. The local folder is already managed.");
+ throw new CVSException(IStatus.ERROR, 0, Policy.bind("CVSRemoteSyncElement.alreadyManaged"));//$NON-NLS-1$
}
}
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFile.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFile.java
index e6c3d2b69..2c9bca629 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFile.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFile.java
@@ -77,7 +77,7 @@ public class LocalFile extends LocalResource implements ICVSFile {
EntryFileDateFormat timestamp = new EntryFileDateFormat();
millSec = timestamp.toDate(date).getTime();
} catch (ParseException e) {
- throw new CVSException(0,0,"Format of the Date for a TimeStamp not parseable",e);
+ throw new CVSException(Policy.bind("LocalFile.invalidDateFormat", date), e); //$NON-NLS-1$
}
}
ioResource.setLastModified(millSec);
@@ -135,7 +135,7 @@ public class LocalFile extends LocalResource implements ICVSFile {
boolean success = ioResource.renameTo(file.getFile());
if (!success) {
- throw new CVSException("Move from " + ioResource + " to " + file + " was not possible");
+ throw new CVSException(Policy.bind("LocalFile.moveFailed", ioResource.toString(), file.toString())); //$NON-NLS-1$
}
}
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFolder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFolder.java
index 881150691..4c689b834 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFolder.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFolder.java
@@ -99,7 +99,7 @@ public class LocalFolder extends LocalResource implements ICVSFolder {
* @see ICVSFolder#createFolder(String)
*/
public ICVSFolder getFolder(String name) throws CVSException {
- if ((".".equals(name)) || (("." + SEPARATOR).equals(name)))
+ if ((CURRENT_LOCAL_FOLDER.equals(name)) || ((CURRENT_LOCAL_FOLDER + SEPARATOR).equals(name)))
return this;
return new LocalFolder(new File(ioResource, name));
}
@@ -125,7 +125,7 @@ public class LocalFolder extends LocalResource implements ICVSFolder {
LocalFile localFile = new LocalFile(child);
ResourceSyncInfo info = localFile.getSyncInfo();
if (info == null)
- throw new CVSFileNotFoundException(Policy.bind("LocalFolder.invalidChild", child.getAbsolutePath()));
+ throw new CVSFileNotFoundException(Policy.bind("LocalFolder.invalidChild", child.getAbsolutePath())); //$NON-NLS-1$
isDirectory = info.isDirectory();
}
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java
index 0fbfa74ef..e3b2a06b6 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java
@@ -10,8 +10,9 @@ import java.io.File;
import org.eclipse.team.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.core.IIgnoreInfo;
import org.eclipse.team.core.TeamPlugin;
-import org.eclipse.team.core.internal.IgnoreInfo;
import org.eclipse.team.internal.ccvs.core.CVSException;
+import org.eclipse.team.internal.ccvs.core.Policy;
+import org.eclipse.team.internal.ccvs.core.client.Session;
import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
import org.eclipse.team.internal.ccvs.core.util.Assert;
import org.eclipse.team.internal.ccvs.core.util.FileNameMatcher;
@@ -30,7 +31,8 @@ public abstract class LocalResource implements ICVSResource {
// The seperator that must be used when creating CVS resource paths. Never use
// the platform default seperator since it is not compatible with CVS resources.
- protected static final String SEPARATOR = "/";
+ protected static final String SEPARATOR = Session.SERVER_SEPARATOR;
+ protected static final String CURRENT_LOCAL_FOLDER = Session.CURRENT_LOCAL_FOLDER;
/**
* The local file represented by this handle.
@@ -60,7 +62,7 @@ public abstract class LocalResource implements ICVSResource {
try {
rootFolder = (LocalResource)root;
} catch (ClassCastException e) {
- throw new CVSException(0,0,"two different implementations of ICVSResource used",e);
+ throw new CVSException(Policy.bind("LocalResource.invalidResourceClass"),e); //$NON-NLS-1$
}
result = Util.getRelativePath(rootFolder.getPath(),getPath());
@@ -115,7 +117,7 @@ public abstract class LocalResource implements ICVSResource {
for (int i = 0; i < ignorePatterns.length; i++) {
IIgnoreInfo info = ignorePatterns[i];
if(info.getEnabled()) {
- matcher.register(info.getPattern(), "true");
+ matcher.register(info.getPattern(), "true"); //$NON-NLS-1$
}
}
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java
index 4876a00ba..8fea7a8a4 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java
@@ -121,12 +121,11 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile, ICVSFi
*/
// XXX do we need the first two constructors?
public RemoteFile(RemoteFolder parent, int workspaceSyncState, String name, CVSTag tag) {
- this(parent, workspaceSyncState, name, "0", tag);
+ this(parent, workspaceSyncState, name, ResourceSyncInfo.ADDED_REVISION, tag);
}
public RemoteFile(RemoteFolder parent, int workspaceSyncState, String name, String revision, CVSTag tag) {
- this(parent, workspaceSyncState, new ResourceSyncInfo(name, revision, "dummy", "", tag, "u=rw,g=rw,o=rw"));
- // A blank keyword mode will use the type provided by the server to transfer the file contents
+ this(parent, workspaceSyncState, new ResourceSyncInfo(name, revision, ResourceSyncInfo.DUMMY_TIMESTAMP, ResourceSyncInfo.USE_SERVER_MODE, tag, ResourceSyncInfo.DEFAULT_PERMISSIONS));
}
public RemoteFile(RemoteFolder parent, ResourceSyncInfo info) {
@@ -173,7 +172,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile, ICVSFi
}
}
if (contents == null)
- throw new CVSException(Policy.bind("RemoteFile.noContentsReceived", getRemoteLocation(null)));
+ throw new CVSException(Policy.bind("RemoteFile.noContentsReceived", getRemoteLocation(null))); //$NON-NLS-1$
return new ByteArrayInputStream(contents);
} catch(CVSException e) {
return null;
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java
index 47b99962a..a86058f4d 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java
@@ -54,8 +54,6 @@ import org.eclipse.team.internal.ccvs.core.util.Util;
*
*/
public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, ICVSFolder {
-
- public static final String VIRTUAL_DIRECTORY = "CVSROOT/Emptydir";
protected FolderSyncInfo folderInfo;
private ICVSRemoteResource[] children;
@@ -66,7 +64,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
*/
public RemoteFolder(RemoteFolder parent, ICVSRepositoryLocation repository, IPath repositoryRelativePath, CVSTag tag) {
this(parent,
- repositoryRelativePath.lastSegment() == null ? "" : repositoryRelativePath.lastSegment(),
+ repositoryRelativePath.lastSegment() == null ? "" : repositoryRelativePath.lastSegment(), //$NON-NLS-1$
repository,
repositoryRelativePath,
tag,
@@ -113,7 +111,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
}
if (count[0] != fileNames.length)
- throw new CVSException(Policy.bind("RemoteFolder.errorFetchingRevisions"));
+ throw new CVSException(Policy.bind("RemoteFolder.errorFetchingRevisions")); //$NON-NLS-1$
}
/**
@@ -250,7 +248,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
IStatus status = Command.UPDATE.execute(s,
new GlobalOption[] { Command.DO_NOT_CHANGE },
(LocalOption[])localOptions.toArray(new LocalOption[localOptions.size()]),
- new String[] { "." },
+ new String[] { Session.CURRENT_LOCAL_FOLDER },
new UpdateListener(listener),
monitor);
if (status.getCode() == CVSStatus.SERVER_ERROR) {
@@ -341,7 +339,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
ICVSResource child = getChild(name);
if (child.isFolder())
return (ICVSFolder)child;
- throw new CVSException(Policy.bind("RemoteFolder.invalidChild", new Object[] {name}));
+ throw new CVSException(Policy.bind("RemoteFolder.invalidChild", new Object[] {name})); //$NON-NLS-1$
}
/**
@@ -351,7 +349,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
ICVSResource child = getChild(name);
if (!child.isFolder())
return (ICVSFile)child;
- throw new CVSException(Policy.bind("RemoteFolder.invalidChild", new Object[] {name}));
+ throw new CVSException(Policy.bind("RemoteFolder.invalidChild", new Object[] {name})); //$NON-NLS-1$
}
@@ -374,13 +372,13 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
public String getRelativePath(ICVSFolder ancestor) throws CVSException {
if (ancestor == this)
- return ".";
+ return Session.CURRENT_LOCAL_FOLDER;
RemoteResource rootFolder;
try {
rootFolder = (RemoteResource)ancestor;
} catch (ClassCastException e) {
- throw new CVSException(0,0,"two different implementations of ICVSResource used",e);
+ throw new CVSException(Policy.bind("RemoteResource.invalidResourceClass"),e); //$NON-NLS-1$
}
return Util.getRelativePath(rootFolder.getLocalPath(), getLocalPath());
@@ -426,7 +424,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
return this;
ICVSRemoteResource[] children = getChildren();
if (children == null)
- throw new CVSException(Policy.bind("RemoteFolder.invalidChild", path, getName()));
+ throw new CVSException(Policy.bind("RemoteFolder.invalidChild", path, getName()));//$NON-NLS-1$
if (path.indexOf(Session.SERVER_SEPARATOR) == -1) {
for (int i=0;i<children.length;i++) {
if (children[i].getName().equals(path))
@@ -438,17 +436,17 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
return ((RemoteFolder)getChild(p.segment(0))).getChild(p.removeFirstSegments(1).toString());
} catch (CVSException e) {
// regenerate the exception to give as much info as possible
- throw new CVSException(Policy.bind("RemoteFolder.invalidChild", path, getName()));
+ throw new CVSException(Policy.bind("RemoteFolder.invalidChild", path, getName()));//$NON-NLS-1$
}
}
- throw new CVSException(Policy.bind("RemoteFolder.invalidChild", path, getName()));
+ throw new CVSException(Policy.bind("RemoteFolder.invalidChild", path, getName()));//$NON-NLS-1$
}
/**
* @see ICVSFolder#mkdir()
*/
public void mkdir() throws CVSException {
- throw new CVSException(Policy.bind("RemoteResource.invalidOperation"));
+ throw new CVSException(Policy.bind("RemoteResource.invalidOperation"));//$NON-NLS-1$
}
/**
@@ -482,7 +480,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
* @see ICVSFolder#acceptChildren(ICVSResourceVisitor)
*/
public void acceptChildren(ICVSResourceVisitor visitor) throws CVSException {
- throw new CVSException(Policy.bind("RemoteResource.invalidOperation"));
+ throw new CVSException(Policy.bind("RemoteResource.invalidOperation"));//$NON-NLS-1$
}
/*
@@ -538,7 +536,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC
public void setFolderSyncInfo(FolderSyncInfo folderInfo) throws CVSException {
this.folderInfo = folderInfo;
// XXX temporary to see if this ever occurs
- throw new CVSException(Policy.bind("RemoteResource.invalidOperation"));
+ throw new CVSException(Policy.bind("RemoteResource.invalidOperation"));//$NON-NLS-1$
}
/**
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java
index c7b4354e3..2bf59497e 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java
@@ -59,7 +59,7 @@ public class RemoteFolderTree extends RemoteFolder {
protected String getLocalPath() {
if (parent == null)
- return "";
+ return ""; //$NON-NLS-1$
return Util.appendPath(parent.getLocalPath(), getName());
}
}
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java
index 705b73fc4..ac14521cb 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java
@@ -33,8 +33,6 @@ import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
* @author
*/
public class RemoteModule extends RemoteFolder {
-
- public static final String VIRTUAL_DIRECTORY = "CVSROOT/Emptydir";
private String label;
private ICVSRemoteResource[] referencedModules;
@@ -222,7 +220,7 @@ public class RemoteModule extends RemoteFolder {
super(parent,
localName == null ? label : localName,
repository,
- repositoryRelativePath == null ? new Path(VIRTUAL_DIRECTORY) : repositoryRelativePath,
+ repositoryRelativePath == null ? new Path(FolderSyncInfo.VIRTUAL_DIRECTORY) : repositoryRelativePath,
tag,
isStatic);
this.localOptions = localOptions;
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java
index 2fa0df9d9..0b817fa0f 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java
@@ -88,7 +88,7 @@ public abstract class RemoteResource extends PlatformObject implements ICVSRemot
* @see ICVSResource#getParent()
*/
public ICVSFolder getParent() {
- throw new UnsupportedOperationException(Policy.bind("RemoteManagedResource.invalidOperation"));
+ throw new UnsupportedOperationException(Policy.bind("RemoteResource.invalidOperation")); //$NON-NLS-1$
}
/*
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FolderSyncInfo.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FolderSyncInfo.java
index 0883688b2..a8d9ce289 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FolderSyncInfo.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FolderSyncInfo.java
@@ -20,6 +20,9 @@ import org.eclipse.team.internal.ccvs.core.Policy;
*/
public class FolderSyncInfo {
+ // The Repository value for virtual directories (i.e. local with no corresponding remote)
+ public static final String VIRTUAL_DIRECTORY = "CVSROOT/Emptydir"; //$NON-NLS-1$
+
// relative path of this folder in the repository, project1/folder1/folder2
private String repository;
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ResourceSyncInfo.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ResourceSyncInfo.java
index 2d5094cea..f7aca5223 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ResourceSyncInfo.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ResourceSyncInfo.java
@@ -32,6 +32,7 @@ public class ResourceSyncInfo {
// utility constants
private static final String DIRECTORY_PREFIX = "D/"; //$NON-NLS-1$
public static final String BINARY_TAG = "-kb"; //$NON-NLS-1$
+ public static final String USE_SERVER_MODE = ""; //$NON-NLS-1$
private static final String SEPERATOR = "/"; //$NON-NLS-1$
// Timestamp constants used to identify special cases
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/RemoteFolderTreeBuilder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/RemoteFolderTreeBuilder.java
index 11c07115c..10ce7a171 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/RemoteFolderTreeBuilder.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/RemoteFolderTreeBuilder.java
@@ -69,10 +69,10 @@ public class RemoteFolderTreeBuilder {
private boolean projectDoesNotExist = false;
- private static String UNKNOWN = "";
- private static String DELETED = "DELETED";
- private static String ADDED = "ADDED";
- private static String FOLDER = "FOLDER";
+ private static String UNKNOWN = ""; //$NON-NLS-1$
+ private static String DELETED = "DELETED"; //$NON-NLS-1$
+ private static String ADDED = "ADDED"; //$NON-NLS-1$
+ private static String FOLDER = "FOLDER"; //$NON-NLS-1$
private static Map EMPTY_MAP = new HashMap();
@@ -414,7 +414,7 @@ public class RemoteFolderTreeBuilder {
IStatus status = Command.UPDATE.execute(session,
new GlobalOption[] { Command.DO_NOT_CHANGE },
updateLocalOptions,
- new String[] { "." },
+ new String[] { Session.CURRENT_LOCAL_FOLDER },
new UpdateListener(listener),
monitor);
return changedFiles;
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ResourceDeltaVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ResourceDeltaVisitor.java
index f400af600..d7cd2db43 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ResourceDeltaVisitor.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ResourceDeltaVisitor.java
@@ -61,7 +61,7 @@ public abstract class ResourceDeltaVisitor implements IResourceDeltaVisitor {
}
visitor.handle();
} catch (CoreException e) {
- Util.logError(Policy.bind("ResourceDeltaVisitor.visitError"), e);
+ Util.logError(Policy.bind("ResourceDeltaVisitor.visitError"), e);//$NON-NLS-1$
}
}
};
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ServerDateFormat.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ServerDateFormat.java
index 7f90b3af4..123b0ca60 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ServerDateFormat.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ServerDateFormat.java
@@ -20,11 +20,11 @@ import java.util.TimeZone;
*/
public class ServerDateFormat extends SimpleDateFormat {
- public static final String FORMAT = "dd MMM yyyy HH:mm:ss";
+ public static final String FORMAT = "dd MMM yyyy HH:mm:ss";//$NON-NLS-1$
public ServerDateFormat() {
super(FORMAT, Locale.US);
- setTimeZone(TimeZone.getTimeZone("GMT"));
+ setTimeZone(TimeZone.getTimeZone("GMT"));//$NON-NLS-1$
}
/**
@@ -32,8 +32,8 @@ public class ServerDateFormat extends SimpleDateFormat {
*/
public Date toDate(String text) throws ParseException {
// FIXME this cuts the timezone which we do not want
- if (text.indexOf("-") != -1) {
- text = text.substring(0,text.indexOf("-"));
+ if (text.indexOf("-") != -1) {//$NON-NLS-1$
+ text = text.substring(0,text.indexOf("-"));//$NON-NLS-1$
}
return parse(text);
}
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/StringMatcher.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/StringMatcher.java
index 5b5b7829e..9936f7ac9 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/StringMatcher.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/StringMatcher.java
@@ -1,388 +1,388 @@
-package org.eclipse.team.internal.ccvs.core.util;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.util.*;
-
-/**
- * A string pattern matcher, suppporting * and ? wildcards.
- * Note: code copied from org.eclipse.jdt.internal.core.util.StringMatcher on April 3, 2001
- * (version 0.1 - 010901H18 [rename jbl]).
- */
-public class StringMatcher {
- protected String fPattern;
- protected int fLength; // pattern length
- protected boolean fIgnoreWildCards;
- protected boolean fIgnoreCase;
- protected boolean fHasLeadingStar;
- protected boolean fHasTrailingStar;
- protected String fSegments[]; //the given pattern is split into * separated segments
-
- /* boundary value beyond which we don't need to search in the text */
- protected int fBound = 0;
-
-
- protected static final char fSingleWildCard = '\u0000';
-
- public static class Position {
- int start; //inclusive
- int end; //exclusive
- public Position(int start, int end) {
- this.start = start;
- this.end = end;
- }
- public int getStart() {
- return start;
- }
- public int getEnd() {
- return end;
- }
- }
- /**
- * Find the first occurrence of the pattern between <code>start</code)(inclusive)
- * and <code>end</code>(exclusive).
- * @param <code>text</code>, the String object to search in
- * @param <code>start</code>, the starting index of the search range, inclusive
- * @param <code>end</code>, the ending index of the search range, exclusive
- * @return an <code>StringMatcher.Position</code> object that keeps the starting
- * (inclusive) and ending positions (exclusive) of the first occurrence of the
- * pattern in the specified range of the text; return null if not found or subtext
- * is empty (start==end). A pair of zeros is returned if pattern is empty string
- * Note that for pattern like "*abc*" with leading and trailing stars, position of "abc"
- * is returned. For a pattern like"*??*" in text "abcdf", (1,3) is returned
- */
-
- public StringMatcher.Position find(String text, int start, int end) {
- if (fPattern == null|| text == null)
- throw new IllegalArgumentException();
-
- int tlen = text.length();
- if (start < 0)
- start = 0;
- if (end > tlen)
- end = tlen;
- if (end < 0 ||start >= end )
- return null;
- if (fLength == 0)
- return new Position(start, start);
- if (fIgnoreWildCards) {
- int x = posIn(text, start, end);
- if (x < 0)
- return null;
- return new Position(x, x+fLength);
- }
-
- int segCount = fSegments.length;
- if (segCount == 0)//pattern contains only '*'(s)
- return new Position (start, end);
-
- int curPos = start;
- int matchStart = -1;
- int i;
- for (i = 0; i < segCount && curPos < end; ++i) {
- String current = fSegments[i];
- int nextMatch = regExpPosIn(text, curPos, end, current);
- if (nextMatch < 0 )
- return null;
- if(i == 0)
- matchStart = nextMatch;
- curPos = nextMatch + current.length();
- }
- if (i < segCount)
- return null;
- return new Position(matchStart, curPos);
- }
- /**
- * StringMatcher constructor takes in a String object that is a simple
- * pattern which may contain *  for 0 and many characters and
- * ?  for exactly one character.
- *
- * Literal '*' and '?' characters must be escaped in the pattern
- * e.g., "\*" means literal "*", etc.
- *
- * Escaping any other character (including the escape character itself),
- * just results in that character in the pattern.
- * e.g., "\a" means "a" and "\\" means "\"
- *
- * If invoking the StringMatcher with string literals in Java, don't forget
- * escape characters are represented by "\\".
- *
- * @param aPattern the pattern to match text against
- * @param ignoreCase if true, case is ignored
- * @param ignoreWildCards if true, wild cards and their escape sequences are ignored
- * (everything is taken literally).
- */
- public StringMatcher(String aPattern, boolean ignoreCase, boolean ignoreWildCards) {
- fIgnoreCase = ignoreCase;
- fIgnoreWildCards = ignoreWildCards;
- fLength = aPattern.length();
-
- /* convert case */
- if (fIgnoreCase) {
- fPattern = aPattern.toUpperCase();
- } else {
- fPattern = aPattern;
- }
-
- if (fIgnoreWildCards) {
- parseNoWildCards();
- } else {
- parseWildCards();
- }
- }
- /**
- * Given the starting (inclusive) and the ending (exclusive) poisitions in the
- * <code>text</code>, determine if the given substring matches with aPattern
- * @return true if the specified portion of the text matches the pattern
- * @param String <code>text</code>, a String object that contains the substring to match
- * @param int <code>start<code> marks the starting position (inclusive) of the substring
- * @param int <code>end<code> marks the ending index (exclusive) of the substring
- */
- public boolean match(String text, int start, int end) {
- if (null == fPattern || null == text)
- throw new IllegalArgumentException();
-
- if (start >= end)
- return false;
-
- if (fIgnoreWildCards)
- return fPattern.regionMatches(fIgnoreCase, 0, text, start, fLength);
- int segCount = fSegments.length;
- if (segCount == 0)//pattern contains only '*'(s) or empty pattern
- return true;
- if (start == end)
- return fLength == 0;
- if (fLength == 0)
- return start == end;
-
- int tlen = text.length();
- if (start < 0)
- start = 0;
- if (end > tlen)
- end = tlen;
-
- int tCurPos = start;
- int bound = end - fBound;
- if ( bound < 0)
- return false;
- int i=0;
- String current = fSegments[i];
- int segLength = current.length();
-
- /* process first segment */
- if (!fHasLeadingStar){
- if(!regExpRegionMatches(text, start, current, 0, segLength)) {
- return false;
- } else {
- ++i;
- tCurPos = tCurPos + segLength;
- }
- }
-
- /* process middle segments */
- for ( ; i < segCount && tCurPos <= bound; ++i) {
- current = fSegments[i];
- int currentMatch;
- int k = current.indexOf(fSingleWildCard);
- if (k < 0) {
- currentMatch = textPosIn(text, tCurPos, end, current);
- if (currentMatch < 0)
- return false;
- } else {
- currentMatch = regExpPosIn(text, tCurPos, end, current);
- if (currentMatch < 0)
- return false;
- }
- tCurPos = currentMatch + current.length();
- }
-
- /* process final segment */
- if (!fHasTrailingStar && tCurPos != end) {
- int clen = current.length();
- return regExpRegionMatches(text, end - clen, current, 0, clen);
- }
- return i == segCount ;
- }
- /**
- * match the given <code>text</code> with the pattern
- * @return true if matched eitherwise false
- * @param <code>text</code>, a String object
- */
- public boolean match(String text) {
- return match(text, 0, text.length());
- }
- /**
- * This method parses the given pattern into segments seperated by wildcard '*' characters.
- * Since wildcards are not being used in this case, the pattern consists of a single segment.
- */
- private void parseNoWildCards() {
- fSegments = new String[1];
- fSegments[0] = fPattern;
- fBound = fLength;
- }
- /**
- * This method parses the given pattern into segments seperated by wildcard '*' characters.
- * @param p, a String object that is a simple regular expression with *  and/or ? 
- */
- private void parseWildCards() {
- if(fPattern.startsWith("*"))
- fHasLeadingStar = true;
- if(fPattern.endsWith("*")) {
- /* make sure it's not an escaped wildcard */
- if (fLength > 1 && fPattern.charAt(fLength - 2) != '\\') {
- fHasTrailingStar = true;
- }
- }
-
- Vector temp = new Vector();
-
- int pos = 0;
- StringBuffer buf = new StringBuffer();
- while (pos < fLength) {
- char c = fPattern.charAt(pos++);
- switch (c) {
- case '\\':
- if (pos >= fLength) {
- buf.append(c);
- } else {
- char next = fPattern.charAt(pos++);
- /* if it's an escape sequence */
- if (next == '*' || next == '?' || next == '\\') {
- buf.append(next);
- } else {
- /* not an escape sequence, just insert literally */
- buf.append(c);
- buf.append(next);
- }
- }
- break;
- case '*':
- if (buf.length() > 0) {
- /* new segment */
- temp.addElement(buf.toString());
- fBound += buf.length();
- buf.setLength(0);
- }
- break;
- case '?':
- /* append special character representing single match wildcard */
- buf.append(fSingleWildCard);
- break;
- default:
- buf.append(c);
- }
- }
-
- /* add last buffer to segment list */
- if (buf.length() > 0) {
- temp.addElement(buf.toString());
- fBound += buf.length();
- }
-
- fSegments = new String[temp.size()];
- temp.copyInto(fSegments);
- }
- /**
- * @param <code>text</code>, a string which contains no wildcard
- * @param <code>start</code>, the starting index in the text for search, inclusive
- * @param <code>end</code>, the stopping point of search, exclusive
- * @return the starting index in the text of the pattern , or -1 if not found
- */
- protected int posIn(String text, int start, int end) {//no wild card in pattern
- int max = end - fLength;
-
- if (!fIgnoreCase) {
- int i = text.indexOf(fPattern, start);
- if (i == -1 || i > max)
- return -1;
- return i;
- }
-
- for (int i = start; i <= max; ++i) {
- if (text.regionMatches(true, i, fPattern, 0, fLength))
- return i;
- }
-
- return -1;
- }
- /**
- * @param <code>text</code>, a simple regular expression that may only contain '?'(s)
- * @param <code>start</code>, the starting index in the text for search, inclusive
- * @param <code>end</code>, the stopping point of search, exclusive
- * @param <code>p</code>, a simple regular expression that may contains '?'
- * @param <code>caseIgnored</code>, wether the pattern is not casesensitive
- * @return the starting index in the text of the pattern , or -1 if not found
- */
- protected int regExpPosIn(String text, int start, int end, String p) {
- int plen = p.length();
-
- int max = end - plen;
- for (int i = start; i <= max; ++i) {
- if (regExpRegionMatches(text, i, p, 0, plen))
- return i;
- }
- return -1;
- }
- /**
- *
- * @return boolean
- * @param <code>text</code>, a String to match
- * @param <code>start</code>, int that indicates the starting index of match, inclusive
- * @param <code>end</code> int that indicates the ending index of match, exclusive
- * @param <code>p</code>, String, String, a simple regular expression that may contain '?'
- * @param <code>ignoreCase</code>, boolean indicating wether code>p</code> is case sensitive
- */
- protected boolean regExpRegionMatches(String text, int tStart, String p, int pStart, int plen) {
- while (plen-- > 0) {
- char tchar = text.charAt(tStart++);
- char pchar = p.charAt(pStart++);
-
- /* process wild cards */
- if (!fIgnoreWildCards) {
- /* skip single wild cards */
- if (pchar == fSingleWildCard) {
- continue;
- }
- }
- if (pchar == tchar)
- continue;
- if (fIgnoreCase) {
- char tc = Character.toUpperCase(tchar);
- if (tc == pchar)
- continue;
- }
- return false;
- }
- return true;
- }
- /**
- * @param <code>text</code>, the string to match
- * @param <code>start</code>, the starting index in the text for search, inclusive
- * @param <code>end</code>, the stopping point of search, exclusive
- * @param code>p</code>, a string that has no wildcard
- * @param <code>ignoreCase</code>, boolean indicating wether code>p</code> is case sensitive
- * @return the starting index in the text of the pattern , or -1 if not found
- */
- protected int textPosIn(String text, int start, int end, String p) {
-
- int plen = p.length();
- int max = end - plen;
-
- if (!fIgnoreCase) {
- int i = text.indexOf(p, start);
- if (i == -1 || i > max)
- return -1;
- return i;
- }
-
- for (int i = 0; i <= max; ++i) {
- if (text.regionMatches(true, i, p, 0, plen))
- return i;
- }
-
- return -1;
- }
-}
+package org.eclipse.team.internal.ccvs.core.util;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import java.util.*;
+
+/**
+ * A string pattern matcher, suppporting * and ? wildcards.
+ * Note: code copied from org.eclipse.jdt.internal.core.util.StringMatcher on April 3, 2001
+ * (version 0.1 - 010901H18 [rename jbl]).
+ */
+public class StringMatcher {
+ protected String fPattern;
+ protected int fLength; // pattern length
+ protected boolean fIgnoreWildCards;
+ protected boolean fIgnoreCase;
+ protected boolean fHasLeadingStar;
+ protected boolean fHasTrailingStar;
+ protected String fSegments[]; //the given pattern is split into * separated segments
+
+ /* boundary value beyond which we don't need to search in the text */
+ protected int fBound = 0;
+
+
+ protected static final char fSingleWildCard = '\u0000';
+
+ public static class Position {
+ int start; //inclusive
+ int end; //exclusive
+ public Position(int start, int end) {
+ this.start = start;
+ this.end = end;
+ }
+ public int getStart() {
+ return start;
+ }
+ public int getEnd() {
+ return end;
+ }
+ }
+ /**
+ * Find the first occurrence of the pattern between <code>start</code)(inclusive)
+ * and <code>end</code>(exclusive).
+ * @param <code>text</code>, the String object to search in
+ * @param <code>start</code>, the starting index of the search range, inclusive
+ * @param <code>end</code>, the ending index of the search range, exclusive
+ * @return an <code>StringMatcher.Position</code> object that keeps the starting
+ * (inclusive) and ending positions (exclusive) of the first occurrence of the
+ * pattern in the specified range of the text; return null if not found or subtext
+ * is empty (start==end). A pair of zeros is returned if pattern is empty string
+ * Note that for pattern like "*abc*" with leading and trailing stars, position of "abc"
+ * is returned. For a pattern like"*??*" in text "abcdf", (1,3) is returned
+ */
+
+ public StringMatcher.Position find(String text, int start, int end) {
+ if (fPattern == null|| text == null)
+ throw new IllegalArgumentException();
+
+ int tlen = text.length();
+ if (start < 0)
+ start = 0;
+ if (end > tlen)
+ end = tlen;
+ if (end < 0 ||start >= end )
+ return null;
+ if (fLength == 0)
+ return new Position(start, start);
+ if (fIgnoreWildCards) {
+ int x = posIn(text, start, end);
+ if (x < 0)
+ return null;
+ return new Position(x, x+fLength);
+ }
+
+ int segCount = fSegments.length;
+ if (segCount == 0)//pattern contains only '*'(s)
+ return new Position (start, end);
+
+ int curPos = start;
+ int matchStart = -1;
+ int i;
+ for (i = 0; i < segCount && curPos < end; ++i) {
+ String current = fSegments[i];
+ int nextMatch = regExpPosIn(text, curPos, end, current);
+ if (nextMatch < 0 )
+ return null;
+ if(i == 0)
+ matchStart = nextMatch;
+ curPos = nextMatch + current.length();
+ }
+ if (i < segCount)
+ return null;
+ return new Position(matchStart, curPos);
+ }
+ /**
+ * StringMatcher constructor takes in a String object that is a simple
+ * pattern which may contain *  for 0 and many characters and
+ * ?  for exactly one character.
+ *
+ * Literal '*' and '?' characters must be escaped in the pattern
+ * e.g., "\*" means literal "*", etc.
+ *
+ * Escaping any other character (including the escape character itself),
+ * just results in that character in the pattern.
+ * e.g., "\a" means "a" and "\\" means "\"
+ *
+ * If invoking the StringMatcher with string literals in Java, don't forget
+ * escape characters are represented by "\\".
+ *
+ * @param aPattern the pattern to match text against
+ * @param ignoreCase if true, case is ignored
+ * @param ignoreWildCards if true, wild cards and their escape sequences are ignored
+ * (everything is taken literally).
+ */
+ public StringMatcher(String aPattern, boolean ignoreCase, boolean ignoreWildCards) {
+ fIgnoreCase = ignoreCase;
+ fIgnoreWildCards = ignoreWildCards;
+ fLength = aPattern.length();
+
+ /* convert case */
+ if (fIgnoreCase) {
+ fPattern = aPattern.toUpperCase();
+ } else {
+ fPattern = aPattern;
+ }
+
+ if (fIgnoreWildCards) {
+ parseNoWildCards();
+ } else {
+ parseWildCards();
+ }
+ }
+ /**
+ * Given the starting (inclusive) and the ending (exclusive) poisitions in the
+ * <code>text</code>, determine if the given substring matches with aPattern
+ * @return true if the specified portion of the text matches the pattern
+ * @param String <code>text</code>, a String object that contains the substring to match
+ * @param int <code>start<code> marks the starting position (inclusive) of the substring
+ * @param int <code>end<code> marks the ending index (exclusive) of the substring
+ */
+ public boolean match(String text, int start, int end) {
+ if (null == fPattern || null == text)
+ throw new IllegalArgumentException();
+
+ if (start >= end)
+ return false;
+
+ if (fIgnoreWildCards)
+ return fPattern.regionMatches(fIgnoreCase, 0, text, start, fLength);
+ int segCount = fSegments.length;
+ if (segCount == 0)//pattern contains only '*'(s) or empty pattern
+ return true;
+ if (start == end)
+ return fLength == 0;
+ if (fLength == 0)
+ return start == end;
+
+ int tlen = text.length();
+ if (start < 0)
+ start = 0;
+ if (end > tlen)
+ end = tlen;
+
+ int tCurPos = start;
+ int bound = end - fBound;
+ if ( bound < 0)
+ return false;
+ int i=0;
+ String current = fSegments[i];
+ int segLength = current.length();
+
+ /* process first segment */
+ if (!fHasLeadingStar){
+ if(!regExpRegionMatches(text, start, current, 0, segLength)) {
+ return false;
+ } else {
+ ++i;
+ tCurPos = tCurPos + segLength;
+ }
+ }
+
+ /* process middle segments */
+ for ( ; i < segCount && tCurPos <= bound; ++i) {
+ current = fSegments[i];
+ int currentMatch;
+ int k = current.indexOf(fSingleWildCard);
+ if (k < 0) {
+ currentMatch = textPosIn(text, tCurPos, end, current);
+ if (currentMatch < 0)
+ return false;
+ } else {
+ currentMatch = regExpPosIn(text, tCurPos, end, current);
+ if (currentMatch < 0)
+ return false;
+ }
+ tCurPos = currentMatch + current.length();
+ }
+
+ /* process final segment */
+ if (!fHasTrailingStar && tCurPos != end) {
+ int clen = current.length();
+ return regExpRegionMatches(text, end - clen, current, 0, clen);
+ }
+ return i == segCount ;
+ }
+ /**
+ * match the given <code>text</code> with the pattern
+ * @return true if matched eitherwise false
+ * @param <code>text</code>, a String object
+ */
+ public boolean match(String text) {
+ return match(text, 0, text.length());
+ }
+ /**
+ * This method parses the given pattern into segments seperated by wildcard '*' characters.
+ * Since wildcards are not being used in this case, the pattern consists of a single segment.
+ */
+ private void parseNoWildCards() {
+ fSegments = new String[1];
+ fSegments[0] = fPattern;
+ fBound = fLength;
+ }
+ /**
+ * This method parses the given pattern into segments seperated by wildcard '*' characters.
+ * @param p, a String object that is a simple regular expression with *  and/or ? 
+ */
+ private void parseWildCards() {
+ if(fPattern.startsWith("*"))//$NON-NLS-1$
+ fHasLeadingStar = true;
+ if(fPattern.endsWith("*")) {//$NON-NLS-1$
+ /* make sure it's not an escaped wildcard */
+ if (fLength > 1 && fPattern.charAt(fLength - 2) != '\\') {
+ fHasTrailingStar = true;
+ }
+ }
+
+ Vector temp = new Vector();
+
+ int pos = 0;
+ StringBuffer buf = new StringBuffer();
+ while (pos < fLength) {
+ char c = fPattern.charAt(pos++);
+ switch (c) {
+ case '\\':
+ if (pos >= fLength) {
+ buf.append(c);
+ } else {
+ char next = fPattern.charAt(pos++);
+ /* if it's an escape sequence */
+ if (next == '*' || next == '?' || next == '\\') {
+ buf.append(next);
+ } else {
+ /* not an escape sequence, just insert literally */
+ buf.append(c);
+ buf.append(next);
+ }
+ }
+ break;
+ case '*':
+ if (buf.length() > 0) {
+ /* new segment */
+ temp.addElement(buf.toString());
+ fBound += buf.length();
+ buf.setLength(0);
+ }
+ break;
+ case '?':
+ /* append special character representing single match wildcard */
+ buf.append(fSingleWildCard);
+ break;
+ default:
+ buf.append(c);
+ }
+ }
+
+ /* add last buffer to segment list */
+ if (buf.length() > 0) {
+ temp.addElement(buf.toString());
+ fBound += buf.length();
+ }
+
+ fSegments = new String[temp.size()];
+ temp.copyInto(fSegments);
+ }
+ /**
+ * @param <code>text</code>, a string which contains no wildcard
+ * @param <code>start</code>, the starting index in the text for search, inclusive
+ * @param <code>end</code>, the stopping point of search, exclusive
+ * @return the starting index in the text of the pattern , or -1 if not found
+ */
+ protected int posIn(String text, int start, int end) {//no wild card in pattern
+ int max = end - fLength;
+
+ if (!fIgnoreCase) {
+ int i = text.indexOf(fPattern, start);
+ if (i == -1 || i > max)
+ return -1;
+ return i;
+ }
+
+ for (int i = start; i <= max; ++i) {
+ if (text.regionMatches(true, i, fPattern, 0, fLength))
+ return i;
+ }
+
+ return -1;
+ }
+ /**
+ * @param <code>text</code>, a simple regular expression that may only contain '?'(s)
+ * @param <code>start</code>, the starting index in the text for search, inclusive
+ * @param <code>end</code>, the stopping point of search, exclusive
+ * @param <code>p</code>, a simple regular expression that may contains '?'
+ * @param <code>caseIgnored</code>, wether the pattern is not casesensitive
+ * @return the starting index in the text of the pattern , or -1 if not found
+ */
+ protected int regExpPosIn(String text, int start, int end, String p) {
+ int plen = p.length();
+
+ int max = end - plen;
+ for (int i = start; i <= max; ++i) {
+ if (regExpRegionMatches(text, i, p, 0, plen))
+ return i;
+ }
+ return -1;
+ }
+ /**
+ *
+ * @return boolean
+ * @param <code>text</code>, a String to match
+ * @param <code>start</code>, int that indicates the starting index of match, inclusive
+ * @param <code>end</code> int that indicates the ending index of match, exclusive
+ * @param <code>p</code>, String, String, a simple regular expression that may contain '?'
+ * @param <code>ignoreCase</code>, boolean indicating wether code>p</code> is case sensitive
+ */
+ protected boolean regExpRegionMatches(String text, int tStart, String p, int pStart, int plen) {
+ while (plen-- > 0) {
+ char tchar = text.charAt(tStart++);
+ char pchar = p.charAt(pStart++);
+
+ /* process wild cards */
+ if (!fIgnoreWildCards) {
+ /* skip single wild cards */
+ if (pchar == fSingleWildCard) {
+ continue;
+ }
+ }
+ if (pchar == tchar)
+ continue;
+ if (fIgnoreCase) {
+ char tc = Character.toUpperCase(tchar);
+ if (tc == pchar)
+ continue;
+ }
+ return false;
+ }
+ return true;
+ }
+ /**
+ * @param <code>text</code>, the string to match
+ * @param <code>start</code>, the starting index in the text for search, inclusive
+ * @param <code>end</code>, the stopping point of search, exclusive
+ * @param code>p</code>, a string that has no wildcard
+ * @param <code>ignoreCase</code>, boolean indicating wether code>p</code> is case sensitive
+ * @return the starting index in the text of the pattern , or -1 if not found
+ */
+ protected int textPosIn(String text, int start, int end, String p) {
+
+ int plen = p.length();
+ int max = end - plen;
+
+ if (!fIgnoreCase) {
+ int i = text.indexOf(p, start);
+ if (i == -1 || i > max)
+ return -1;
+ return i;
+ }
+
+ for (int i = 0; i <= max; ++i) {
+ if (text.regionMatches(true, i, p, 0, plen))
+ return i;
+ }
+
+ return -1;
+ }
+}
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileUtil.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileUtil.java
index 9efe948f4..e235330b0 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileUtil.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileUtil.java
@@ -51,13 +51,13 @@ public class SyncFileUtil {
// file and folder patterns that are ignored by default by the CVS server on import.
public static final String[] PREDEFINED_IGNORE_PATTERNS = {
- "CVS", ".#*", "#*", ",*", "_$*", "*~", "*$", "*.a", "*.bak", "*.BAK", //$NON-NLS-1$
- "*.elc", "*.exe", "*.ln", "*.o", "*.obj", "*.olb", "*.old", "*.orig", "*.rej", "*.so", //$NON-NLS-1$
- "*.Z", ".del-*", ".make.state", ".nse_depinfo", "CVS.adm", //$NON-NLS-1$
- "cvslog.*", "RCS", "RCSLOG", "SCCS", "tags", "TAGS"}; //$NON-NLS-1$
+ "CVS", ".#*", "#*", ",*", "_$*", "*~", "*$", "*.a", "*.bak", "*.BAK", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "*.elc", "*.exe", "*.ln", "*.o", "*.obj", "*.olb", "*.old", "*.orig", "*.rej", "*.so", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$
+ "*.Z", ".del-*", ".make.state", ".nse_depinfo", "CVS.adm", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ "cvslog.*", "RCS", "RCSLOG", "SCCS", "tags", "TAGS"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
// file and folder patterns that are ignored by default by the CVS server on import.
- public static final String[] BASIC_IGNORE_PATTERNS = {"CVS", ".#*"}; //$NON-NLS-1$
+ public static final String[] BASIC_IGNORE_PATTERNS = {"CVS", ".#*"}; //$NON-NLS-1$ //$NON-NLS-2$
/**
* Reads the CVS/Entry and CVS/Permissions files for the given folder. If the folder does not have a
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java
index 3a7c7d0ca..2775fe4cd 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java
@@ -10,14 +10,15 @@ import org.eclipse.core.runtime.Status;
import org.eclipse.team.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.client.Session;
+import org.eclipse.team.internal.ccvs.core.Policy;
/**
* Unsorted static helper-methods
*/
public class Util {
- private static final String AT = "@";
- private static final String COLON = ":";
+ private static final String AT = "@"; //$NON-NLS-1$
+ private static final String COLON = ":"; //$NON-NLS-1$
// private static final String newLine = System.getProperty("line.separator");
@@ -250,13 +251,13 @@ public class Util {
throws CVSException {
if (!resourceName.startsWith(rootName)) {
- throw new CVSException("Internal error, resource does not start with root.");
+ throw new CVSException(Policy.bind("Util.Internal_error,_resource_does_not_start_with_root_3")); //$NON-NLS-1$
}
// Otherwise we would get an ArrayOutOfBoundException
// in case of two equal Resources
if (rootName.length() == resourceName.length()) {
- return "";
+ return ""; //$NON-NLS-1$
}
// Get rid of the seperator, that would be in the
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Cipher.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Cipher.java
index 83a397955..14c6270d2 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Cipher.java
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Cipher.java
@@ -1,19 +1,19 @@
-package org.eclipse.team.internal.ccvs.ssh;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-public abstract class Cipher {
-public abstract void decipher(byte[] src, int srcPos, byte[] dst, int dstPos, int len);
-public abstract void encipher(byte[] src, int srcPos, byte[] dst, int dstPos, int len);
-public static Cipher getInstance(String algorithm) {
- try {
- Class c = Class.forName("org.eclipse.team.internal.ccvs.ssh." + algorithm);
- return (Cipher) c.newInstance();
- } catch (Exception e) {
- return null;
- }
-}
-public abstract void setKey(byte[] key);
-}
+package org.eclipse.team.internal.ccvs.ssh;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+public abstract class Cipher {
+public abstract void decipher(byte[] src, int srcPos, byte[] dst, int dstPos, int len);
+public abstract void encipher(byte[] src, int srcPos, byte[] dst, int dstPos, int len);
+public static Cipher getInstance(String algorithm) {
+ try {
+ Class c = Class.forName("org.eclipse.team.internal.ccvs.ssh." + algorithm); //$NON-NLS-1$
+ return (Cipher) c.newInstance();
+ } catch (Exception e) {
+ return null;
+ }
+}
+public abstract void setKey(byte[] key);
+}
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Client.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Client.java
index 992149db9..e853dd105 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Client.java
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Client.java
@@ -22,7 +22,7 @@ import org.eclipse.team.internal.ccvs.core.connection.CVSAuthenticationException
public class Client {
// client identification string
- private static final String clientId = "SSH-1.5-Java 1.2.2\n";
+ private static final String clientId = "SSH-1.5-Java 1.2.2\n"; //$NON-NLS-1$
// server identification string
private static String serverId = null;
@@ -49,7 +49,7 @@ public class Client {
private static final int SSH_MSG_DEBUG = 36;
// cipher names
- private static String[] cipherNames = { "None", "IDEA", "DES", "3DES", "TSS", "RC4", "Blowfish" };
+ private static String[] cipherNames = { "None", "IDEA", "DES", "3DES", "TSS", "RC4", "Blowfish" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
// cipher types
private static int SSH_CIPHER_NONE = 0;
@@ -95,7 +95,7 @@ public class Client {
public int available() throws IOException {
if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
+ throw new IOException(Policy.bind("closed")); //$NON-NLS-1$
}
int available = buffer == null ? 0 : buffer.available();
@@ -122,7 +122,7 @@ public class Client {
public int read() throws IOException {
if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
+ throw new IOException(Policy.bind("closed"));//$NON-NLS-1$
}
if (atEnd) {
@@ -138,7 +138,7 @@ public class Client {
public int read(byte b[], int off, int len) throws IOException {
if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
+ throw new IOException(Policy.bind("closed"));//$NON-NLS-1$
}
if (atEnd) {
@@ -177,7 +177,7 @@ public class Client {
send(SSH_CMSG_EXIT_CONFIRMATION, null);
break;
default :
- throw new IOException(SSHPlugin.getResourceString("Client.packetType", new Object[] {new Integer(packetType)} ));
+ throw new IOException(Policy.bind("Client.packetType", new Object[] {new Integer(packetType)} ));//$NON-NLS-1$
}
}
}
@@ -200,7 +200,7 @@ public class Client {
public void flush() throws IOException {
if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
+ throw new IOException(Policy.bind("closed"));//$NON-NLS-1$
}
if (bufpos > 0) {
@@ -211,7 +211,7 @@ public class Client {
public void write(int b) throws IOException {
if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
+ throw new IOException(Policy.bind("closed"));//$NON-NLS-1$
}
buffer[bufpos++] = (byte) b;
@@ -223,7 +223,7 @@ public class Client {
public void write(byte b[], int off, int len) throws IOException {
if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
+ throw new IOException(Policy.bind("closed")); //$NON-NLS-1$
}
int bytesWritten = 0;
@@ -325,7 +325,7 @@ public void connect(IProgressMonitor monitor) throws IOException, CVSAuthenticat
socket = new Socket(host, port);
} catch (InterruptedIOException e) {
// If we get this exception, chances are the host is not responding
- throw new InterruptedIOException(SSHPlugin.getResourceString("Client.socket", new Object[] {host}));
+ throw new InterruptedIOException(Policy.bind("Client.socket", new Object[] {host}));//$NON-NLS-1$
}
if (timeout >= 0) {
@@ -342,7 +342,7 @@ public void connect(IProgressMonitor monitor) throws IOException, CVSAuthenticat
int c;
while ((c = socketIn.read()) != '\n') {
if (c == -1)
- throw new IOException(SSHPlugin.getResourceString("Client.socketClosed"));
+ throw new IOException(Policy.bind("Client.socketClosed"));//$NON-NLS-1$
buf.append((char) c);
}
serverId = buf.toString();
@@ -386,14 +386,14 @@ public void disconnect() throws IOException {
}
public InputStream getInputStream() throws IOException {
if (!connected) {
- throw new IOException(SSHPlugin.getResourceString("Client.notConnected"));
+ throw new IOException(Policy.bind("Client.notConnected"));//$NON-NLS-1$
}
return is;
}
public OutputStream getOutputStream() throws IOException {
if (!connected) {
- throw new IOException(SSHPlugin.getResourceString("Client.notConnected"));
+ throw new IOException(Policy.bind("Client.notConnected"));//$NON-NLS-1$
}
return os;
@@ -410,7 +410,7 @@ private void startShell() throws IOException {
packetType = packet.getType();
if (packetType != SSH_SMSG_SUCCESS) {
- throw new IOException(SSHPlugin.getResourceString("Client.packetType", new Object[] {new Integer(packetType)} ));
+ throw new IOException(Policy.bind("Client.packetType", new Object[] {new Integer(packetType)} ));//$NON-NLS-1$
}
} finally {
if (packet != null) {
@@ -434,7 +434,7 @@ private void login() throws IOException, CVSAuthenticationException {
packetType = packet.getType();
if (packetType != SSH_SMSG_PUBLIC_KEY) {
- throw new IOException(SSHPlugin.getResourceString("Client.packetType", new Object[] {new Integer(packetType)} ));
+ throw new IOException(Policy.bind("Client.packetType", new Object[] {new Integer(packetType)} ));//$NON-NLS-1$
}
receive_SSH_SMSG_PUBLIC_KEY(packet);
@@ -449,7 +449,7 @@ private void login() throws IOException, CVSAuthenticationException {
packetType = packet.getType();
if (packetType != SSH_SMSG_SUCCESS) {
- throw new IOException(SSHPlugin.getResourceString("Client.packetType", new Object[] {new Integer(packetType)} ));
+ throw new IOException(Policy.bind("Client.packetType", new Object[] {new Integer(packetType)} ));//$NON-NLS-1$
}
} finally {
if (packet != null) {
@@ -464,7 +464,7 @@ private void login() throws IOException, CVSAuthenticationException {
packetType = packet.getType();
if (packetType != SSH_SMSG_FAILURE) {
- throw new IOException(SSHPlugin.getResourceString("Client.packetType", new Object[] {new Integer(packetType)} ));
+ throw new IOException(Policy.bind("Client.packetType", new Object[] {new Integer(packetType)} ));//$NON-NLS-1$
}
} finally {
if (packet != null) {
@@ -479,11 +479,11 @@ private void login() throws IOException, CVSAuthenticationException {
packetType = packet.getType();
if (packetType == SSH_SMSG_FAILURE) {
- throw new CVSAuthenticationException(SSHPlugin.getResourceString("Client.authenticationFailed"));
+ throw new CVSAuthenticationException(Policy.bind("Client.authenticationFailed"));//$NON-NLS-1$
}
if (packetType != SSH_SMSG_SUCCESS) {
- throw new IOException(SSHPlugin.getResourceString("Client.packetType", new Object[] {new Integer(packetType)} ));
+ throw new IOException(Policy.bind("Client.packetType", new Object[] {new Integer(packetType)} ));//$NON-NLS-1$
}
} finally {
if (packet != null) {
@@ -523,7 +523,7 @@ private void receive_SSH_SMSG_PUBLIC_KEY(ServerPacket packet) throws IOException
send_SSH_CMSG_SESSION_KEY(anti_spoofing_cookie, server_key_public_modulus, host_key_public_modulus, supported_ciphers_mask, server_key_public_exponent, host_key_public_exponent);
}
private void send(int packetType, String s) throws IOException {
- byte[] data = s == null ? new byte[0] : s.getBytes("UTF-8");
+ byte[] data = s == null ? new byte[0] : s.getBytes("UTF-8"); //$NON-NLS-1$
send(packetType, data, 0, data.length);
}
private void send(int packetType, byte[] data, int off, int len) throws IOException {
@@ -535,7 +535,7 @@ private void send(int packetType, byte[] data, int off, int len) throws IOExcept
private void send_SSH_CMSG_REQUEST_PTY() throws IOException {
byte packet_type = SSH_CMSG_REQUEST_PTY;
- byte[] termType = Misc.lengthEncode("dumb".getBytes(), 0, 4);
+ byte[] termType = Misc.lengthEncode("dumb".getBytes(), 0, 4);//$NON-NLS-1$
byte[] row = {0, 0, 0, 0};
byte[] col = {0, 0, 0, 0};
byte[] XPixels = {0, 0, 0, 0};
@@ -593,7 +593,7 @@ private void send_SSH_CMSG_SESSION_KEY(byte[] anti_spoofing_cookie, byte[] serve
}
if (!foundSupportedCipher) {
- throw new IOException(SSHPlugin.getResourceString("Client.cipher"));
+ throw new IOException(Policy.bind("Client.cipher"));//$NON-NLS-1$
}
// session_key
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Misc.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Misc.java
index e8561a5ff..3251c6be3 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Misc.java
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Misc.java
@@ -1,449 +1,449 @@
-package org.eclipse.team.internal.ccvs.ssh;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-
-class Misc {
- private static MessageDigest md5 = null;
- private static SecureRandom random = null;
- private static long crc32_tab[] = {
- 0x00000000L,
- 0x77073096L,
- 0xee0e612cL,
- 0x990951baL,
- 0x076dc419L,
- 0x706af48fL,
- 0xe963a535L,
- 0x9e6495a3L,
- 0x0edb8832L,
- 0x79dcb8a4L,
- 0xe0d5e91eL,
- 0x97d2d988L,
- 0x09b64c2bL,
- 0x7eb17cbdL,
- 0xe7b82d07L,
- 0x90bf1d91L,
- 0x1db71064L,
- 0x6ab020f2L,
- 0xf3b97148L,
- 0x84be41deL,
- 0x1adad47dL,
- 0x6ddde4ebL,
- 0xf4d4b551L,
- 0x83d385c7L,
- 0x136c9856L,
- 0x646ba8c0L,
- 0xfd62f97aL,
- 0x8a65c9ecL,
- 0x14015c4fL,
- 0x63066cd9L,
- 0xfa0f3d63L,
- 0x8d080df5L,
- 0x3b6e20c8L,
- 0x4c69105eL,
- 0xd56041e4L,
- 0xa2677172L,
- 0x3c03e4d1L,
- 0x4b04d447L,
- 0xd20d85fdL,
- 0xa50ab56bL,
- 0x35b5a8faL,
- 0x42b2986cL,
- 0xdbbbc9d6L,
- 0xacbcf940L,
- 0x32d86ce3L,
- 0x45df5c75L,
- 0xdcd60dcfL,
- 0xabd13d59L,
- 0x26d930acL,
- 0x51de003aL,
- 0xc8d75180L,
- 0xbfd06116L,
- 0x21b4f4b5L,
- 0x56b3c423L,
- 0xcfba9599L,
- 0xb8bda50fL,
- 0x2802b89eL,
- 0x5f058808L,
- 0xc60cd9b2L,
- 0xb10be924L,
- 0x2f6f7c87L,
- 0x58684c11L,
- 0xc1611dabL,
- 0xb6662d3dL,
- 0x76dc4190L,
- 0x01db7106L,
- 0x98d220bcL,
- 0xefd5102aL,
- 0x71b18589L,
- 0x06b6b51fL,
- 0x9fbfe4a5L,
- 0xe8b8d433L,
- 0x7807c9a2L,
- 0x0f00f934L,
- 0x9609a88eL,
- 0xe10e9818L,
- 0x7f6a0dbbL,
- 0x086d3d2dL,
- 0x91646c97L,
- 0xe6635c01L,
- 0x6b6b51f4L,
- 0x1c6c6162L,
- 0x856530d8L,
- 0xf262004eL,
- 0x6c0695edL,
- 0x1b01a57bL,
- 0x8208f4c1L,
- 0xf50fc457L,
- 0x65b0d9c6L,
- 0x12b7e950L,
- 0x8bbeb8eaL,
- 0xfcb9887cL,
- 0x62dd1ddfL,
- 0x15da2d49L,
- 0x8cd37cf3L,
- 0xfbd44c65L,
- 0x4db26158L,
- 0x3ab551ceL,
- 0xa3bc0074L,
- 0xd4bb30e2L,
- 0x4adfa541L,
- 0x3dd895d7L,
- 0xa4d1c46dL,
- 0xd3d6f4fbL,
- 0x4369e96aL,
- 0x346ed9fcL,
- 0xad678846L,
- 0xda60b8d0L,
- 0x44042d73L,
- 0x33031de5L,
- 0xaa0a4c5fL,
- 0xdd0d7cc9L,
- 0x5005713cL,
- 0x270241aaL,
- 0xbe0b1010L,
- 0xc90c2086L,
- 0x5768b525L,
- 0x206f85b3L,
- 0xb966d409L,
- 0xce61e49fL,
- 0x5edef90eL,
- 0x29d9c998L,
- 0xb0d09822L,
- 0xc7d7a8b4L,
- 0x59b33d17L,
- 0x2eb40d81L,
- 0xb7bd5c3bL,
- 0xc0ba6cadL,
- 0xedb88320L,
- 0x9abfb3b6L,
- 0x03b6e20cL,
- 0x74b1d29aL,
- 0xead54739L,
- 0x9dd277afL,
- 0x04db2615L,
- 0x73dc1683L,
- 0xe3630b12L,
- 0x94643b84L,
- 0x0d6d6a3eL,
- 0x7a6a5aa8L,
- 0xe40ecf0bL,
- 0x9309ff9dL,
- 0x0a00ae27L,
- 0x7d079eb1L,
- 0xf00f9344L,
- 0x8708a3d2L,
- 0x1e01f268L,
- 0x6906c2feL,
- 0xf762575dL,
- 0x806567cbL,
- 0x196c3671L,
- 0x6e6b06e7L,
- 0xfed41b76L,
- 0x89d32be0L,
- 0x10da7a5aL,
- 0x67dd4accL,
- 0xf9b9df6fL,
- 0x8ebeeff9L,
- 0x17b7be43L,
- 0x60b08ed5L,
- 0xd6d6a3e8L,
- 0xa1d1937eL,
- 0x38d8c2c4L,
- 0x4fdff252L,
- 0xd1bb67f1L,
- 0xa6bc5767L,
- 0x3fb506ddL,
- 0x48b2364bL,
- 0xd80d2bdaL,
- 0xaf0a1b4cL,
- 0x36034af6L,
- 0x41047a60L,
- 0xdf60efc3L,
- 0xa867df55L,
- 0x316e8eefL,
- 0x4669be79L,
- 0xcb61b38cL,
- 0xbc66831aL,
- 0x256fd2a0L,
- 0x5268e236L,
- 0xcc0c7795L,
- 0xbb0b4703L,
- 0x220216b9L,
- 0x5505262fL,
- 0xc5ba3bbeL,
- 0xb2bd0b28L,
- 0x2bb45a92L,
- 0x5cb36a04L,
- 0xc2d7ffa7L,
- 0xb5d0cf31L,
- 0x2cd99e8bL,
- 0x5bdeae1dL,
- 0x9b64c2b0L,
- 0xec63f226L,
- 0x756aa39cL,
- 0x026d930aL,
- 0x9c0906a9L,
- 0xeb0e363fL,
- 0x72076785L,
- 0x05005713L,
- 0x95bf4a82L,
- 0xe2b87a14L,
- 0x7bb12baeL,
- 0x0cb61b38L,
- 0x92d28e9bL,
- 0xe5d5be0dL,
- 0x7cdcefb7L,
- 0x0bdbdf21L,
- 0x86d3d2d4L,
- 0xf1d4e242L,
- 0x68ddb3f8L,
- 0x1fda836eL,
- 0x81be16cdL,
- 0xf6b9265bL,
- 0x6fb077e1L,
- 0x18b74777L,
- 0x88085ae6L,
- 0xff0f6a70L,
- 0x66063bcaL,
- 0x11010b5cL,
- 0x8f659effL,
- 0xf862ae69L,
- 0x616bffd3L,
- 0x166ccf45L,
- 0xa00ae278L,
- 0xd70dd2eeL,
- 0x4e048354L,
- 0x3903b3c2L,
- 0xa7672661L,
- 0xd06016f7L,
- 0x4969474dL,
- 0x3e6e77dbL,
- 0xaed16a4aL,
- 0xd9d65adcL,
- 0x40df0b66L,
- 0x37d83bf0L,
- 0xa9bcae53L,
- 0xdebb9ec5L,
- 0x47b2cf7fL,
- 0x30b5ffe9L,
- 0xbdbdf21cL,
- 0xcabac28aL,
- 0x53b39330L,
- 0x24b4a3a6L,
- 0xbad03605L,
- 0xcdd70693L,
- 0x54de5729L,
- 0x23d967bfL,
- 0xb3667a2eL,
- 0xc4614ab8L,
- 0x5d681b02L,
- 0x2a6f2b94L,
- 0xb40bbe37L,
- 0xc30c8ea1L,
- 0x5a05df1bL,
- 0x2d02ef8dL
- };
-static public long crc32(byte[] b, int off, int len) {
- return crc32(b, off, len, 0);
-}
-/**
- * Compute the crc Cyclic Redundancy Check, with the polynomial 0xedb88320,
- * The polynomial is X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
- * We take it "backwards" and put the highest-order term in the lowest-order bit.
- * The X^32 term is "implied"; the LSB is the X^31 term, etc.
- * The X^0 term (usually shown as "+1") results in the MSB being 1.
- * so the poly is 0x04c11db7 (used for Ethernet)
- * The buf will be the Padding, Packet type, and Data fields.
- * The crc is computed before any encryption.
- * R =X^n * M rem P M message P polynomial crc R : crc calculated.
- * T(x) = x^n * M(x) + R(x) property: T rem P = 0
- */
-static public long crc32(byte[] b, int off, int len, long crc32val) {
- for (int i = 0; i < len; i++) {
- crc32val = crc32_tab[(int) ((crc32val ^ b[off + i]) & 0xff)] ^ (crc32val >> 8);
- }
-
- return crc32val;
-}
-static public byte[] lengthEncode(byte[] b, int off, int len) throws IOException {
- byte[] result = new byte[len + 4];
- writeInt(len, result, 0);
- System.arraycopy(b, off, result, 4, len);
- return result;
-}
-static public byte[] readMpInt(InputStream is) throws IOException {
- int a = (byte) is.read();
- int b = (byte) is.read();
-
- if(a == -1 || b == -1){
- throw new IOException(SSHPlugin.getResourceString("stream"));
- }
-
- int bits = (a << 8) + b;
- int bytes = (bits + 7) / 8;
-
- byte[] result = new byte[bytes];
-
- readFully(is, result);
-
- return result;
-}
-public static byte[] md5(byte[] b) {
- if (md5 == null) {
- try {
- md5 = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException e) {
- }
- }
-
- return md5.digest(b);
-}
-public static byte[] md5(String s) {
- return md5(s.getBytes());
-}
-public static void readFully(InputStream is, byte[] b) throws IOException {
- readFully(is, b, 0, b.length);
-}
-public static void readFully(InputStream is, byte[] b, int off, int len) throws IOException {
- int bytesRead = 0;
- int totalBytesRead = 0;
-
- while (totalBytesRead < len) {
- bytesRead = is.read(b, totalBytesRead + off, len - totalBytesRead);
-
- if (bytesRead == -1) {
- throw new IOException(SSHPlugin.getResourceString("stream"));
- }
-
- totalBytesRead += bytesRead;
- }
-}
-public static int readInt(byte[] arr, int off) throws IOException {
- int a = arr[off] & 0xff;
- int b = arr[off + 1] & 0xff;
- int c = arr[off + 2] & 0xff;
- int d = arr[off + 3] & 0xff;
-
- return (a << 24) + (b << 16) + (c << 8) + d;
-}
-public static int readInt(InputStream is) throws IOException {
- int a = is.read();
- int b = is.read();
- int c = is.read();
- int d = is.read();
-
- if (a == -1 || b == -1 || c == -1 || d == -1) {
- throw new IOException(SSHPlugin.getResourceString("stream"));
- }
-
- return (a << 24) + (b << 16) + (c << 8) + d;
-}
-public static void skipFully(InputStream is, long n) throws IOException {
- while (n != 0) {
- int b = is.read();
-
- if (b == -1) {
- if (n > 0) {
- throw new IOException(SSHPlugin.getResourceString("stream"));
- }
-
- return;
- }
-
- --n;
- }
-}
-public static void writeInt(int i, byte[] b, int off) {
- b[off] = (byte) ((i >> 24) & 0xff);
- b[off + 1] = (byte) ((i >> 16) & 0xff);
- b[off + 2] = (byte) ((i >> 8) & 0xff);
- b[off + 3] = (byte) (i & 0xff);
-}
-static public void xor(byte[] src_a, int off_a, byte[] src_b, int off_b, byte[] dst, int dst_off, int len) {
- for(int i = 0; i < len; ++i){
- dst[i + dst_off] = (byte) (src_a[i + off_a] ^ src_b[i + off_b]);
- }
-}
-static public void random(byte[] b, int off, int len, boolean allowZeroBytes) {
- if (random == null) {
- try {
- random = SecureRandom.getInstance("SHA1PRNG");
- } catch (NoSuchAlgorithmException e) {
- }
- }
-
- for(int i = off; i < off + len; ++i){
- do {
- b[i] = (byte) random.nextInt();
- } while(!allowZeroBytes && b[i] == 0);
- }
-}
-static public byte[] encryptRSAPkcs1(byte[] data, byte[] public_key_exponent, byte[] public_key_modulus) {
- byte[] block;
-
- int offset = 0;
- block = new byte[public_key_modulus.length];
- block[offset++] = 0;
- block[offset++] = 2;
-
- Misc.random(block, offset, block.length - data.length - 3, false);
- offset += block.length - data.length - 3;
-
- block[offset++] = 0;
-
- for (int i = 0; i < data.length; i++){
- block[offset++] = data[i];
- }
-
- BigInteger m, e, message;
- byte[] messageByte;
-
- m = new BigInteger(1, public_key_modulus);
- e = new BigInteger(1, public_key_exponent);
- message = new BigInteger(1, block);
- message = message.modPow(e, m);
-
- byte[] messageByteTemp = message.toByteArray();
- messageByte = new byte[public_key_modulus.length];
-
- int tempOffset = 0;
- while (messageByteTemp[tempOffset] == 0){
- tempOffset++;
- }
-
- for (int i = messageByte.length - messageByteTemp.length + tempOffset; i < messageByte.length; i++){
- messageByte[i] = messageByteTemp[tempOffset++];
- }
-
- return messageByte;
-}
-}
+package org.eclipse.team.internal.ccvs.ssh;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+
+class Misc {
+ private static MessageDigest md5 = null;
+ private static SecureRandom random = null;
+ private static long crc32_tab[] = {
+ 0x00000000L,
+ 0x77073096L,
+ 0xee0e612cL,
+ 0x990951baL,
+ 0x076dc419L,
+ 0x706af48fL,
+ 0xe963a535L,
+ 0x9e6495a3L,
+ 0x0edb8832L,
+ 0x79dcb8a4L,
+ 0xe0d5e91eL,
+ 0x97d2d988L,
+ 0x09b64c2bL,
+ 0x7eb17cbdL,
+ 0xe7b82d07L,
+ 0x90bf1d91L,
+ 0x1db71064L,
+ 0x6ab020f2L,
+ 0xf3b97148L,
+ 0x84be41deL,
+ 0x1adad47dL,
+ 0x6ddde4ebL,
+ 0xf4d4b551L,
+ 0x83d385c7L,
+ 0x136c9856L,
+ 0x646ba8c0L,
+ 0xfd62f97aL,
+ 0x8a65c9ecL,
+ 0x14015c4fL,
+ 0x63066cd9L,
+ 0xfa0f3d63L,
+ 0x8d080df5L,
+ 0x3b6e20c8L,
+ 0x4c69105eL,
+ 0xd56041e4L,
+ 0xa2677172L,
+ 0x3c03e4d1L,
+ 0x4b04d447L,
+ 0xd20d85fdL,
+ 0xa50ab56bL,
+ 0x35b5a8faL,
+ 0x42b2986cL,
+ 0xdbbbc9d6L,
+ 0xacbcf940L,
+ 0x32d86ce3L,
+ 0x45df5c75L,
+ 0xdcd60dcfL,
+ 0xabd13d59L,
+ 0x26d930acL,
+ 0x51de003aL,
+ 0xc8d75180L,
+ 0xbfd06116L,
+ 0x21b4f4b5L,
+ 0x56b3c423L,
+ 0xcfba9599L,
+ 0xb8bda50fL,
+ 0x2802b89eL,
+ 0x5f058808L,
+ 0xc60cd9b2L,
+ 0xb10be924L,
+ 0x2f6f7c87L,
+ 0x58684c11L,
+ 0xc1611dabL,
+ 0xb6662d3dL,
+ 0x76dc4190L,
+ 0x01db7106L,
+ 0x98d220bcL,
+ 0xefd5102aL,
+ 0x71b18589L,
+ 0x06b6b51fL,
+ 0x9fbfe4a5L,
+ 0xe8b8d433L,
+ 0x7807c9a2L,
+ 0x0f00f934L,
+ 0x9609a88eL,
+ 0xe10e9818L,
+ 0x7f6a0dbbL,
+ 0x086d3d2dL,
+ 0x91646c97L,
+ 0xe6635c01L,
+ 0x6b6b51f4L,
+ 0x1c6c6162L,
+ 0x856530d8L,
+ 0xf262004eL,
+ 0x6c0695edL,
+ 0x1b01a57bL,
+ 0x8208f4c1L,
+ 0xf50fc457L,
+ 0x65b0d9c6L,
+ 0x12b7e950L,
+ 0x8bbeb8eaL,
+ 0xfcb9887cL,
+ 0x62dd1ddfL,
+ 0x15da2d49L,
+ 0x8cd37cf3L,
+ 0xfbd44c65L,
+ 0x4db26158L,
+ 0x3ab551ceL,
+ 0xa3bc0074L,
+ 0xd4bb30e2L,
+ 0x4adfa541L,
+ 0x3dd895d7L,
+ 0xa4d1c46dL,
+ 0xd3d6f4fbL,
+ 0x4369e96aL,
+ 0x346ed9fcL,
+ 0xad678846L,
+ 0xda60b8d0L,
+ 0x44042d73L,
+ 0x33031de5L,
+ 0xaa0a4c5fL,
+ 0xdd0d7cc9L,
+ 0x5005713cL,
+ 0x270241aaL,
+ 0xbe0b1010L,
+ 0xc90c2086L,
+ 0x5768b525L,
+ 0x206f85b3L,
+ 0xb966d409L,
+ 0xce61e49fL,
+ 0x5edef90eL,
+ 0x29d9c998L,
+ 0xb0d09822L,
+ 0xc7d7a8b4L,
+ 0x59b33d17L,
+ 0x2eb40d81L,
+ 0xb7bd5c3bL,
+ 0xc0ba6cadL,
+ 0xedb88320L,
+ 0x9abfb3b6L,
+ 0x03b6e20cL,
+ 0x74b1d29aL,
+ 0xead54739L,
+ 0x9dd277afL,
+ 0x04db2615L,
+ 0x73dc1683L,
+ 0xe3630b12L,
+ 0x94643b84L,
+ 0x0d6d6a3eL,
+ 0x7a6a5aa8L,
+ 0xe40ecf0bL,
+ 0x9309ff9dL,
+ 0x0a00ae27L,
+ 0x7d079eb1L,
+ 0xf00f9344L,
+ 0x8708a3d2L,
+ 0x1e01f268L,
+ 0x6906c2feL,
+ 0xf762575dL,
+ 0x806567cbL,
+ 0x196c3671L,
+ 0x6e6b06e7L,
+ 0xfed41b76L,
+ 0x89d32be0L,
+ 0x10da7a5aL,
+ 0x67dd4accL,
+ 0xf9b9df6fL,
+ 0x8ebeeff9L,
+ 0x17b7be43L,
+ 0x60b08ed5L,
+ 0xd6d6a3e8L,
+ 0xa1d1937eL,
+ 0x38d8c2c4L,
+ 0x4fdff252L,
+ 0xd1bb67f1L,
+ 0xa6bc5767L,
+ 0x3fb506ddL,
+ 0x48b2364bL,
+ 0xd80d2bdaL,
+ 0xaf0a1b4cL,
+ 0x36034af6L,
+ 0x41047a60L,
+ 0xdf60efc3L,
+ 0xa867df55L,
+ 0x316e8eefL,
+ 0x4669be79L,
+ 0xcb61b38cL,
+ 0xbc66831aL,
+ 0x256fd2a0L,
+ 0x5268e236L,
+ 0xcc0c7795L,
+ 0xbb0b4703L,
+ 0x220216b9L,
+ 0x5505262fL,
+ 0xc5ba3bbeL,
+ 0xb2bd0b28L,
+ 0x2bb45a92L,
+ 0x5cb36a04L,
+ 0xc2d7ffa7L,
+ 0xb5d0cf31L,
+ 0x2cd99e8bL,
+ 0x5bdeae1dL,
+ 0x9b64c2b0L,
+ 0xec63f226L,
+ 0x756aa39cL,
+ 0x026d930aL,
+ 0x9c0906a9L,
+ 0xeb0e363fL,
+ 0x72076785L,
+ 0x05005713L,
+ 0x95bf4a82L,
+ 0xe2b87a14L,
+ 0x7bb12baeL,
+ 0x0cb61b38L,
+ 0x92d28e9bL,
+ 0xe5d5be0dL,
+ 0x7cdcefb7L,
+ 0x0bdbdf21L,
+ 0x86d3d2d4L,
+ 0xf1d4e242L,
+ 0x68ddb3f8L,
+ 0x1fda836eL,
+ 0x81be16cdL,
+ 0xf6b9265bL,
+ 0x6fb077e1L,
+ 0x18b74777L,
+ 0x88085ae6L,
+ 0xff0f6a70L,
+ 0x66063bcaL,
+ 0x11010b5cL,
+ 0x8f659effL,
+ 0xf862ae69L,
+ 0x616bffd3L,
+ 0x166ccf45L,
+ 0xa00ae278L,
+ 0xd70dd2eeL,
+ 0x4e048354L,
+ 0x3903b3c2L,
+ 0xa7672661L,
+ 0xd06016f7L,
+ 0x4969474dL,
+ 0x3e6e77dbL,
+ 0xaed16a4aL,
+ 0xd9d65adcL,
+ 0x40df0b66L,
+ 0x37d83bf0L,
+ 0xa9bcae53L,
+ 0xdebb9ec5L,
+ 0x47b2cf7fL,
+ 0x30b5ffe9L,
+ 0xbdbdf21cL,
+ 0xcabac28aL,
+ 0x53b39330L,
+ 0x24b4a3a6L,
+ 0xbad03605L,
+ 0xcdd70693L,
+ 0x54de5729L,
+ 0x23d967bfL,
+ 0xb3667a2eL,
+ 0xc4614ab8L,
+ 0x5d681b02L,
+ 0x2a6f2b94L,
+ 0xb40bbe37L,
+ 0xc30c8ea1L,
+ 0x5a05df1bL,
+ 0x2d02ef8dL
+ };
+static public long crc32(byte[] b, int off, int len) {
+ return crc32(b, off, len, 0);
+}
+/**
+ * Compute the crc Cyclic Redundancy Check, with the polynomial 0xedb88320,
+ * The polynomial is X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
+ * We take it "backwards" and put the highest-order term in the lowest-order bit.
+ * The X^32 term is "implied"; the LSB is the X^31 term, etc.
+ * The X^0 term (usually shown as "+1") results in the MSB being 1.
+ * so the poly is 0x04c11db7 (used for Ethernet)
+ * The buf will be the Padding, Packet type, and Data fields.
+ * The crc is computed before any encryption.
+ * R =X^n * M rem P M message P polynomial crc R : crc calculated.
+ * T(x) = x^n * M(x) + R(x) property: T rem P = 0
+ */
+static public long crc32(byte[] b, int off, int len, long crc32val) {
+ for (int i = 0; i < len; i++) {
+ crc32val = crc32_tab[(int) ((crc32val ^ b[off + i]) & 0xff)] ^ (crc32val >> 8);
+ }
+
+ return crc32val;
+}
+static public byte[] lengthEncode(byte[] b, int off, int len) throws IOException {
+ byte[] result = new byte[len + 4];
+ writeInt(len, result, 0);
+ System.arraycopy(b, off, result, 4, len);
+ return result;
+}
+static public byte[] readMpInt(InputStream is) throws IOException {
+ int a = (byte) is.read();
+ int b = (byte) is.read();
+
+ if(a == -1 || b == -1){
+ throw new IOException(Policy.bind("stream"));//$NON-NLS-1$
+ }
+
+ int bits = (a << 8) + b;
+ int bytes = (bits + 7) / 8;
+
+ byte[] result = new byte[bytes];
+
+ readFully(is, result);
+
+ return result;
+}
+public static byte[] md5(byte[] b) {
+ if (md5 == null) {
+ try {
+ md5 = MessageDigest.getInstance("MD5");//$NON-NLS-1$
+ } catch (NoSuchAlgorithmException e) {
+ }
+ }
+
+ return md5.digest(b);
+}
+public static byte[] md5(String s) {
+ return md5(s.getBytes());
+}
+public static void readFully(InputStream is, byte[] b) throws IOException {
+ readFully(is, b, 0, b.length);
+}
+public static void readFully(InputStream is, byte[] b, int off, int len) throws IOException {
+ int bytesRead = 0;
+ int totalBytesRead = 0;
+
+ while (totalBytesRead < len) {
+ bytesRead = is.read(b, totalBytesRead + off, len - totalBytesRead);
+
+ if (bytesRead == -1) {
+ throw new IOException(Policy.bind("stream"));//$NON-NLS-1$
+ }
+
+ totalBytesRead += bytesRead;
+ }
+}
+public static int readInt(byte[] arr, int off) throws IOException {
+ int a = arr[off] & 0xff;
+ int b = arr[off + 1] & 0xff;
+ int c = arr[off + 2] & 0xff;
+ int d = arr[off + 3] & 0xff;
+
+ return (a << 24) + (b << 16) + (c << 8) + d;
+}
+public static int readInt(InputStream is) throws IOException {
+ int a = is.read();
+ int b = is.read();
+ int c = is.read();
+ int d = is.read();
+
+ if (a == -1 || b == -1 || c == -1 || d == -1) {
+ throw new IOException(Policy.bind("stream"));//$NON-NLS-1$
+ }
+
+ return (a << 24) + (b << 16) + (c << 8) + d;
+}
+public static void skipFully(InputStream is, long n) throws IOException {
+ while (n != 0) {
+ int b = is.read();
+
+ if (b == -1) {
+ if (n > 0) {
+ throw new IOException(Policy.bind("stream"));//$NON-NLS-1$
+ }
+
+ return;
+ }
+
+ --n;
+ }
+}
+public static void writeInt(int i, byte[] b, int off) {
+ b[off] = (byte) ((i >> 24) & 0xff);
+ b[off + 1] = (byte) ((i >> 16) & 0xff);
+ b[off + 2] = (byte) ((i >> 8) & 0xff);
+ b[off + 3] = (byte) (i & 0xff);
+}
+static public void xor(byte[] src_a, int off_a, byte[] src_b, int off_b, byte[] dst, int dst_off, int len) {
+ for(int i = 0; i < len; ++i){
+ dst[i + dst_off] = (byte) (src_a[i + off_a] ^ src_b[i + off_b]);
+ }
+}
+static public void random(byte[] b, int off, int len, boolean allowZeroBytes) {
+ if (random == null) {
+ try {
+ random = SecureRandom.getInstance("SHA1PRNG");//$NON-NLS-1$
+ } catch (NoSuchAlgorithmException e) {
+ }
+ }
+
+ for(int i = off; i < off + len; ++i){
+ do {
+ b[i] = (byte) random.nextInt();
+ } while(!allowZeroBytes && b[i] == 0);
+ }
+}
+static public byte[] encryptRSAPkcs1(byte[] data, byte[] public_key_exponent, byte[] public_key_modulus) {
+ byte[] block;
+
+ int offset = 0;
+ block = new byte[public_key_modulus.length];
+ block[offset++] = 0;
+ block[offset++] = 2;
+
+ Misc.random(block, offset, block.length - data.length - 3, false);
+ offset += block.length - data.length - 3;
+
+ block[offset++] = 0;
+
+ for (int i = 0; i < data.length; i++){
+ block[offset++] = data[i];
+ }
+
+ BigInteger m, e, message;
+ byte[] messageByte;
+
+ m = new BigInteger(1, public_key_modulus);
+ e = new BigInteger(1, public_key_exponent);
+ message = new BigInteger(1, block);
+ message = message.modPow(e, m);
+
+ byte[] messageByteTemp = message.toByteArray();
+ messageByte = new byte[public_key_modulus.length];
+
+ int tempOffset = 0;
+ while (messageByteTemp[tempOffset] == 0){
+ tempOffset++;
+ }
+
+ for (int i = messageByte.length - messageByteTemp.length + tempOffset; i < messageByte.length; i++){
+ messageByte[i] = messageByteTemp[tempOffset++];
+ }
+
+ return messageByte;
+}
+}
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Policy.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Policy.java
new file mode 100644
index 000000000..efa38c8fe
--- /dev/null
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Policy.java
@@ -0,0 +1,50 @@
+package org.eclipse.team.internal.ccvs.ssh;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2002.
+ * All Rights Reserved.
+ */
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Policy {
+ protected static ResourceBundle bundle = null;
+
+ /**
+ * Creates a NLS catalog for the given locale.
+ */
+ public static void localize(String bundleName) {
+ bundle = ResourceBundle.getBundle(bundleName);
+ }
+
+ /**
+ * Gets a string from the resource bundle. We don't want to crash because of a missing String.
+ * Returns the key if not found.
+ */
+ public static String bind(String key) {
+ try {
+ return bundle.getString(key);
+ } catch (MissingResourceException e) {
+ return key;
+ } catch (NullPointerException e) {
+ return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ /**
+ * Gets a string from the resource bundle and binds it with the given arguments. If the key is
+ * not found, return the key.
+ */
+ public static String bind(String key, Object[] args) {
+ try {
+ return MessageFormat.format(bind(key), args);
+ } catch (MissingResourceException e) {
+ return key;
+ } catch (NullPointerException e) {
+ return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHMethod.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHMethod.java
index 64908f8eb..8ef89fd3f 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHMethod.java
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHMethod.java
@@ -1,26 +1,26 @@
-package org.eclipse.team.internal.ccvs.ssh;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.team.ccvs.core.ICVSRepositoryLocation;
-import org.eclipse.team.ccvs.core.IConnectionMethod;
-import org.eclipse.team.ccvs.core.IServerConnection;
-
-public class SSHMethod implements IConnectionMethod {
- /**
- * @see IConnectionMethod#getName
- */
- public String getName() {
- return "extssh";
- }
-
- /**
- * @see IConnectionMethod#createConnection
- */
- public IServerConnection createConnection(ICVSRepositoryLocation repositoryRoot, String password) {
- return new SSHServerConnection(repositoryRoot, password);
- }
-
-}
+package org.eclipse.team.internal.ccvs.ssh;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+import org.eclipse.team.ccvs.core.ICVSRepositoryLocation;
+import org.eclipse.team.ccvs.core.IConnectionMethod;
+import org.eclipse.team.ccvs.core.IServerConnection;
+
+public class SSHMethod implements IConnectionMethod {
+ /**
+ * @see IConnectionMethod#getName
+ */
+ public String getName() {
+ return "extssh";//$NON-NLS-1$
+ }
+
+ /**
+ * @see IConnectionMethod#createConnection
+ */
+ public IServerConnection createConnection(ICVSRepositoryLocation repositoryRoot, String password) {
+ return new SSHServerConnection(repositoryRoot, password);
+ }
+
+}
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPlugin.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPlugin.java
index 7cf1eec15..762ababf1 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPlugin.java
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPlugin.java
@@ -1 +1 @@
-package org.eclipse.team.internal.ccvs.ssh; /* * (c) Copyright IBM Corp. 2000, 2001. * All Rights Reserved. */ import org.eclipse.core.runtime.IPluginDescriptor; import org.eclipse.core.runtime.Plugin; import java.util.ResourceBundle; import java.util.MissingResourceException; import java.text.MessageFormat; public class SSHPlugin extends Plugin { private static ResourceBundle resourceBundle; public static String ID = "org.eclipse.team.cvs.ssh"; /** * Constructor for SSHPlugin */ public SSHPlugin(IPluginDescriptor d) { super(d); try { resourceBundle = ResourceBundle.getBundle("org.eclipse.team.internal.ccvs.ssh.SSHPluginResources"); } catch (MissingResourceException e) { resourceBundle = null; } } /** * Gets a string from the resource bundle. * We don't want to crash because of a missing String. * Returns the key if not found. */ public static String getResourceString(String key) { try { return resourceBundle.getString(key); } catch (MissingResourceException e) { return key; } catch (NullPointerException e) { return "!" + key + "!"; } } /** * Gets a string from the resource bundle and binds it * with the given arguments. If the key is not found, * return the key. */ public static String getResourceString(String key, Object[] args) { try { return MessageFormat.format(getResourceString(key), args); } catch (MissingResourceException e) { return key; } catch (NullPointerException e) { return "!" + key + "!"; } } } \ No newline at end of file
+package org.eclipse.team.internal.ccvs.ssh; /* * (c) Copyright IBM Corp. 2000, 2002. * All Rights Reserved. */ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPluginDescriptor; import org.eclipse.core.runtime.Plugin; public class SSHPlugin extends Plugin { public static String ID = "org.eclipse.team.cvs.ssh";//$NON-NLS-1$ /** * Constructor for SSHPlugin */ public SSHPlugin(IPluginDescriptor d) { super(d); } /** * @see Plugin#startup() */ public void startup() throws CoreException { super.startup(); Policy.localize("org.eclipse.team.internal.ccvs.ssh.messages"); //$NON-NLS-1$ } } \ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java
index 28fd43708..6a568bdaa 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java
@@ -16,7 +16,7 @@ import org.eclipse.team.internal.ccvs.core.connection.CVSAuthenticationException
public class SSHServerConnection implements IServerConnection {
// command to start remote cvs in server mode
- private static final String INVOKE_SVR_CMD = "cvs server";
+ private static final String INVOKE_SVR_CMD = "cvs server"; //$NON-NLS-1$
private static final int DEFAULT_PORT = 22;
@@ -64,7 +64,7 @@ public class SSHServerConnection implements IServerConnection {
* @see Connection.open()
*/
public void open(IProgressMonitor monitor) throws IOException, CVSAuthenticationException {
- monitor.subTask("Authenticating over extssh");
+ monitor.subTask(Policy.bind("SSHServerConnection.authenticating")); //$NON-NLS-1$
monitor.worked(1);
String hostname = location.getHost();
String username = location.getUsername();
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/ServerPacket.java b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/ServerPacket.java
index c3e7b1022..7fcc895b2 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/ServerPacket.java
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/ServerPacket.java
@@ -1,158 +1,158 @@
-package org.eclipse.team.internal.ccvs.ssh;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-class ServerPacket extends Packet {
- private PacketInputStream pis = null;
-
- private static class PacketInputStream extends FilterInputStream {
- private static int MAX_BUFFER_SIZE = 1024;
-
- private byte[] buffer = new byte[MAX_BUFFER_SIZE];
- private int bufpos = 0;
- private int buflen = 0;
- private int bufrem = 0;
-
- private long remaining = 0;
- private Cipher cipher = null;
-
- private long crc = 0;
- private boolean closed = false;
-
- public PacketInputStream(InputStream in, long length, Cipher cipher) {
- super(in);
-
- this.remaining = length;
- this.cipher = cipher;
- }
-
- public int available() throws IOException {
- if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
- }
-
- return (int) Math.min(remaining - 4, Integer.MAX_VALUE);
- }
-
- public void close() throws IOException {
- close(true);
- }
-
- public void close(boolean doCrcCheck) throws IOException {
- if (!closed) {
- try {
- long toRead = doCrcCheck ? remaining - 4 : remaining;
-
- try {
- Misc.skipFully(this, toRead);
- } catch(IOException e) {
- // we tried our best, keep going
- }
-
- if(doCrcCheck) {
- if ((int) crc != Misc.readInt(buffer, bufpos)) {
- throw new IOException(SSHPlugin.getResourceString("ServerPacket.crc"));
- }
- }
- } finally {
- closed = true;
- }
- }
- }
-
- private void fill() throws IOException {
- if (bufrem > 0) {
- System.arraycopy(buffer, bufpos, buffer, 0, bufrem);
- }
-
- int totalBytesRead = bufrem;
- int read = 0;
- int toRead = (int)Math.min(remaining - totalBytesRead, MAX_BUFFER_SIZE - totalBytesRead);
-
- while (toRead > 0) {
- read = in.read(buffer, totalBytesRead, toRead);
-
- if (read == -1) {
- throw new IOException(SSHPlugin.getResourceString("stream"));
- }
-
- totalBytesRead += read;
- toRead -= read;
- }
-
- bufpos = 0;
-
- buflen = (totalBytesRead / 8) * 8;
- bufrem = totalBytesRead - buflen;
-
- if (cipher != null) {
- cipher.decipher(buffer, 0, buffer, 0, buflen);
- }
-
- crc = Misc.crc32(buffer, 0, buflen == remaining ? buflen - 4 : buflen, crc);
- }
-
- public int read() throws IOException {
- if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
- }
-
- if (remaining - 4 == 0) {
- return -1;
- }
-
- if (bufpos == buflen) {
- fill();
- }
-
- int b = buffer[bufpos] & 0xff;
-
- ++bufpos;
- --remaining;
-
- return b;
- }
-
- public int read(byte b[], int off, int len) throws IOException {
- if (closed) {
- throw new IOException(SSHPlugin.getResourceString("closed"));
- }
-
- if (remaining - 4 == 0) {
- return -1;
- }
-
- if (bufpos == buflen) {
- fill();
- }
-
- len = (int) Math.min(len, (buflen == remaining + bufpos ? buflen - 4 : buflen) - bufpos);
-
- System.arraycopy(buffer, bufpos, b, off, len);
-
- bufpos += len;
- remaining -= len;
-
- return len;
- }
- }
-public ServerPacket(InputStream is, Cipher cipher) throws java.io.IOException {
- packetLength = Misc.readInt(is);
- paddingLength = 8 - (packetLength % 8);
- pis = new PacketInputStream(is, packetLength + paddingLength, cipher);
- Misc.skipFully(pis, paddingLength);
- packetType = (byte) pis.read();
-}
-public void close(boolean doCrcCheck) throws IOException {
- pis.close(doCrcCheck);
-}
-public InputStream getInputStream() {
- return pis;
-}
-}
+package org.eclipse.team.internal.ccvs.ssh;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+class ServerPacket extends Packet {
+ private PacketInputStream pis = null;
+
+ private static class PacketInputStream extends FilterInputStream {
+ private static int MAX_BUFFER_SIZE = 1024;
+
+ private byte[] buffer = new byte[MAX_BUFFER_SIZE];
+ private int bufpos = 0;
+ private int buflen = 0;
+ private int bufrem = 0;
+
+ private long remaining = 0;
+ private Cipher cipher = null;
+
+ private long crc = 0;
+ private boolean closed = false;
+
+ public PacketInputStream(InputStream in, long length, Cipher cipher) {
+ super(in);
+
+ this.remaining = length;
+ this.cipher = cipher;
+ }
+
+ public int available() throws IOException {
+ if (closed) {
+ throw new IOException(Policy.bind("closed"));//$NON-NLS-1$
+ }
+
+ return (int) Math.min(remaining - 4, Integer.MAX_VALUE);
+ }
+
+ public void close() throws IOException {
+ close(true);
+ }
+
+ public void close(boolean doCrcCheck) throws IOException {
+ if (!closed) {
+ try {
+ long toRead = doCrcCheck ? remaining - 4 : remaining;
+
+ try {
+ Misc.skipFully(this, toRead);
+ } catch(IOException e) {
+ // we tried our best, keep going
+ }
+
+ if(doCrcCheck) {
+ if ((int) crc != Misc.readInt(buffer, bufpos)) {
+ throw new IOException(Policy.bind("ServerPacket.crc"));//$NON-NLS-1$
+ }
+ }
+ } finally {
+ closed = true;
+ }
+ }
+ }
+
+ private void fill() throws IOException {
+ if (bufrem > 0) {
+ System.arraycopy(buffer, bufpos, buffer, 0, bufrem);
+ }
+
+ int totalBytesRead = bufrem;
+ int read = 0;
+ int toRead = (int)Math.min(remaining - totalBytesRead, MAX_BUFFER_SIZE - totalBytesRead);
+
+ while (toRead > 0) {
+ read = in.read(buffer, totalBytesRead, toRead);
+
+ if (read == -1) {
+ throw new IOException(Policy.bind("stream"));//$NON-NLS-1$
+ }
+
+ totalBytesRead += read;
+ toRead -= read;
+ }
+
+ bufpos = 0;
+
+ buflen = (totalBytesRead / 8) * 8;
+ bufrem = totalBytesRead - buflen;
+
+ if (cipher != null) {
+ cipher.decipher(buffer, 0, buffer, 0, buflen);
+ }
+
+ crc = Misc.crc32(buffer, 0, buflen == remaining ? buflen - 4 : buflen, crc);
+ }
+
+ public int read() throws IOException {
+ if (closed) {
+ throw new IOException(Policy.bind("closed"));//$NON-NLS-1$
+ }
+
+ if (remaining - 4 == 0) {
+ return -1;
+ }
+
+ if (bufpos == buflen) {
+ fill();
+ }
+
+ int b = buffer[bufpos] & 0xff;
+
+ ++bufpos;
+ --remaining;
+
+ return b;
+ }
+
+ public int read(byte b[], int off, int len) throws IOException {
+ if (closed) {
+ throw new IOException(Policy.bind("closed"));//$NON-NLS-1$
+ }
+
+ if (remaining - 4 == 0) {
+ return -1;
+ }
+
+ if (bufpos == buflen) {
+ fill();
+ }
+
+ len = (int) Math.min(len, (buflen == remaining + bufpos ? buflen - 4 : buflen) - bufpos);
+
+ System.arraycopy(buffer, bufpos, b, off, len);
+
+ bufpos += len;
+ remaining -= len;
+
+ return len;
+ }
+ }
+public ServerPacket(InputStream is, Cipher cipher) throws java.io.IOException {
+ packetLength = Misc.readInt(is);
+ paddingLength = 8 - (packetLength % 8);
+ pis = new PacketInputStream(is, packetLength + paddingLength, cipher);
+ Misc.skipFully(pis, paddingLength);
+ packetType = (byte) pis.read();
+}
+public void close(boolean doCrcCheck) throws IOException {
+ pis.close(doCrcCheck);
+}
+public InputStream getInputStream() {
+ return pis;
+}
+}
diff --git a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPluginResources.properties b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/messages.properties
index 5e05ca9cc..9ced29bfc 100644
--- a/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPluginResources.properties
+++ b/bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/messages.properties
@@ -18,3 +18,5 @@ Client.socket=Cannot connect to host: {0}
ServerPacket.crc=crc error
+SSHServerConnection.authenticating=Authenticating over extssh
+

Back to the top