Skip to content

Commit 649f481

Browse files
committed
sanitize revision parameter
1 parent bf01218 commit 649f481

File tree

3 files changed

+50
-23
lines changed

3 files changed

+50
-23
lines changed

opengrok-indexer/src/main/java/org/opengrok/indexer/web/Laundromat.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ public static String launderInput(String value) {
5151
return replaceAll(value, ESC_N_R_T_F, "_");
5252
}
5353

54+
/**
55+
* Sanitize {@code value} where it will be used in subsequent OpenGrok
56+
* (non-logging) processing.
57+
* @return {@code null} if null or else {@code value} with anything besides
58+
* alphanumeric or {@code :} characters removed.
59+
*/
60+
public static String launderRevision(String value) {
61+
return replaceAll(value, "[^a-zA-Z0-9:]", "");
62+
}
63+
5464
/**
5565
* Sanitize {@code value} where it will be used in a Lucene query.
5666
* @return {@code null} if null or else {@code value} with "pattern-breaking

opengrok-web/src/main/java/org/opengrok/web/PageConfig.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -711,13 +711,17 @@ public String getDefineTagsIndex() {
711711

712712
/**
713713
* Get the revision parameter {@code r} from the request.
714+
* Anything besides alphanumeric and {@code :} is removed via {@link Laundromat#launderInput(String)}.
714715
*
715716
* @return revision if found, an empty string otherwise.
716717
*/
717718
public String getRequestedRevision() {
718719
if (rev == null) {
719-
String tmp = Laundromat.launderInput(req.getParameter(QueryParameters.REVISION_PARAM));
720-
rev = (tmp != null && !tmp.isEmpty()) ? tmp : "";
720+
String tmp = Laundromat.launderRevision(req.getParameter(QueryParameters.REVISION_PARAM));
721+
rev = Optional.ofNullable(tmp)
722+
.filter(s -> !s.isEmpty())
723+
.orElse("");
724+
721725
}
722726
return rev;
723727
}

opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.io.File;
2727
import java.io.FileNotFoundException;
2828
import java.io.IOException;
29+
import java.net.URL;
2930
import java.nio.file.Files;
3031
import java.nio.file.Path;
3132
import java.nio.file.Paths;
@@ -34,13 +35,17 @@
3435
import java.util.List;
3536
import java.util.Map;
3637
import java.util.stream.Collectors;
38+
import java.util.stream.Stream;
3739

3840
import jakarta.servlet.http.HttpServletRequest;
41+
import org.apache.commons.lang3.tuple.Pair;
3942
import org.junit.jupiter.api.AfterAll;
4043
import org.junit.jupiter.api.BeforeAll;
4144
import org.junit.jupiter.api.Test;
4245
import org.junit.jupiter.api.condition.EnabledOnOs;
4346
import org.junit.jupiter.api.condition.OS;
47+
import org.junit.jupiter.params.ParameterizedTest;
48+
import org.junit.jupiter.params.provider.MethodSource;
4449
import org.opengrok.indexer.authorization.AuthControlFlag;
4550
import org.opengrok.indexer.authorization.AuthorizationFramework;
4651
import org.opengrok.indexer.authorization.AuthorizationPlugin;
@@ -79,7 +84,9 @@ public static void setUpClass() throws Exception {
7984
env.setHistoryEnabled(true);
8085

8186
repository = new TestRepository();
82-
repository.create(PageConfigTest.class.getResource("/repositories"));
87+
URL repositoryURL = PageConfigTest.class.getResource("/repositories");
88+
assertNotNull(repositoryURL);
89+
repository.create(repositoryURL);
8390
env.setRepositories(repository.getSourceRoot());
8491
}
8592

@@ -425,30 +432,36 @@ public String getPathInfo() {
425432
assertNull(rev);
426433
}
427434

428-
@Test
429-
void testGetRequestedRevision() {
430-
final String[] revisions = {"6c5588de", "", "6c5588de", "6c5588de", "6c5588de"};
431-
for (int i = 0; i < revisions.length; i++) {
432-
final int index = i;
433-
DummyHttpServletRequest req = new DummyHttpServletRequest() {
434-
@Override
435-
public String getParameter(String name) {
436-
if (name.equals("r")) {
437-
return revisions[index];
438-
}
439-
return null;
435+
private static Stream<Pair<String, String>> getParamsForTestGetRequestedRevision() {
436+
return Stream.of(Pair.of("6c5588de", "6c5588de"),
437+
Pair.of("10013:cb02e4e3d492", "10013:cb02e4e3d492"),
438+
Pair.of("", ""),
439+
Pair.of("(foo)\n", "foo"));
440+
}
441+
442+
@MethodSource("getParamsForTestGetRequestedRevision")
443+
@ParameterizedTest
444+
void testGetRequestedRevision(Pair<String, String> revisionParam) {
445+
final String actualRevision = revisionParam.getLeft();
446+
final String expectedRevision = revisionParam.getRight();
447+
DummyHttpServletRequest req = new DummyHttpServletRequest() {
448+
@Override
449+
public String getParameter(String name) {
450+
if (name.equals("r")) {
451+
return actualRevision;
440452
}
441-
};
453+
return null;
454+
}
455+
};
442456

443-
PageConfig cfg = PageConfig.get(req);
444-
String rev = cfg.getRequestedRevision();
457+
PageConfig cfg = PageConfig.get(req);
458+
String rev = cfg.getRequestedRevision();
445459

446-
assertNotNull(rev);
447-
assertEquals(revisions[i], rev);
448-
assertFalse(rev.contains("r="));
460+
assertNotNull(rev);
461+
assertEquals(expectedRevision, rev);
462+
assertFalse(rev.contains("r="));
449463

450-
PageConfig.cleanup(req);
451-
}
464+
PageConfig.cleanup(req);
452465
}
453466

454467
@Test

0 commit comments

Comments
 (0)