check repository path of hg hooks is in the hg directory, instead of path length check

This commit is contained in:
Sebastian Sdorra
2018-07-16 12:03:13 +02:00
parent 1e37dfb3a7
commit 01cbbe89da
2 changed files with 81 additions and 12 deletions

View File

@@ -103,20 +103,22 @@ public final class RepositoryUtil
public static String getRepositoryId(File baseDirectory, File directory) throws IOException {
String path = directory.getCanonicalPath();
int directoryLength = baseDirectory.getCanonicalPath().length();
String basePath = baseDirectory.getCanonicalPath();
Preconditions.checkArgument(
path.startsWith(basePath),
"repository path %s is not in the main repository path %s", path, basePath
);
String id = IOUtil.trimSeperatorChars(path.substring(basePath.length()));
Preconditions.checkArgument(
!id.contains("\\") && !id.contains("/"),
"got illegal repository directory with separators in id: %s", path
);
if (directoryLength < path.length())
{
String id = IOUtil.trimSeperatorChars(path.substring(directoryLength));
Preconditions.checkState(!id.contains("\\") && !id.contains("/"),
"got illegal repository directory with separators in id: " + path);
return id;
}
else
{
throw new IllegalStateException("path is shorter as the main repository path");
}
}
private static void searchRepositoryDirectories(List<File> repositories,
File directory, List<String> names)

View File

@@ -0,0 +1,67 @@
package sonia.scm.repository;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.io.File;
import java.io.IOException;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class RepositoryUtilTest {
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Mock
private AbstractRepositoryHandler<SimpleRepositoryConfig> repositoryHandler;
private SimpleRepositoryConfig repositoryConfig = new SimpleRepositoryConfig();
@Before
public void setUpMocks() {
when(repositoryHandler.getConfig()).thenReturn(repositoryConfig);
}
@Test
public void testGetRepositoryId() throws IOException {
File repositoryTypeRoot = temporaryFolder.newFolder();
repositoryConfig.setRepositoryDirectory(repositoryTypeRoot);
File repository = new File(repositoryTypeRoot, "abc");
String id = RepositoryUtil.getRepositoryId(repositoryHandler, repository.getPath());
assertEquals("abc", id);
}
@Test(expected = IllegalArgumentException.class)
public void testGetRepositoryIdWithInvalidPath() throws IOException {
File repositoryTypeRoot = temporaryFolder.newFolder();
repositoryConfig.setRepositoryDirectory(repositoryTypeRoot);
File repository = new File("/etc/abc");
String id = RepositoryUtil.getRepositoryId(repositoryHandler, repository.getPath());
assertEquals("abc", id);
}
@Test(expected = IllegalArgumentException.class)
public void testGetRepositoryIdWithInvalidPathButSameLength() throws IOException {
File repositoryTypeRoot = temporaryFolder.newFolder();
repositoryConfig.setRepositoryDirectory(repositoryTypeRoot);
System.out.println(repositoryTypeRoot);
File repository = new File(temporaryFolder.newFolder(), "abc");
System.out.println(repository);
String id = RepositoryUtil.getRepositoryId(repositoryHandler, repository.getPath());
assertEquals("abc", id);
}
}