Count profile data that cannot be parsed as base64

This commit is contained in:
Katherine Yen 2023-08-08 10:54:25 -07:00 committed by GitHub
parent a953cb33b7
commit 58fd9ddb27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 32 additions and 4 deletions

View File

@ -8,9 +8,11 @@ package org.whispersystems.textsecuregcm.storage;
import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name;
import com.google.common.annotations.VisibleForTesting;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Timer;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -76,6 +78,12 @@ public class Profiles {
private static final Timer GET_PROFILE_TIMER = Metrics.timer(name(Profiles.class, "get"));
private static final Timer DELETE_PROFILES_TIMER = Metrics.timer(name(Profiles.class, "delete"));
private static final Counter INVALID_NAME_COUNTER = Metrics.counter(name(Profiles.class, "invalidProfileData"), "field", "name");
private static final Counter INVALID_EMOJI_COUNTER = Metrics.counter(name(Profiles.class, "invalidProfileData"), "field", "emoji");
private static final Counter INVALID_ABOUT_COUNTER = Metrics.counter(name(Profiles.class, "invalidProfileData"), "field", "about");
private static final Counter INVALID_PAYMENT_ADDRESS_COUNTER = Metrics.counter(name(Profiles.class, "invalidProfileData"), "field", "paymentAddress");
public Profiles(final DynamoDbClient dynamoDbClient,
final DynamoDbAsyncClient dynamoDbAsyncClient,
final String tableName) {
@ -224,16 +232,36 @@ public class Profiles {
}
private static VersionedProfile fromItem(final Map<String, AttributeValue> item) {
final String name = AttributeValues.getString(item, ATTR_NAME, null);
final String emoji = AttributeValues.getString(item, ATTR_EMOJI, null);
final String about = AttributeValues.getString(item, ATTR_ABOUT, null);
final String paymentAddress = AttributeValues.getString(item, ATTR_PAYMENT_ADDRESS, null);
checkValidBase64(name, INVALID_NAME_COUNTER);
checkValidBase64(emoji, INVALID_EMOJI_COUNTER);
checkValidBase64(about, INVALID_ABOUT_COUNTER);
checkValidBase64(paymentAddress, INVALID_PAYMENT_ADDRESS_COUNTER);
return new VersionedProfile(
AttributeValues.getString(item, ATTR_VERSION, null),
AttributeValues.getString(item, ATTR_NAME, null),
name,
AttributeValues.getString(item, ATTR_AVATAR, null),
AttributeValues.getString(item, ATTR_EMOJI, null),
AttributeValues.getString(item, ATTR_ABOUT, null),
AttributeValues.getString(item, ATTR_PAYMENT_ADDRESS, null),
emoji,
about,
paymentAddress,
AttributeValues.getByteArray(item, ATTR_COMMITMENT, null));
}
private static void checkValidBase64(final String value, final Counter counter) {
if (StringUtils.isNotBlank(value)) {
try {
Base64.getDecoder().decode(value);
} catch (final IllegalArgumentException e) {
counter.increment();
}
}
}
public void deleteAll(final UUID uuid) {
DELETE_PROFILES_TIMER.record(() -> {
final AttributeValue uuidAttributeValue = AttributeValues.fromUUID(uuid);