Skip to content

Commit 4c53217

Browse files
committed
Merge branch 'master' into wuandy/OverlayRelease
# Conflicts: # firebase-firestore/src/test/java/com/google/firebase/firestore/local/LocalStoreTestCase.java
2 parents b7d6597 + 486abaf commit 4c53217

File tree

109 files changed

+2813
-1762
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+2813
-1762
lines changed

appcheck/firebase-appcheck-debug/src/test/java/com/google/firebase/appcheck/debug/internal/DebugAppCheckProviderTest.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,19 +102,6 @@ public void testPublicConstructor_nullFirebaseApp_expectThrows() {
102102
});
103103
}
104104

105-
@Test
106-
public void testPublicConstructor_nullProjectId_expectThrows() {
107-
FirebaseOptions firebaseOptionsNoProjectId =
108-
new FirebaseOptions.Builder().setApiKey(API_KEY).setApplicationId(APP_ID).build();
109-
when(mockFirebaseApp.getOptions()).thenReturn(firebaseOptionsNoProjectId);
110-
111-
assertThrows(
112-
IllegalArgumentException.class,
113-
() -> {
114-
new DebugAppCheckProvider(mockFirebaseApp, null);
115-
});
116-
}
117-
118105
@Test
119106
public void testDetermineDebugSecret_noStoredSecret_createsNewSecret() {
120107
// Sanity check

appcheck/firebase-appcheck-safetynet/src/main/java/com/google/firebase/appcheck/safetynet/internal/SafetyNetAppCheckProvider.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,28 @@ public class SafetyNetAppCheckProvider implements AppCheckProvider {
5757

5858
/** @param firebaseApp the FirebaseApp to which this Factory is tied. */
5959
public SafetyNetAppCheckProvider(@NonNull FirebaseApp firebaseApp) {
60-
this(firebaseApp, GoogleApiAvailability.getInstance(), Executors.newCachedThreadPool());
60+
this(
61+
firebaseApp,
62+
new NetworkClient(firebaseApp),
63+
GoogleApiAvailability.getInstance(),
64+
Executors.newCachedThreadPool());
6165
}
6266

6367
@VisibleForTesting
6468
SafetyNetAppCheckProvider(
6569
@NonNull FirebaseApp firebaseApp,
70+
@NonNull NetworkClient networkClient,
6671
@NonNull GoogleApiAvailability googleApiAvailability,
6772
@NonNull ExecutorService backgroundExecutor) {
6873
checkNotNull(firebaseApp);
74+
checkNotNull(networkClient);
6975
checkNotNull(googleApiAvailability);
76+
checkNotNull(backgroundExecutor);
7077
this.context = firebaseApp.getApplicationContext();
7178
this.apiKey = firebaseApp.getOptions().getApiKey();
7279
this.backgroundExecutor = backgroundExecutor;
7380
this.safetyNetClientTask = initSafetyNetClient(googleApiAvailability, this.backgroundExecutor);
74-
this.networkClient = new NetworkClient(firebaseApp);
81+
this.networkClient = networkClient;
7582
this.retryManager = new RetryManager();
7683
}
7784

appcheck/firebase-appcheck-safetynet/src/test/java/com/google/firebase/appcheck/safetynet/internal/SafetyNetAppCheckProviderTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ public void testPublicConstructor_nullFirebaseApp_expectThrows() {
9292
when(mockGoogleApiAvailability.isGooglePlayServicesAvailable(any()))
9393
.thenReturn(ConnectionResult.SERVICE_MISSING);
9494
SafetyNetAppCheckProvider provider =
95-
new SafetyNetAppCheckProvider(firebaseApp, mockGoogleApiAvailability, backgroundExecutor);
95+
new SafetyNetAppCheckProvider(
96+
firebaseApp, mockNetworkClient, mockGoogleApiAvailability, backgroundExecutor);
9697
assertThat(provider.getSafetyNetClientTask().isSuccessful()).isFalse();
9798
}
9899

@@ -101,7 +102,8 @@ public void testGetToken_googlePlayServicesIsNotAvailable_expectGetTokenTaskExce
101102
when(mockGoogleApiAvailability.isGooglePlayServicesAvailable(any()))
102103
.thenReturn(ConnectionResult.SERVICE_MISSING);
103104
SafetyNetAppCheckProvider provider =
104-
new SafetyNetAppCheckProvider(firebaseApp, mockGoogleApiAvailability, backgroundExecutor);
105+
new SafetyNetAppCheckProvider(
106+
firebaseApp, mockNetworkClient, mockGoogleApiAvailability, backgroundExecutor);
105107
assertThat(provider.getSafetyNetClientTask().isSuccessful()).isFalse();
106108

107109
Task<AppCheckToken> tokenTask = provider.getToken();

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
public class DefaultFirebaseAppCheck extends FirebaseAppCheck {
4141

4242
private static final long BUFFER_TIME_MILLIS = 5 * 60 * 1000; // 5 minutes in milliseconds
43-
private static final String HEART_BEAT_STORAGE_TAG = "fire-app-check";
4443

4544
private final FirebaseApp firebaseApp;
4645
private final Provider<UserAgentPublisher> userAgentPublisherProvider;
@@ -217,19 +216,14 @@ public Task<AppCheckToken> then(@NonNull Task<AppCheckToken> task) {
217216
});
218217
}
219218

220-
@Nullable
221-
String getUserAgent() {
222-
return userAgentPublisherProvider.get() != null
223-
? userAgentPublisherProvider.get().getUserAgent()
224-
: null;
219+
@NonNull
220+
Provider<UserAgentPublisher> getUserAgentPublisherProvider() {
221+
return userAgentPublisherProvider;
225222
}
226223

227-
@Nullable
228-
String getHeartbeatCode() {
229-
return heartBeatInfoProvider.get() != null
230-
? Integer.toString(
231-
heartBeatInfoProvider.get().getHeartBeatCode(HEART_BEAT_STORAGE_TAG).getCode())
232-
: null;
224+
@NonNull
225+
Provider<HeartBeatInfo> getHeartBeatInfoProvider() {
226+
return heartBeatInfoProvider;
233227
}
234228

235229
/** Sets the in-memory cached {@link AppCheckToken}. */

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

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@
2626
import com.google.android.gms.common.util.Hex;
2727
import com.google.firebase.FirebaseApp;
2828
import com.google.firebase.FirebaseException;
29+
import com.google.firebase.FirebaseOptions;
2930
import com.google.firebase.appcheck.FirebaseAppCheck;
31+
import com.google.firebase.heartbeatinfo.HeartBeatInfo;
32+
import com.google.firebase.heartbeatinfo.HeartBeatInfo.HeartBeat;
33+
import com.google.firebase.inject.Provider;
34+
import com.google.firebase.platforminfo.UserAgentPublisher;
3035
import java.io.BufferedOutputStream;
3136
import java.io.BufferedReader;
3237
import java.io.IOException;
@@ -58,12 +63,14 @@ public class NetworkClient {
5863
@VisibleForTesting static final String X_FIREBASE_CLIENT_LOG_TYPE = "X-Firebase-Client-Log-Type";
5964
@VisibleForTesting static final String X_ANDROID_PACKAGE = "X-Android-Package";
6065
@VisibleForTesting static final String X_ANDROID_CERT = "X-Android-Cert";
66+
private static final String HEART_BEAT_STORAGE_TAG = "fire-app-check";
6167

6268
private final Context context;
63-
private final DefaultFirebaseAppCheck firebaseAppCheck;
6469
private final String apiKey;
6570
private final String appId;
6671
private final String projectId;
72+
private final Provider<UserAgentPublisher> userAgentPublisherProvider;
73+
private final Provider<HeartBeatInfo> heartBeatInfoProvider;
6774

6875
@Retention(RetentionPolicy.SOURCE)
6976
@IntDef({UNKNOWN, SAFETY_NET, DEBUG})
@@ -74,15 +81,34 @@ public class NetworkClient {
7481
public static final int DEBUG = 2;
7582

7683
public NetworkClient(@NonNull FirebaseApp firebaseApp) {
77-
checkNotNull(firebaseApp);
78-
this.context = firebaseApp.getApplicationContext();
79-
this.firebaseAppCheck = (DefaultFirebaseAppCheck) FirebaseAppCheck.getInstance(firebaseApp);
80-
this.apiKey = firebaseApp.getOptions().getApiKey();
81-
this.appId = firebaseApp.getOptions().getApplicationId();
82-
this.projectId = firebaseApp.getOptions().getProjectId();
84+
this(
85+
firebaseApp.getApplicationContext(),
86+
firebaseApp.getOptions(),
87+
((DefaultFirebaseAppCheck) FirebaseAppCheck.getInstance(firebaseApp))
88+
.getUserAgentPublisherProvider(),
89+
((DefaultFirebaseAppCheck) FirebaseAppCheck.getInstance(firebaseApp))
90+
.getHeartBeatInfoProvider());
91+
}
92+
93+
@VisibleForTesting
94+
NetworkClient(
95+
@NonNull Context context,
96+
@NonNull FirebaseOptions firebaseOptions,
97+
@NonNull Provider<UserAgentPublisher> userAgentPublisherProvider,
98+
@NonNull Provider<HeartBeatInfo> heartBeatInfoProvider) {
99+
checkNotNull(context);
100+
checkNotNull(firebaseOptions);
101+
checkNotNull(userAgentPublisherProvider);
102+
checkNotNull(heartBeatInfoProvider);
103+
this.context = context;
104+
this.apiKey = firebaseOptions.getApiKey();
105+
this.appId = firebaseOptions.getApplicationId();
106+
this.projectId = firebaseOptions.getProjectId();
83107
if (projectId == null) {
84108
throw new IllegalArgumentException("FirebaseOptions#getProjectId cannot be null.");
85109
}
110+
this.userAgentPublisherProvider = userAgentPublisherProvider;
111+
this.heartBeatInfoProvider = heartBeatInfoProvider;
86112
}
87113

88114
/**
@@ -105,12 +131,17 @@ public AppCheckTokenResponse exchangeAttestationForAppCheckToken(
105131
urlConnection.setDoOutput(true);
106132
urlConnection.setFixedLengthStreamingMode(requestBytes.length);
107133
urlConnection.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON);
108-
if (firebaseAppCheck.getUserAgent() != null) {
109-
urlConnection.setRequestProperty(X_FIREBASE_CLIENT, firebaseAppCheck.getUserAgent());
134+
String userAgent = getUserAgent();
135+
if (userAgent != null) {
136+
urlConnection.setRequestProperty(X_FIREBASE_CLIENT, userAgent);
110137
}
111-
if (firebaseAppCheck.getHeartbeatCode() != null) {
138+
139+
// getHeartbeatCode should not be called multiple times, as subsequent calls will return
140+
// HeartBeat.NONE until the heartbeat is reset.
141+
HeartBeat heartBeat = getHeartbeatCode();
142+
if (heartBeat != HeartBeat.NONE) {
112143
urlConnection.setRequestProperty(
113-
X_FIREBASE_CLIENT_LOG_TYPE, firebaseAppCheck.getHeartbeatCode());
144+
X_FIREBASE_CLIENT_LOG_TYPE, Integer.toString(heartBeat.getCode()));
114145
}
115146

116147
// Headers for Android API key restrictions.
@@ -152,6 +183,18 @@ public AppCheckTokenResponse exchangeAttestationForAppCheckToken(
152183
}
153184
}
154185

186+
private String getUserAgent() {
187+
return userAgentPublisherProvider.get() != null
188+
? userAgentPublisherProvider.get().getUserAgent()
189+
: null;
190+
}
191+
192+
private HeartBeat getHeartbeatCode() {
193+
return heartBeatInfoProvider.get() != null
194+
? heartBeatInfoProvider.get().getHeartBeatCode(HEART_BEAT_STORAGE_TAG)
195+
: HeartBeat.NONE;
196+
}
197+
155198
/** Gets the Android package's SHA-1 fingerprint. */
156199
private String getFingerprintHashForPackage() {
157200
byte[] hash;

0 commit comments

Comments
 (0)