Skip to content

Commit 2702251

Browse files
committed
Validate base directory
Closes gh-1811
1 parent f5e06af commit 2702251

2 files changed

Lines changed: 56 additions & 0 deletions

File tree

initializr-web/src/main/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ public void convert(ProjectRequest request, MutableProjectDescription descriptio
119119
}
120120

121121
private void validate(ProjectRequest request, InitializrMetadata metadata) {
122+
validateBaseDir(request);
122123
validatePlatformVersion(request, metadata);
123124
validateType(request.getType(), metadata);
124125
validateLanguage(request.getLanguage(), metadata);
@@ -127,6 +128,17 @@ private void validate(ProjectRequest request, InitializrMetadata metadata) {
127128
validateDependencies(request, metadata);
128129
}
129130

131+
private void validateBaseDir(ProjectRequest request) {
132+
String baseDir = request.getBaseDir();
133+
if (baseDir == null) {
134+
return;
135+
}
136+
if (baseDir.contains("/") || baseDir.contains("\\") || baseDir.contains("..")) {
137+
throw new InvalidProjectRequestException(
138+
"Invalid baseDir '%s': must not contain path separators or '..'".formatted(baseDir));
139+
}
140+
}
141+
130142
private void validatePlatformVersion(ProjectRequest request, InitializrMetadata metadata) {
131143
Version platformVersion = Version.safeParse(request.getBootVersion());
132144
Platform platform = metadata.getConfiguration().getEnv().getPlatform();

initializr-web/src/test/java/io/spring/initializr/web/project/DefaultProjectRequestToDescriptionConverterTests.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,50 @@ void convertWhenPackageNameHasAccentCleanValue() {
7979
assertThat(description.getPackageName()).isEqualTo("com.example.app");
8080
}
8181

82+
@Test
83+
void convertWhenBaseDirContainsPathSeparatorShouldThrowException() {
84+
ProjectRequest request = createProjectRequest();
85+
request.setBaseDir("my/project");
86+
assertThatExceptionOfType(InvalidProjectRequestException.class)
87+
.isThrownBy(() -> this.converter.convert(request, this.metadata))
88+
.withMessageContaining("Invalid baseDir 'my/project'");
89+
}
90+
91+
@Test
92+
void convertWhenBaseDirContainsWindowsPathSeparatorShouldThrowException() {
93+
ProjectRequest request = createProjectRequest();
94+
request.setBaseDir("my\\project");
95+
assertThatExceptionOfType(InvalidProjectRequestException.class)
96+
.isThrownBy(() -> this.converter.convert(request, this.metadata))
97+
.withMessageContaining("Invalid baseDir 'my\\project'");
98+
}
99+
100+
@Test
101+
void convertWhenBaseDirContainsDotDotShouldThrowException() {
102+
ProjectRequest request = createProjectRequest();
103+
request.setBaseDir("../dirup");
104+
assertThatExceptionOfType(InvalidProjectRequestException.class)
105+
.isThrownBy(() -> this.converter.convert(request, this.metadata))
106+
.withMessageContaining("Invalid baseDir '../dirup'");
107+
}
108+
109+
@Test
110+
void convertWhenBaseDirIsExactlyDotDotShouldThrowException() {
111+
ProjectRequest request = createProjectRequest();
112+
request.setBaseDir("..");
113+
assertThatExceptionOfType(InvalidProjectRequestException.class)
114+
.isThrownBy(() -> this.converter.convert(request, this.metadata))
115+
.withMessageContaining("Invalid baseDir '..'");
116+
}
117+
118+
@Test
119+
void convertWhenBaseDirIsValidShouldSetBaseDirectory() {
120+
ProjectRequest request = createProjectRequest();
121+
request.setBaseDir("my-project");
122+
ProjectDescription description = this.converter.convert(request, this.metadata);
123+
assertThat(description.getBaseDirectory()).isEqualTo("my-project");
124+
}
125+
82126
@Test
83127
void convertWhenTypeIsInvalidShouldThrowException() {
84128
ProjectRequest request = createProjectRequest();

0 commit comments

Comments
 (0)