Skip to content

Commit f1644ff

Browse files
authored
[Appcheck] Use default message if getToken exception doesn't include one (#7640)
This addresses issue #7624. Previously, missing error messages in custom providers would the Task to fail with an null argument exception. The app check contract states that the task **will** succeed. In the case of error, the `AppCheckTokenResult` object returned will include the error information.
1 parent c8ada3c commit f1644ff

3 files changed

Lines changed: 45 additions & 2 deletions

File tree

appcheck/firebase-appcheck/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Unreleased
22

3+
- [fixed] Fixed a bug causing custom `AppCheckProvider` returning errors without a message to throw an exception.
4+
[#7624](//github.com/firebase/firebase-android-sdk/pull/7624)
5+
36
# 19.0.1
47

58
- [changed] Bumped internal dependencies.

appcheck/firebase-appcheck/src/main/java/com/google/firebase/appcheck/internal/DefaultFirebaseAppCheck.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,9 @@ public Task<AppCheckTokenResult> getToken(boolean forceRefresh) {
211211
return Tasks.forResult(
212212
DefaultAppCheckTokenResult.constructFromError(
213213
new FirebaseException(
214-
appCheckTokenTask.getException().getMessage(),
214+
getErrorMessageOrDefault(
215+
appCheckTokenTask.getException(),
216+
"Unknown error generating App Check token"),
215217
appCheckTokenTask.getException())));
216218
});
217219
});
@@ -234,7 +236,9 @@ public Task<AppCheckTokenResult> getLimitedUseToken() {
234236
return Tasks.forResult(
235237
DefaultAppCheckTokenResult.constructFromError(
236238
new FirebaseException(
237-
appCheckTokenTask.getException().getMessage(),
239+
getErrorMessageOrDefault(
240+
appCheckTokenTask.getException(),
241+
"Unknown error generating limited use App Check token"),
238242
appCheckTokenTask.getException())));
239243
});
240244
}
@@ -319,4 +323,8 @@ private boolean hasValidToken() {
319323
return cachedToken != null
320324
&& cachedToken.getExpireTimeMillis() - clock.currentTimeMillis() > BUFFER_TIME_MILLIS;
321325
}
326+
327+
private String getErrorMessageOrDefault(@NonNull Exception e, String defaultMessage) {
328+
return e.getMessage() != null ? e.getMessage() : defaultMessage;
329+
}
322330
}

appcheck/firebase-appcheck/src/test/java/com/google/firebase/appcheck/internal/DefaultFirebaseAppCheckTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,4 +450,36 @@ public void testGetLimitedUseToken_existingToken_requestsNewToken() {
450450

451451
verify(mockAppCheckProvider).getToken();
452452
}
453+
454+
@Test
455+
public void getToken_providerThrowsExceptionWithNullMessage_returnsResultWithError()
456+
throws Exception {
457+
defaultFirebaseAppCheck.installAppCheckProviderFactory(mockAppCheckProviderFactory);
458+
when(mockAppCheckProvider.getToken())
459+
.thenReturn(Tasks.forException(new Exception((String) null)));
460+
when(mockAppCheckProvider.getToken())
461+
.thenReturn(Tasks.forException(new Exception((String) null)));
462+
463+
Task<AppCheckTokenResult> tokenTask =
464+
defaultFirebaseAppCheck.getToken(/* forceRefresh= */ false);
465+
466+
assertThat(tokenTask.isComplete()).isTrue();
467+
assertThat(tokenTask.isSuccessful()).isTrue();
468+
assertThat(tokenTask.getResult().getError()).isNotNull();
469+
}
470+
471+
@Test
472+
public void getLimitedUseToken_providerThrowsExceptionWithNullMessage_returnsResultWithError()
473+
throws Exception {
474+
defaultFirebaseAppCheck.installAppCheckProviderFactory(mockAppCheckProviderFactory);
475+
when(mockAppCheckProvider.getToken())
476+
.thenReturn(Tasks.forException(new Exception((String) null)));
477+
when(mockAppCheckProvider.getToken())
478+
.thenReturn(Tasks.forException(new Exception((String) null)));
479+
480+
Task<AppCheckTokenResult> tokenTask = defaultFirebaseAppCheck.getLimitedUseToken();
481+
assertThat(tokenTask.isComplete()).isTrue();
482+
assertThat(tokenTask.isSuccessful()).isTrue();
483+
assertThat(tokenTask.getResult().getError()).isNotNull();
484+
}
453485
}

0 commit comments

Comments
 (0)