1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.http.test;
45
46 import static org.junit.Assert.assertEquals;
47 import static org.junit.Assert.assertFalse;
48 import static org.junit.Assert.assertNotNull;
49 import static org.junit.Assert.assertNull;
50 import static org.junit.Assert.fail;
51
52 import java.io.File;
53 import java.io.IOException;
54
55 import org.eclipse.jgit.errors.RepositoryNotFoundException;
56 import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
57 import org.eclipse.jgit.lib.Repository;
58 import org.eclipse.jgit.transport.resolver.FileResolver;
59 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
60 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
61 import org.eclipse.jgit.util.FileUtils;
62 import org.junit.Test;
63
64 public class FileResolverTest extends LocalDiskRepositoryTestCase {
65 @Test
66 public void testUnreasonableNames() throws ServiceNotEnabledException {
67 assertUnreasonable("");
68 assertUnreasonable("a\\b");
69 assertUnreasonable("../b");
70 assertUnreasonable("a/../b");
71 assertUnreasonable("a/./b");
72 assertUnreasonable("a//b");
73
74 if (new File("/foo").isAbsolute())
75 assertUnreasonable("/foo");
76
77 if (new File("//server/share").isAbsolute())
78 assertUnreasonable("//server/share");
79
80 if (new File("C:/windows").isAbsolute())
81 assertUnreasonable("C:/windows");
82 }
83
84 private static void assertUnreasonable(String name)
85 throws ServiceNotEnabledException {
86 FileResolver<RepositoryResolver> r = new FileResolver<>(
87 new File("."), false);
88 try {
89 r.open(null, name);
90 fail("Opened unreasonable name \"" + name + "\"");
91 } catch (RepositoryNotFoundException e) {
92 assertEquals("repository not found: " + name, e.getMessage());
93 assertNull("has no cause", e.getCause());
94 }
95 }
96
97 @Test
98 public void testExportOk() throws IOException {
99 final Repository a = createBareRepository();
100 final String name = a.getDirectory().getName();
101 final File base = a.getDirectory().getParentFile();
102 final File export = new File(a.getDirectory(), "git-daemon-export-ok");
103 FileResolver<RepositoryResolver> resolver;
104
105 assertFalse("no git-daemon-export-ok", export.exists());
106 resolver = new FileResolver<>(base, false
107
108
109 );
110 try {
111 resolver.open(null, name);
112 fail("opened non-exported repository");
113 } catch (ServiceNotEnabledException e) {
114 assertEquals("Service not enabled", e.getMessage());
115 }
116
117 resolver = new FileResolver<>(base, true
118
119
120 );
121 try {
122 resolver.open(null, name).close();
123 } catch (ServiceNotEnabledException e) {
124 fail("did not honor export-all flag");
125 }
126
127 FileUtils.createNewFile(export);
128 resolver = new FileResolver<>(base, false
129
130
131 );
132 try {
133 resolver.open(null, name).close();
134 } catch (ServiceNotEnabledException e) {
135 fail("did not honor git-daemon-export-ok");
136 }
137 }
138
139 @Test
140 public void testNotAGitRepository() throws IOException,
141 ServiceNotEnabledException {
142 final Repository a = createBareRepository();
143 final String name = a.getDirectory().getName() + "-not-a-git";
144 final File base = a.getDirectory().getParentFile();
145 FileResolver<RepositoryResolver> resolver = new FileResolver<>(
146 base, false);
147
148 try {
149 resolver.open(null, name);
150 } catch (RepositoryNotFoundException e) {
151 assertEquals("repository not found: " + name, e.getMessage());
152
153 Throwable why = e.getCause();
154 assertNotNull("has cause", why);
155 assertEquals("repository not found: "
156 + new File(base, name).getPath(), why.getMessage());
157 }
158 }
159 }