24
24
import androidx .annotation .VisibleForTesting ;
25
25
import com .google .android .gms .common .util .AndroidUtilsLight ;
26
26
import com .google .android .gms .common .util .Hex ;
27
+ import com .google .android .gms .tasks .Tasks ;
27
28
import com .google .firebase .FirebaseApp ;
28
29
import com .google .firebase .FirebaseException ;
29
30
import com .google .firebase .FirebaseOptions ;
30
31
import com .google .firebase .appcheck .FirebaseAppCheck ;
31
- import com .google .firebase .heartbeatinfo .HeartBeatInfo ;
32
- import com .google .firebase .heartbeatinfo .HeartBeatInfo .HeartBeat ;
32
+ import com .google .firebase .heartbeatinfo .HeartBeatController ;
33
33
import com .google .firebase .inject .Provider ;
34
- import com .google .firebase .platforminfo .UserAgentPublisher ;
35
34
import java .io .BufferedOutputStream ;
36
35
import java .io .BufferedReader ;
37
36
import java .io .IOException ;
@@ -60,17 +59,14 @@ public class NetworkClient {
60
59
private static final String APPLICATION_JSON = "application/json" ;
61
60
private static final String UTF_8 = "UTF-8" ;
62
61
@ VisibleForTesting static final String X_FIREBASE_CLIENT = "X-Firebase-Client" ;
63
- @ VisibleForTesting static final String X_FIREBASE_CLIENT_LOG_TYPE = "X-Firebase-Client-Log-Type" ;
64
62
@ VisibleForTesting static final String X_ANDROID_PACKAGE = "X-Android-Package" ;
65
63
@ VisibleForTesting static final String X_ANDROID_CERT = "X-Android-Cert" ;
66
- private static final String HEART_BEAT_STORAGE_TAG = "fire-app-check" ;
67
64
68
65
private final Context context ;
69
66
private final String apiKey ;
70
67
private final String appId ;
71
68
private final String projectId ;
72
- private final Provider <UserAgentPublisher > userAgentPublisherProvider ;
73
- private final Provider <HeartBeatInfo > heartBeatInfoProvider ;
69
+ private final Provider <HeartBeatController > heartBeatControllerProvider ;
74
70
75
71
@ Retention (RetentionPolicy .SOURCE )
76
72
@ IntDef ({UNKNOWN , SAFETY_NET , DEBUG })
@@ -85,30 +81,25 @@ public NetworkClient(@NonNull FirebaseApp firebaseApp) {
85
81
firebaseApp .getApplicationContext (),
86
82
firebaseApp .getOptions (),
87
83
((DefaultFirebaseAppCheck ) FirebaseAppCheck .getInstance (firebaseApp ))
88
- .getUserAgentPublisherProvider (),
89
- ((DefaultFirebaseAppCheck ) FirebaseAppCheck .getInstance (firebaseApp ))
90
- .getHeartBeatInfoProvider ());
84
+ .getHeartbeatControllerProvider ());
91
85
}
92
86
93
87
@ VisibleForTesting
94
88
NetworkClient (
95
89
@ NonNull Context context ,
96
90
@ NonNull FirebaseOptions firebaseOptions ,
97
- @ NonNull Provider <UserAgentPublisher > userAgentPublisherProvider ,
98
- @ NonNull Provider <HeartBeatInfo > heartBeatInfoProvider ) {
91
+ @ NonNull Provider <HeartBeatController > heartBeatControllerProvider ) {
99
92
checkNotNull (context );
100
93
checkNotNull (firebaseOptions );
101
- checkNotNull (userAgentPublisherProvider );
102
- checkNotNull (heartBeatInfoProvider );
94
+ checkNotNull (heartBeatControllerProvider );
103
95
this .context = context ;
104
96
this .apiKey = firebaseOptions .getApiKey ();
105
97
this .appId = firebaseOptions .getApplicationId ();
106
98
this .projectId = firebaseOptions .getProjectId ();
107
99
if (projectId == null ) {
108
100
throw new IllegalArgumentException ("FirebaseOptions#getProjectId cannot be null." );
109
101
}
110
- this .userAgentPublisherProvider = userAgentPublisherProvider ;
111
- this .heartBeatInfoProvider = heartBeatInfoProvider ;
102
+ this .heartBeatControllerProvider = heartBeatControllerProvider ;
112
103
}
113
104
114
105
/**
@@ -131,17 +122,9 @@ public AppCheckTokenResponse exchangeAttestationForAppCheckToken(
131
122
urlConnection .setDoOutput (true );
132
123
urlConnection .setFixedLengthStreamingMode (requestBytes .length );
133
124
urlConnection .setRequestProperty (CONTENT_TYPE , APPLICATION_JSON );
134
- String userAgent = getUserAgent ();
135
- if (userAgent != null ) {
136
- urlConnection .setRequestProperty (X_FIREBASE_CLIENT , userAgent );
137
- }
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 ) {
143
- urlConnection .setRequestProperty (
144
- X_FIREBASE_CLIENT_LOG_TYPE , Integer .toString (heartBeat .getCode ()));
125
+ String heartBeatHeader = getHeartBeat ();
126
+ if (heartBeatHeader != null ) {
127
+ urlConnection .setRequestProperty (X_FIREBASE_CLIENT , heartBeatHeader );
145
128
}
146
129
147
130
// Headers for Android API key restrictions.
@@ -183,18 +166,20 @@ public AppCheckTokenResponse exchangeAttestationForAppCheckToken(
183
166
}
184
167
}
185
168
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 ;
169
+ @ VisibleForTesting
170
+ String getHeartBeat () {
171
+ HeartBeatController controller = heartBeatControllerProvider .get ();
172
+ if (controller != null ) {
173
+ try {
174
+ return Tasks .await (controller .getHeartBeatsHeader ());
175
+ } catch (Exception e ) {
176
+ Log .w (TAG , "Unable to get heartbeats!" );
177
+ return null ;
178
+ }
179
+ } else {
180
+ return null ;
181
+ }
196
182
}
197
-
198
183
/** Gets the Android package's SHA-1 fingerprint. */
199
184
private String getFingerprintHashForPackage () {
200
185
byte [] hash ;
0 commit comments