1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-18 13:45:45 +02:00

[240704] Protect against illegal API use of getRemoteFileObject() with relative path as name

This commit is contained in:
Martin Oberhuber 2008-07-14 22:45:03 +00:00
parent 79870a2701
commit 0f7297d016
5 changed files with 75 additions and 27 deletions

View file

@ -1,7 +1,7 @@
#Fri Mar 28 14:14:24 CET 2008
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
org.eclipse.jdt.core.compiler.compliance=1.4
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
@ -68,4 +68,4 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=di
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.3
org.eclipse.jdt.core.compiler.source=1.4

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.rse.subsystems.files.core;singleton:=true
Bundle-Version: 3.0.0.qualifier
Bundle-Version: 3.0.1.qualifier
Bundle-Activator: org.eclipse.rse.internal.subsystems.files.core.Activator
Bundle-Localization: plugin
Require-Bundle: org.eclipse.ui,

View file

@ -7,6 +7,7 @@
#
# Contributors:
# IBM Corporation - initial API and implementation
# Martin Oberhuber (Wind River) - [240704] Protect against illegal API use of getRemoteFileObject() with relative path as name
###############################################################################
bin.includes = META-INF/,\
about.html,\
@ -15,5 +16,8 @@ bin.includes = META-INF/,\
.
source.. = src/
output.. = bin/
javacSource=1.4
javacTarget=1.4
src.includes = about.html,\
schema/

View file

@ -41,6 +41,7 @@
* Martin Oberhuber (Wind River) - [234038] Mark IRemoteFile stale when changing permissions
* Martin Oberhuber (Wind River) - [235360][ftp][ssh][local] Return proper "Root" IHostFile
* David McKnight (IBM) - [223461] [Refresh][api] Refresh expanded folder under filter refreshes Filter
* Martin Oberhuber (Wind River) - [240704] Protect against illegal API use of getRemoteFileObject() with relative path as name
*******************************************************************************/
package org.eclipse.rse.subsystems.files.core.servicesubsystem;
@ -54,6 +55,7 @@ import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.eclipse.rse.core.RSECorePlugin;
import org.eclipse.rse.core.events.ISystemRemoteChangeEvents;
@ -73,6 +75,7 @@ import org.eclipse.rse.services.clientserver.archiveutils.ArchiveHandlerManager;
import org.eclipse.rse.services.clientserver.messages.CommonMessages;
import org.eclipse.rse.services.clientserver.messages.ICommonMessageIds;
import org.eclipse.rse.services.clientserver.messages.SimpleSystemMessage;
import org.eclipse.rse.services.clientserver.messages.SystemElementNotFoundException;
import org.eclipse.rse.services.clientserver.messages.SystemMessage;
import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
import org.eclipse.rse.services.files.IFileService;
@ -174,6 +177,9 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
*/
public IRemoteFile getRemoteFileObject(IRemoteFile parent, String folderOrFileName, IProgressMonitor monitor) throws SystemMessageException
{
// Consistency would be totally messed up if folderOrFileName were a relative path
// Because IHostFiles would be incorrectly generated, getParent() would return wrong results etc
assert folderOrFileName.indexOf(getSeparator())<0;
// for bug 207095, implicit connect if the connection is not connected
checkIsConnected(monitor);
@ -183,6 +189,17 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
return file;
}
// Fallback in case of incorrect API usage
// TODO remove this in next release for Performance,
// since it is just for bad clients using the API incorrectly
if (folderOrFileName.indexOf(getSeparator()) >= 0) {
try {
throw new IllegalArgumentException("getRemoteFileObject: folderOrFileName must not be a relative path"); //$NON-NLS-1$
} catch (IllegalArgumentException e) {
Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Illegal API use: " + e.getLocalizedMessage(), e)); //$NON-NLS-1$
}
return getRemoteFileObject(fullPath, monitor);
}
IHostFile node = getFile(parent.getAbsolutePath(), folderOrFileName, monitor);
return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), parent, node);
@ -907,7 +924,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
public IRemoteFile createFolders(IRemoteFile folderToCreate, IProgressMonitor monitor) throws SystemMessageException
{
return createFolder(folderToCreate, monitor);
return createFolder(folderToCreate, monitor);
}
/**

View file

@ -11,6 +11,7 @@
* David McKnight (IBM) - [210109] store constants in IFileService rather than IFileServiceConstants
* Martin Oberhuber (Wind River) - organize, enable and tag test cases
* Martin Oberhuber (Wind River) - [240729] More flexible disabling of testcases
* Martin Oberhuber (Wind River) - [240704] Protect against illegal API use of getRemoteFileObject() with relative path as name
*******************************************************************************/
package org.eclipse.rse.tests.subsystems.files;
@ -471,4 +472,30 @@ public class FileSubsystemConsistencyTestCase extends RSEBaseConnectionTestCase
}
}
public void testGetRemoteFileRelativePath() throws Exception {
// for bug 240704
// -test-author-:MartinOberhuber
if (isTestDisabled())
return;
setupConnections();
for (int i = 0; i < _subSystems.size(); i++) {
IRemoteFileSubSystem ss = (IRemoteFileSubSystem) _subSystems.get(i);
ss.checkIsConnected(getDefaultProgressMonitor());
IRemoteFile homeDir = ss.getRemoteFileObject(".", getDefaultProgressMonitor());
assertTrue(homeDir.exists());
assertTrue(homeDir.isDirectory());
String sep = homeDir.getSeparator();
String relativePath = "rsetest" + System.currentTimeMillis() + sep + "foo" + sep + "bar";
try {
IRemoteFile subDir = ss.getRemoteFileObject(homeDir, relativePath, getDefaultProgressMonitor());
assertTrue(subDir.isDescendantOf(homeDir));
assertEquals("bar", subDir.getName());
assertFalse(subDir.exists());
assertFalse(subDir.isDirectory());
} catch (IllegalArgumentException e) {
// Expected here: IllegalArgumentException is OK
}
}
}
}