diff --git a/rse/plugins/org.eclipse.rse.services.ssh/src/org/eclipse/rse/services/ssh/files/SftpFileService.java b/rse/plugins/org.eclipse.rse.services.ssh/src/org/eclipse/rse/services/ssh/files/SftpFileService.java index b7e25f59bbd..73dadf46665 100644 --- a/rse/plugins/org.eclipse.rse.services.ssh/src/org/eclipse/rse/services/ssh/files/SftpFileService.java +++ b/rse/plugins/org.eclipse.rse.services.ssh/src/org/eclipse/rse/services/ssh/files/SftpFileService.java @@ -19,14 +19,14 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; import org.eclipse.core.runtime.IProgressMonitor; - import org.eclipse.rse.services.clientserver.NamePatternMatcher; import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.services.files.AbstractFileService; import org.eclipse.rse.services.files.IFileService; -import org.eclipse.rse.services.files.IHostFile; +import org.eclipse.rse.services.files.IHostFile; import org.eclipse.rse.services.ssh.ISshService; import org.eclipse.rse.services.ssh.ISshSessionProvider; @@ -406,14 +406,63 @@ public class SftpFileService extends AbstractFileService implements IFileService return result; } + private static Pattern fValidShellPattern = Pattern.compile("[a-zA-Z0-9._/]*"); //$NON-NLS-1$ + /** + * Quotes a string such that it can be used in a remote UNIX shell. + * On Windows, special characters likes quotes and dollar sign. and + * - most importantly - the backslash will not be quoted correctly. + * + * Newline is only quoted correctly in tcsh. But since this is mainly + * intended for file names, it should work OK in almost every case. + * + * @param s String to be quoted + * @return quoted string, or original if no quoting was necessary. + */ + public static String enQuote(String s) { + if(fValidShellPattern.matcher(s).matches()) { + return s; + } else { + StringBuffer buf = new StringBuffer(s.length()+16); + buf.append('"'); + for(int i=0; i