Skip to content

Commit 2bede2b

Browse files
committed
fix: fix regex vulnerability
1 parent 4ce82f3 commit 2bede2b

2 files changed

Lines changed: 22 additions & 26 deletions

File tree

src/main/java/io/neonbee/entity/AbstractEntityVerticle.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public abstract class AbstractEntityVerticle<T> extends DataVerticle<T> {
9696
*/
9797
@VisibleForTesting
9898
static final Pattern URI_PATH_PATTERN =
99-
Pattern.compile("^/*((?:(.*)\\.)?(.*?))/(([A-Za-z_]\\w+).*?)(?:(?<=\\))/(.*))?$");
99+
Pattern.compile("^/*((?:(.+/?)\\.)?([^/]+))/(([A-Za-z_]\\w+)[^/]*)(?:/(.*))?$");
100100

101101
private static final LoggingFacade LOGGER = LoggingFacade.create();
102102

@@ -224,13 +224,13 @@ public static String getName(Class<? extends AbstractEntityVerticle> clazz) {
224224
*/
225225
@Override
226226
public void start(Promise<Void> promise) {
227-
vertx.eventBus().consumer(EVENT_BUS_MODELS_LOADED_ADDRESS, message -> {
228-
announceEntityVerticle(vertx).onFailure(throwable -> {
229-
if (LOGGER.isErrorEnabled()) {
230-
LOGGER.error("Updating announcements of entity verticle {} failed", getQualifiedName(), throwable);
231-
}
232-
});
233-
});
227+
vertx.eventBus().consumer(EVENT_BUS_MODELS_LOADED_ADDRESS,
228+
message -> announceEntityVerticle(vertx).onFailure(throwable -> {
229+
if (LOGGER.isErrorEnabled()) {
230+
LOGGER.error("Updating announcements of entity verticle {} failed", getQualifiedName(),
231+
throwable);
232+
}
233+
}));
234234
announceEntityVerticle(vertx).compose(nothing -> Future.<Void>future(super::start))
235235
.onSuccess(nothing -> {
236236
if (LOGGER.isInfoEnabled()) {

src/test/java/io/neonbee/entity/EntityVerticleTest.java

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,14 @@ void registerEntityTypes(VertxTestContext testContext) {
7979
Checkpoint checkpoint = testContext.checkpoint(2);
8080
registry.get(sharedEntityMapName(new FullQualifiedName("ERP.Customers")))
8181
.onComplete(testContext.succeeding(result -> {
82-
testContext.verify(() -> {
83-
assertThat((JsonArray) result).containsExactly(entityVerticleImpl1.getQualifiedName(),
84-
entityVerticleImpl2.getQualifiedName());
85-
});
82+
testContext.verify(() -> assertThat(result).containsExactly(entityVerticleImpl1.getQualifiedName(),
83+
entityVerticleImpl2.getQualifiedName()));
8684
checkpoint.flag();
8785
}));
8886
registry.get(sharedEntityMapName(new FullQualifiedName("Sales.Orders")))
8987
.onComplete(testContext.succeeding(result -> {
90-
testContext.verify(() -> {
91-
assertThat((JsonArray) result).containsExactly(entityVerticleImpl1.getQualifiedName());
92-
});
88+
testContext
89+
.verify(() -> assertThat(result).containsExactly(entityVerticleImpl1.getQualifiedName()));
9390
checkpoint.flag();
9491
}));
9592
}
@@ -116,13 +113,6 @@ void queryVerticlesForEntityType(Vertx vertx, VertxTestContext testContext) {
116113
void testEntityURIPathRegex() {
117114
Matcher matcher;
118115

119-
assertThat((matcher = URI_PATH_PATTERN.matcher("my.very/own.Service/Entity")).find()).isTrue();
120-
assertThat(matcher.group()).isEqualTo("my.very/own.Service/Entity");
121-
assertThat(matcher.group(SERVICE_NAMESPACE_GROUP)).isEqualTo("my.very/own.Service");
122-
assertThat(matcher.group(CDS_NAMESPACE_GROUP)).isEqualTo("my.very/own");
123-
assertThat(matcher.group(CDS_SERVICE_NAME_GROUP)).isEqualTo("Service");
124-
assertThat(matcher.group(ENTITY_SET_NAME_GROUP)).isEqualTo("Entity");
125-
126116
assertThat((matcher = URI_PATH_PATTERN.matcher("my.Service/Entity")).find()).isTrue();
127117
assertThat(matcher.group()).isEqualTo("my.Service/Entity");
128118
assertThat(matcher.group(SERVICE_NAMESPACE_GROUP)).isEqualTo("my.Service");
@@ -148,6 +138,13 @@ void testEntityURIPathRegex() {
148138

149139
assertThat((matcher = URI_PATH_PATTERN.matcher("Service/Entity/$count")).find()).isTrue();
150140
assertThat(matcher.group(ENTITY_SET_NAME_GROUP)).isEqualTo("Entity");
141+
142+
assertThat((matcher = URI_PATH_PATTERN.matcher("my.very/own.Service/Entity")).find()).isTrue();
143+
assertThat(matcher.group()).isEqualTo("my.very/own.Service/Entity");
144+
assertThat(matcher.group(SERVICE_NAMESPACE_GROUP)).isEqualTo("my.very/own.Service");
145+
assertThat(matcher.group(CDS_NAMESPACE_GROUP)).isEqualTo("my.very/own");
146+
assertThat(matcher.group(CDS_SERVICE_NAME_GROUP)).isEqualTo("Service");
147+
assertThat(matcher.group(ENTITY_SET_NAME_GROUP)).isEqualTo("Entity");
151148
}
152149

153150
@Test
@@ -229,9 +226,8 @@ public Future<Set<FullQualifiedName>> entityTypeNames() {
229226
}
230227
};
231228

232-
deployVerticle(dummyEntityVerticle).onComplete(testContext.succeeding(nextHandler -> {
233-
testVertx.eventBus().publish(EntityModelManager.EVENT_BUS_MODELS_LOADED_ADDRESS, null);
234-
}));
229+
deployVerticle(dummyEntityVerticle).onComplete(testContext.succeeding(
230+
nextHandler -> testVertx.eventBus().publish(EntityModelManager.EVENT_BUS_MODELS_LOADED_ADDRESS, null)));
235231
}
236232

237233
@Test
@@ -245,7 +241,7 @@ void testqueryWithSpecialCharacters(Vertx vertx, VertxTestContext testContext) {
245241
entityVerticleImpl1.parseUriInfo(vertx, dataQuery).onSuccess(uriInfo -> {
246242
assertThat(uriInfo).isNotNull();
247243
testContext.completeNow();
248-
}).onFailure(t -> testContext.failNow(t));
244+
}).onFailure(testContext::failNow);
249245
}
250246
}
251247

0 commit comments

Comments
 (0)