diff --git a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/artifact/ArtifactStagingService.java b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/artifact/ArtifactStagingService.java index 8b403f2f25f0..9f53527169f1 100644 --- a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/artifact/ArtifactStagingService.java +++ b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/artifact/ArtifactStagingService.java @@ -510,8 +510,10 @@ private String createFilename(String environment, RunnerApi.ArtifactInformation // all path separators. List components = Splitter.onPattern("[^A-Za-z-_.]]").splitToList(path); String base = components.get(components.size() - 1); + String sanitizedEnvironment = environment.replaceAll("[<>:\"/\\\\|?*]", "_"); return clip( - String.format("%s-%s-%s", idGenerator.getId(), clip(environment, 25), base), 100); + String.format("%s-%s-%s", idGenerator.getId(), clip(sanitizedEnvironment, 25), base), + 100); } private String clip(String s, int maxLength) { diff --git a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/artifact/ArtifactStagingServiceTest.java b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/artifact/ArtifactStagingServiceTest.java index 5610e4f5bb52..a1e86547cd4b 100644 --- a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/artifact/ArtifactStagingServiceTest.java +++ b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/artifact/ArtifactStagingServiceTest.java @@ -166,6 +166,27 @@ public void testStageArtifacts() throws InterruptedException, ExecutionException checkArtifacts(contentsList, staged.get("env2")); } + @Test + public void testStageArtifactsWithInvalidFilenameCharacters() + throws InterruptedException, ExecutionException { + String environment = "0:ref_Environment_default"; + List contentsList = ImmutableList.of("artifact-content"); + + stagingService.registerJob( + "stagingToken", + ImmutableMap.of( + environment, + Lists.transform(contentsList, FakeArtifactRetrievalService::resolvedArtifact))); + + ArtifactStagingService.offer(new FakeArtifactRetrievalService(), stagingStub, "stagingToken"); + + Map> staged = + stagingService.getStagedArtifacts("stagingToken"); + + assertEquals(1, staged.size()); + checkArtifacts(contentsList, staged.get(environment)); + } + private void checkArtifacts( List expectedContents, List staged) { assertEquals(