Skip to content

Commit

Permalink
Ensure binding as map works
Browse files Browse the repository at this point in the history
  • Loading branch information
manuel-alvarez-alvarez committed Sep 13, 2024
1 parent a311e59 commit ecde2b8
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ class IastJersey2JettyTest extends IastRequestTestRunner {

void 'all form params'() {
when:
String url = buildUrl 'iast/all_form'
String url = buildUrl "iast/$variant"
def body = new FormBody.Builder()
.add('var1', 'foo')
.add('var1', 'bar')
Expand Down Expand Up @@ -187,6 +187,9 @@ class IastJersey2JettyTest extends IastRequestTestRunner {
value 'a b c'
range 0, 5, source(SourceTypes.REQUEST_PARAMETER_VALUE, 'var2', 'a b c')
}

where:
variant << ['all_form', 'all_form_map']
}

void 'cookie'() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ class IastResource {
return "IAST: ${pairList}"
}

@Path("/all_form_map")
@POST
@Produces(MediaType.TEXT_PLAIN)
String form(final MultivaluedMap<String, String> form) {
def pairList = collectMultiMap(form)
return "IAST: ${pairList}"
}

private static collectMultiMap(final MultivaluedMap<String, String> map) {
return map.keySet().sort().collect {key ->
final values = map[key]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ class IastJersey3JettyTest extends IastRequestTestRunner {

void 'all form params'() {
when:
String url = buildUrl 'iast/all_form'
String url = buildUrl "iast/$variant"
def body = new FormBody.Builder()
.add('var1', 'foo')
.add('var1', 'bar')
Expand Down Expand Up @@ -187,6 +187,9 @@ class IastJersey3JettyTest extends IastRequestTestRunner {
value 'a b c'
range 0, 5, source(SourceTypes.REQUEST_PARAMETER_VALUE, 'var2', 'a b c')
}

where:
variant << ['all_form', 'all_form_map']
}

void 'cookie'() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ class IastResource {
return "IAST: ${pairList}"
}

@Path("/all_form_map")
@POST
@Produces(MediaType.TEXT_PLAIN)
String form(final MultivaluedMap<String, String> form) {
def pairList = collectMultiMap(form)
return "IAST: ${pairList}"
}

private static collectMultiMap(final MultivaluedMap<String, String> map) {
return map.keySet().sort().collect {key ->
final values = map[key]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf;
import static datadog.trace.instrumentation.jersey.JerseyTaintHelper.taintMap;
import static datadog.trace.instrumentation.jersey.JerseyTaintHelper.taintMultiValuedMap;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.returns;
Expand Down Expand Up @@ -140,6 +141,9 @@ public static void onExit(
return;
}
module.taintObject(ctx, result, SourceTypes.REQUEST_BODY);
if (result instanceof Map) {
taintMap(ctx, module, SourceTypes.REQUEST_PARAMETER_VALUE, (Map<?, ?>) result);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,43 @@ public static void taintMultiValuedMap(
final byte type,
final Map<String, List<String>> target) {
final byte nameType = SourceTypes.namedSource(type);
final boolean reportName = nameType != type;
for (Map.Entry<String, List<String>> entry : target.entrySet()) {
final String name = entry.getKey();
module.taintString(ctx, name, nameType, name);
if (reportName) {
module.taintString(ctx, name, nameType, name);
}
for (String value : entry.getValue()) {
module.taintString(ctx, value, type, name);
}
}
}

public static void taintMap(
final IastContext ctx,
final PropagationModule module,
final byte type,
final Map<?, ?> target) {
final byte nameType = SourceTypes.namedSource(type);
final boolean reportName = nameType != type;
for (final Map.Entry<?, ?> entry : target.entrySet()) {
final Object key = entry.getKey();
if (key instanceof String) {
final String name = (String) key;
if (reportName) {
module.taintString(ctx, name, nameType, name);
}
final Object value = entry.getValue();
if (value instanceof String) {
module.taintString(ctx, (String) value, type, name);
} else if (value instanceof List) {
for (final Object item : (List<?>) value) {
if (item instanceof String) {
module.taintString(ctx, (String) item, type, name);
}
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package datadog.trace.instrumentation.jersey;

import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
import static datadog.trace.instrumentation.jersey.JerseyTaintHelper.taintMultiValuedMap;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;

Expand Down Expand Up @@ -70,12 +71,7 @@ public static void onExit(
return;
}
prop.taintObject(ctx, pathParams, SourceTypes.REQUEST_PATH_PARAMETER);
for (Map.Entry<String, List<String>> entry : pathParams.entrySet()) {
final String name = entry.getKey();
for (String value : entry.getValue()) {
prop.taintString(ctx, value, SourceTypes.REQUEST_PATH_PARAMETER, name);
}
}
taintMultiValuedMap(ctx, prop, SourceTypes.REQUEST_PATH_PARAMETER, pathParams);
}
}

Expand All @@ -98,13 +94,7 @@ public static void onExit(
return;
}
prop.taintObject(ctx, queryParams, SourceTypes.REQUEST_PARAMETER_VALUE);
for (Map.Entry<String, List<String>> entry : queryParams.entrySet()) {
final String name = entry.getKey();
prop.taintString(ctx, name, SourceTypes.REQUEST_PARAMETER_NAME, name);
for (String value : entry.getValue()) {
prop.taintString(ctx, value, SourceTypes.REQUEST_PARAMETER_VALUE, name);
}
}
taintMultiValuedMap(ctx, prop, SourceTypes.REQUEST_PARAMETER_VALUE, queryParams);
}
}
}

0 comments on commit ecde2b8

Please sign in to comment.