Skip to content

Commit 92814b7

Browse files
Log warnings for invalid custom signals.
1 parent 1e172a4 commit 92814b7

File tree

3 files changed

+46
-24
lines changed

3 files changed

+46
-24
lines changed

firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigFetchHttpClient.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,13 @@ private JSONObject createFetchRequestBody(
351351

352352
requestBodyMap.put(ANALYTICS_USER_PROPERTIES, new JSONObject(analyticsUserProperties));
353353

354-
requestBodyMap.put(CUSTOM_SIGNALS, new JSONObject(customSignalMap));
354+
if (!customSignalMap.isEmpty()) {
355+
Map<String, String> customSignalsStringMap = new HashMap<>();
356+
for (Map.Entry<String, Object> entry : customSignalMap.entrySet()) {
357+
customSignalsStringMap.put(entry.getKey(), String.valueOf(entry.getValue()));
358+
}
359+
requestBodyMap.put(CUSTOM_SIGNALS, new JSONObject(customSignalsStringMap));
360+
}
355361

356362
if (firstOpenTime != null) {
357363
requestBodyMap.put(FIRST_OPEN_TIME, convertToISOString(firstOpenTime));

firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigMetadataClient.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818
import static com.google.firebase.remoteconfig.FirebaseRemoteConfig.LAST_FETCH_STATUS_NO_FETCH_YET;
1919
import static com.google.firebase.remoteconfig.FirebaseRemoteConfig.LAST_FETCH_STATUS_SUCCESS;
2020
import static com.google.firebase.remoteconfig.FirebaseRemoteConfig.LAST_FETCH_STATUS_THROTTLED;
21+
import static com.google.firebase.remoteconfig.FirebaseRemoteConfig.TAG;
2122
import static com.google.firebase.remoteconfig.RemoteConfigComponent.CONNECTION_TIMEOUT_IN_SECONDS;
2223
import static com.google.firebase.remoteconfig.RemoteConfigConstants.RequestFieldKey.CUSTOM_SIGNALS;
2324
import static com.google.firebase.remoteconfig.internal.ConfigFetchHandler.DEFAULT_MINIMUM_FETCH_INTERVAL_IN_SECONDS;
2425
import static java.lang.annotation.RetentionPolicy.SOURCE;
2526

2627
import android.content.SharedPreferences;
28+
import android.util.Log;
2729
import androidx.annotation.IntDef;
2830
import androidx.annotation.Nullable;
2931
import androidx.annotation.VisibleForTesting;
@@ -81,6 +83,12 @@ public class ConfigMetadataClient {
8183
private static final String REALTIME_BACKOFF_END_TIME_IN_MILLIS_KEY =
8284
"realtime_backoff_end_time_in_millis";
8385

86+
/** Constants for custom signal limits. */
87+
private static final int CUSTOM_SIGNALS_MAX_KEY_LENGTH = 250;
88+
89+
private static final int CUSTOM_SIGNALS_MAX_STRING_VALUE_LENGTH = 500;
90+
private static final int CUSTOM_SIGNALS_MAX_COUNT = 100;
91+
8492
private final SharedPreferences frcMetadata;
8593

8694
private final Object frcInfoLock;
@@ -268,11 +276,18 @@ public void setCustomSignals(Map<String, Object> newCustomSignals) {
268276

269277
// Validate value type, and key and value length
270278
if (value != null && !(value instanceof String || value instanceof Long)) {
271-
throw new IllegalArgumentException("Custom signal values must be of type String or Long");
279+
Log.w(TAG, "Invalid custom signal: Custom signal values must be of type String or Long.");
280+
return;
272281
}
273-
if (key.length() > 250 || (value instanceof String && ((String) value).length() > 500)) {
274-
throw new IllegalArgumentException(
275-
"Custom signal keys must be 250 characters or less, and string values must be 500 characters or less.");
282+
if (key.length() > CUSTOM_SIGNALS_MAX_KEY_LENGTH
283+
|| (value instanceof String
284+
&& ((String) value).length() > CUSTOM_SIGNALS_MAX_STRING_VALUE_LENGTH)) {
285+
Log.w(
286+
TAG,
287+
String.format(
288+
"Invalid custom signal: Custom signal keys must be %d characters or less, and string values must be %d characters or less.",
289+
CUSTOM_SIGNALS_MAX_KEY_LENGTH, CUSTOM_SIGNALS_MAX_STRING_VALUE_LENGTH));
290+
return;
276291
}
277292

278293
// Merge new signals with existing ones, overwriting existing keys.
@@ -288,9 +303,13 @@ public void setCustomSignals(Map<String, Object> newCustomSignals) {
288303
if (existingCustomSignals.equals(getCustomSignals())) {
289304
return;
290305
}
291-
if (existingCustomSignals.size() > 100) {
292-
throw new IllegalArgumentException(
293-
"Too many custom signals provided. The maximum allowed is 100.");
306+
if (existingCustomSignals.size() > CUSTOM_SIGNALS_MAX_COUNT) {
307+
Log.w(
308+
TAG,
309+
String.format(
310+
"Invalid custom signal: Too many custom signals provided. The maximum allowed is %d.",
311+
CUSTOM_SIGNALS_MAX_COUNT));
312+
return;
294313
}
295314

296315
frcMetadata

firebase-config/src/test/java/com/google/firebase/remoteconfig/internal/ConfigMetadataClientTest.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import static com.google.firebase.remoteconfig.internal.ConfigMetadataClient.LAST_FETCH_TIME_NO_FETCH_YET;
2626
import static com.google.firebase.remoteconfig.internal.ConfigMetadataClient.NO_BACKOFF_TIME;
2727
import static com.google.firebase.remoteconfig.internal.ConfigMetadataClient.NO_FAILED_FETCHES;
28-
import static com.google.firebase.remoteconfig.testutil.Assert.assertThrows;
28+
import static com.google.firebase.remoteconfig.testutil.Assert.assertFalse;
2929

3030
import android.content.Context;
3131
import android.content.SharedPreferences;
@@ -392,20 +392,17 @@ public void setCustomSignals_nullValue_removesSignal() {
392392
}
393393

394394
@Test
395-
public void setCustomSignals_invalidInput_throwsException() {
396-
Map<String, Object> invalidSignals1 = new HashMap<>();
397-
invalidSignals1.put("name", true);
398-
assertThrows(
399-
IllegalArgumentException.class, () -> metadataClient.setCustomSignals(invalidSignals1));
400-
401-
Map<String, Object> invalidSignals2 = new HashMap<>();
402-
invalidSignals2.put("a".repeat(251), "value");
403-
assertThrows(
404-
IllegalArgumentException.class, () -> metadataClient.setCustomSignals(invalidSignals2));
405-
406-
Map<String, Object> invalidSignals3 = new HashMap<>();
407-
invalidSignals3.put("key", "a".repeat(501));
408-
assertThrows(
409-
IllegalArgumentException.class, () -> metadataClient.setCustomSignals(invalidSignals3));
395+
public void setCustomSignals_invalidInput_rejectsSignals() {
396+
Map<String, Object> invalidSignals1 = ImmutableMap.of("name", true);
397+
metadataClient.setCustomSignals(invalidSignals1);
398+
assertFalse(metadataClient.getCustomSignals().containsKey("name"));
399+
400+
Map<String, Object> invalidSignals2 = ImmutableMap.of("a".repeat(251), "value");
401+
metadataClient.setCustomSignals(invalidSignals2);
402+
assertFalse(metadataClient.getCustomSignals().containsKey("a".repeat(251)));
403+
404+
Map<String, Object> invalidSignals3 = ImmutableMap.of("key", "a".repeat(501));
405+
metadataClient.setCustomSignals(invalidSignals3);
406+
assertFalse(metadataClient.getCustomSignals().containsKey("key"));
410407
}
411408
}

0 commit comments

Comments
 (0)