From: AsamK Date: Tue, 11 May 2021 16:37:18 +0000 (+0200) Subject: Store available profile data even if we don't have the profile key X-Git-Tag: v0.8.2~7 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/19c004e9878d4056d44667f38ddda28f881e69e0?ds=inline Store available profile data even if we don't have the profile key --- diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index 8d480044..a78a19c1 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -556,14 +556,6 @@ public class Manager implements Closeable { Profile getRecipientProfile( RecipientId recipientId, boolean force ) { - var profileKey = account.getProfileStore().getProfileKey(recipientId); - if (profileKey == null) { - if (force) { - // retrieve profile to get identity key - retrieveEncryptedProfile(recipientId); - } - return null; - } var profile = account.getProfileStore().getProfile(recipientId); var now = new Date().getTime(); @@ -590,7 +582,18 @@ public class Manager implements Closeable { return null; } - profile = decryptProfileAndDownloadAvatar(recipientId, profileKey, encryptedProfile); + var profileKey = account.getProfileStore().getProfileKey(recipientId); + if (profileKey == null) { + profile = new Profile(new Date().getTime(), + null, + null, + null, + null, + ProfileUtils.getUnidentifiedAccessMode(encryptedProfile, null), + ProfileUtils.getCapabilities(encryptedProfile)); + } else { + profile = decryptProfileAndDownloadAvatar(recipientId, profileKey, encryptedProfile); + } account.getProfileStore().storeProfile(recipientId, profile); return profile; diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java index a323c6d9..fb7394b5 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java @@ -233,6 +233,9 @@ public class RecipientStore implements ContactsStore, ProfileStore { final var newRecipient = Recipient.newBuilder(recipient) .withProfileKey(profileKey) .withProfileKeyCredential(null) + .withProfile(recipient.getProfile() == null + ? null + : Profile.newBuilder(recipient.getProfile()).withLastUpdateTimestamp(0).build()) .build(); storeRecipientLocked(recipientId, newRecipient); } diff --git a/lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java b/lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java index b1a8ed94..f865ab21 100644 --- a/lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java +++ b/lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java @@ -21,43 +21,51 @@ public class ProfileUtils { var name = decryptName(encryptedProfile.getName(), profileCipher); var about = decryptName(encryptedProfile.getAbout(), profileCipher); var aboutEmoji = decryptName(encryptedProfile.getAboutEmoji(), profileCipher); - String unidentifiedAccess; - try { - unidentifiedAccess = encryptedProfile.getUnidentifiedAccess() == null - || !profileCipher.verifyUnidentifiedAccess(Base64.getDecoder() - .decode(encryptedProfile.getUnidentifiedAccess())) - ? null - : encryptedProfile.getUnidentifiedAccess(); - } catch (IllegalArgumentException e) { - unidentifiedAccess = null; - } + final var nameParts = splitName(name); - final var capabilities = new HashSet(); - if (encryptedProfile.getCapabilities().isGv1Migration()) { - capabilities.add(Profile.Capability.gv1Migration); - } - if (encryptedProfile.getCapabilities().isGv2()) { - capabilities.add(Profile.Capability.gv2); - } - if (encryptedProfile.getCapabilities().isStorage()) { - capabilities.add(Profile.Capability.storage); - } return new Profile(new Date().getTime(), nameParts.first(), nameParts.second(), about, aboutEmoji, - encryptedProfile.isUnrestrictedUnidentifiedAccess() - ? Profile.UnidentifiedAccessMode.UNRESTRICTED - : unidentifiedAccess != null - ? Profile.UnidentifiedAccessMode.ENABLED - : Profile.UnidentifiedAccessMode.DISABLED, - capabilities); + getUnidentifiedAccessMode(encryptedProfile, profileCipher), + getCapabilities(encryptedProfile)); } catch (InvalidCiphertextException e) { return null; } } + public static Profile.UnidentifiedAccessMode getUnidentifiedAccessMode( + final SignalServiceProfile encryptedProfile, final ProfileCipher profileCipher + ) { + if (encryptedProfile.isUnrestrictedUnidentifiedAccess()) { + return Profile.UnidentifiedAccessMode.UNRESTRICTED; + } + + if (encryptedProfile.getUnidentifiedAccess() != null && profileCipher != null) { + final var unidentifiedAccessVerifier = Base64.getDecoder().decode(encryptedProfile.getUnidentifiedAccess()); + if (profileCipher.verifyUnidentifiedAccess(unidentifiedAccessVerifier)) { + return Profile.UnidentifiedAccessMode.ENABLED; + } + } + + return Profile.UnidentifiedAccessMode.DISABLED; + } + + public static HashSet getCapabilities(final SignalServiceProfile encryptedProfile) { + final var capabilities = new HashSet(); + if (encryptedProfile.getCapabilities().isGv1Migration()) { + capabilities.add(Profile.Capability.gv1Migration); + } + if (encryptedProfile.getCapabilities().isGv2()) { + capabilities.add(Profile.Capability.gv2); + } + if (encryptedProfile.getCapabilities().isStorage()) { + capabilities.add(Profile.Capability.storage); + } + return capabilities; + } + private static String decryptName( final String encryptedName, final ProfileCipher profileCipher ) throws InvalidCiphertextException {