From: AsamK Date: Fri, 11 Sep 2020 14:22:30 +0000 (+0200) Subject: Refactor ProfileStore to handle name/uuid addresses correctly X-Git-Tag: v0.6.10~1 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/ad509e8097733e91837338f6470441567f6970b2?ds=inline Refactor ProfileStore to handle name/uuid addresses correctly --- diff --git a/src/main/java/org/asamk/signal/manager/Manager.java b/src/main/java/org/asamk/signal/manager/Manager.java index c4969fa4..2ce59cdc 100644 --- a/src/main/java/org/asamk/signal/manager/Manager.java +++ b/src/main/java/org/asamk/signal/manager/Manager.java @@ -462,8 +462,8 @@ public class Manager implements Closeable { // Profiles are cache for 24h before retrieving them again if (profileEntry == null || profileEntry.getProfile() == null || now - profileEntry.getLastUpdateTimestamp() > 24 * 60 * 60 * 1000) { SignalProfile profile = retrieveRecipientProfile(address, unidentifiedAccess, profileKey); - profileEntry = new SignalProfileEntry(profileKey, now, profile); - account.getProfileStore().updateProfile(address, profileEntry); + account.getProfileStore().updateProfile(address, profileKey, now, profile); + return profile; } return profileEntry.getProfile(); } diff --git a/src/main/java/org/asamk/signal/storage/profiles/ProfileStore.java b/src/main/java/org/asamk/signal/storage/profiles/ProfileStore.java index 43a39671..24b08968 100644 --- a/src/main/java/org/asamk/signal/storage/profiles/ProfileStore.java +++ b/src/main/java/org/asamk/signal/storage/profiles/ProfileStore.java @@ -19,8 +19,9 @@ import org.whispersystems.signalservice.api.util.UuidUtil; import org.whispersystems.util.Base64; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; +import java.util.List; import java.util.UUID; public class ProfileStore { @@ -30,23 +31,36 @@ public class ProfileStore { @JsonProperty("profiles") @JsonDeserialize(using = ProfileStoreDeserializer.class) @JsonSerialize(using = ProfileStoreSerializer.class) - private final Map profiles = new HashMap<>(); + private final List profiles = new ArrayList<>(); public SignalProfileEntry getProfile(SignalServiceAddress serviceAddress) { - return profiles.get(serviceAddress); + for (SignalProfileEntry entry : profiles) { + if (entry.getServiceAddress().matches(serviceAddress)) { + return entry; + } + } + return null; } - public void updateProfile(SignalServiceAddress serviceAddress, SignalProfileEntry profile) { - profiles.put(serviceAddress, profile); + public void updateProfile(SignalServiceAddress serviceAddress, ProfileKey profileKey, long now, SignalProfile profile) { + SignalProfileEntry newEntry = new SignalProfileEntry(serviceAddress, profileKey, now, profile); + for (int i = 0; i < profiles.size(); i++) { + if (profiles.get(i).getServiceAddress().matches(serviceAddress)) { + profiles.set(i, newEntry); + return; + } + } + + profiles.add(newEntry); } - public static class ProfileStoreDeserializer extends JsonDeserializer> { + public static class ProfileStoreDeserializer extends JsonDeserializer> { @Override - public Map deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + public List deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { JsonNode node = jsonParser.getCodec().readTree(jsonParser); - Map addresses = new HashMap<>(); + List addresses = new ArrayList<>(); if (node.isArray()) { for (JsonNode entry : node) { @@ -64,7 +78,7 @@ public class ProfileStore { } long lastUpdateTimestamp = entry.get("lastUpdateTimestamp").asLong(); SignalProfile profile = jsonProcessor.treeToValue(entry.get("profile"), SignalProfile.class); - addresses.put(serviceAddress, new SignalProfileEntry(profileKey, lastUpdateTimestamp, profile)); + addresses.add(new SignalProfileEntry(serviceAddress, profileKey, lastUpdateTimestamp, profile)); } } @@ -72,14 +86,13 @@ public class ProfileStore { } } - public static class ProfileStoreSerializer extends JsonSerializer> { + public static class ProfileStoreSerializer extends JsonSerializer> { @Override - public void serialize(Map profiles, JsonGenerator json, SerializerProvider serializerProvider) throws IOException { + public void serialize(List profiles, JsonGenerator json, SerializerProvider serializerProvider) throws IOException { json.writeStartArray(); - for (Map.Entry entry : profiles.entrySet()) { - final SignalServiceAddress address = entry.getKey(); - final SignalProfileEntry profileEntry = entry.getValue(); + for (SignalProfileEntry profileEntry : profiles) { + final SignalServiceAddress address = profileEntry.getServiceAddress(); json.writeStartObject(); if (address.getNumber().isPresent()) { json.writeStringField("name", address.getNumber().get()); diff --git a/src/main/java/org/asamk/signal/storage/profiles/SignalProfileEntry.java b/src/main/java/org/asamk/signal/storage/profiles/SignalProfileEntry.java index 0423e12e..ed1f7127 100644 --- a/src/main/java/org/asamk/signal/storage/profiles/SignalProfileEntry.java +++ b/src/main/java/org/asamk/signal/storage/profiles/SignalProfileEntry.java @@ -1,21 +1,29 @@ package org.asamk.signal.storage.profiles; import org.signal.zkgroup.profiles.ProfileKey; +import org.whispersystems.signalservice.api.push.SignalServiceAddress; public class SignalProfileEntry { - private ProfileKey profileKey; + private final SignalServiceAddress serviceAddress; - private long lastUpdateTimestamp; + private final ProfileKey profileKey; - private SignalProfile profile; + private final long lastUpdateTimestamp; - public SignalProfileEntry(final ProfileKey profileKey, final long lastUpdateTimestamp, final SignalProfile profile) { + private final SignalProfile profile; + + public SignalProfileEntry(final SignalServiceAddress serviceAddress, final ProfileKey profileKey, final long lastUpdateTimestamp, final SignalProfile profile) { + this.serviceAddress = serviceAddress; this.profileKey = profileKey; this.lastUpdateTimestamp = lastUpdateTimestamp; this.profile = profile; } + public SignalServiceAddress getServiceAddress() { + return serviceAddress; + } + public ProfileKey getProfileKey() { return profileKey; }