[git-bridge] add CORS support (#23892)

GitOrigin-RevId: 9e3d85e479746affd047434ec9ce2588b60ca76c
This commit is contained in:
Jakob Ackermann
2025-02-28 08:02:51 +00:00
committed by Copybot
parent 18fb4effb1
commit 14d9874b68
9 changed files with 149 additions and 3 deletions

View File

@@ -465,8 +465,12 @@ public class WLGitBridgeIntegrationTest {
@After
public void tearDown() {
server.stop();
wlgb.stop();
if (server != null) {
server.stop();
}
if (wlgb != null) {
wlgb.stop();
}
}
private void gitConfig(File dir) throws IOException, InterruptedException {
@@ -1391,6 +1395,80 @@ public class WLGitBridgeIntegrationTest {
assertTrue(f.exists());
}
@Test
public void noCors() throws IOException, ExecutionException, InterruptedException {
int gitBridgePort = 33893;
int mockServerPort = 3893;
server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
server.start();
server.setState(states.get("canServePushedFiles").get("state"));
wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
wlgb.run();
String url = "http://127.0.0.1:" + gitBridgePort + "/status";
Response response = asyncHttpClient().prepareGet(url).execute().get();
assertEquals(200, response.getStatusCode());
assertEquals("ok\n", response.getResponseBody());
assertNull(response.getHeader("Access-Control-Allow-Origin"));
}
@Test
public void cors() throws IOException, ExecutionException, InterruptedException {
int gitBridgePort = 33894;
int mockServerPort = 3894;
server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
server.start();
server.setState(states.get("canServePushedFiles").get("state"));
wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
wlgb.run();
String url = "http://127.0.0.1:" + gitBridgePort + "/status";
// Success
Response response =
asyncHttpClient()
.prepareOptions(url)
.setHeader("Origin", "https://localhost")
.execute()
.get();
assertEquals(200, response.getStatusCode());
assertEquals("", response.getResponseBody());
assertEquals("https://localhost", response.getHeader("Access-Control-Allow-Origin"));
response =
asyncHttpClient().prepareGet(url).setHeader("Origin", "https://localhost").execute().get();
assertEquals(200, response.getStatusCode());
assertEquals("ok\n", response.getResponseBody());
assertEquals("https://localhost", response.getHeader("Access-Control-Allow-Origin"));
// Deny
response =
asyncHttpClient()
.prepareOptions(url)
.setHeader("Origin", "https://not-localhost")
.execute()
.get();
assertEquals(403, response.getStatusCode());
assertEquals("", response.getResponseBody());
assertNull(response.getHeader("Access-Control-Allow-Origin"));
response =
asyncHttpClient()
.prepareGet(url)
.setHeader("Origin", "https://not-localhost")
.execute()
.get();
assertEquals(200, response.getStatusCode());
assertEquals("ok\n", response.getResponseBody());
assertNull(response.getHeader("Access-Control-Allow-Origin"));
}
private String makeConfigFile(int port, int apiPort) throws IOException {
return makeConfigFile(port, apiPort, null);
}
@@ -1409,6 +1487,7 @@ public class WLGitBridgeIntegrationTest {
+ " \"rootGitDirectory\": \""
+ wlgb.getAbsolutePath()
+ "\",\n"
+ " \"allowedCorsOrigins\": \"https://localhost\",\n"
+ " \"apiBaseUrl\": \"http://127.0.0.1:"
+ apiPort
+ "/api/v0\",\n"

View File

@@ -90,6 +90,7 @@ public class ConfigTest {
+ " \"bindIp\": \"127.0.0.1\",\n"
+ " \"idleTimeout\": 30000,\n"
+ " \"rootGitDirectory\": \"/var/wlgb/git\",\n"
+ " \"allowedCorsOrigins\": [],\n"
+ " \"apiBaseURL\": \"http://127.0.0.1:60000/api/v0/\",\n"
+ " \"postbackURL\": \"http://127.0.0.1/\",\n"
+ " \"serviceName\": \"Overleaf\",\n"

View File

@@ -50,7 +50,7 @@ public class BridgeTest {
gcJob = mock(GcJob.class);
bridge =
new Bridge(
new Config(0, "", 0, "", "", "", "", null, false, null, null, null, 0),
new Config(0, "", 0, "", null, "", "", "", null, false, null, null, null, 0),
lock,
repoStore,
dbStore,