Skip to content

Commit 23683a0

Browse files
Skip auto user events when sign-up logic fails (#6964)
1 parent 2267ce3 commit 23683a0

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

dd-java-agent/instrumentation/spring-security-5/src/main/java17/datadog/trace/instrumentation/springsecurity5/SpringSecurityUserEventDecorator.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ public class SpringSecurityUserEventDecorator extends AppSecUserEventDecorator {
1818
public static final SpringSecurityUserEventDecorator DECORATE =
1919
new SpringSecurityUserEventDecorator();
2020

21-
public void onSignup(UserDetails user) {
21+
public void onSignup(UserDetails user, Throwable throwable) {
22+
// skip failures while signing up a user, later on, we might want to generate a separate event
23+
// for this case
24+
if (throwable != null) {
25+
return;
26+
}
27+
2228
UserEventTrackingMode mode = Config.get().getAppSecUserEventsTrackingMode();
2329
String userId = null;
2430
Map<String, String> metadata = null;

dd-java-agent/instrumentation/spring-security-5/src/main/java17/datadog/trace/instrumentation/springsecurity5/UserDetailsManagerAdvice.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
public class UserDetailsManagerAdvice {
88

99
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
10-
public static void onExit(@Advice.Argument(value = 0, readOnly = false) UserDetails user) {
10+
public static void onExit(
11+
@Advice.Argument(value = 0, readOnly = false) UserDetails user,
12+
@Advice.Thrown Throwable throwable) {
1113
if (ActiveSubsystems.APPSEC_ACTIVE) {
12-
SpringSecurityUserEventDecorator.DECORATE.onSignup(user);
14+
SpringSecurityUserEventDecorator.DECORATE.onSignup(user, throwable);
1315
}
1416
}
1517
}

dd-java-agent/instrumentation/spring-security-5/src/test/groovy/datadog/trace/instrumentation/springsecurity5/SpringBootBasedTest.groovy

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,6 @@ class SpringBootBasedTest extends AppSecHttpServerTest<ConfigurableApplicationCo
8383
injectSysConfig('dd.appsec.automated-user-events-tracking', 'extended')
8484
}
8585

86-
def setupSpec() {
87-
server = server()
88-
server.start()
89-
address = server.address()
90-
assert address.port > 0
91-
assert address.path.endsWith("/")
92-
println "$server started at: $address"
93-
}
94-
9586
Request.Builder request(TestEndpoint uri, String method, RequestBody body) {
9687
def url = HttpUrl.get(uri.resolve(address)).newBuilder()
9788
.encodedQuery(uri.rawQuery)
@@ -214,4 +205,30 @@ class SpringBootBasedTest extends AppSecHttpServerTest<ConfigurableApplicationCo
214205
span.getTag("appsec.events.users.login.success")['authorities'] == 'ROLE_USER'
215206
span.getTag("appsec.events.users.login.success")['accountNonLocked'] == 'true'
216207
}
208+
209+
void 'test failed signup'() {
210+
setup:
211+
final formBody = new FormBody.Builder()
212+
.add('username', randomString(1_000))
213+
.add('password', 'cant_create_me')
214+
.build()
215+
216+
final request = request(REGISTER, 'POST', formBody).build()
217+
218+
when:
219+
final response = client.newCall(request).execute()
220+
TEST_WRITER.waitForTraces(1)
221+
final span = TEST_WRITER.flatten().first() as DDSpan
222+
223+
then:
224+
response.code() == 500
225+
span.getTags().findAll { it.key.startsWith('appsec.events.users.signup') }.isEmpty()
226+
}
227+
228+
@SuppressWarnings('GroovyAssignabilityCheck')
229+
private static String randomString(int length) {
230+
return new Random().with { random ->
231+
(1..length).collect { Character.valueOf((char) (random.nextInt(26) + (char)'a')) }
232+
}.join()
233+
}
217234
}

0 commit comments

Comments
 (0)