mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-24 13:08:46 +00:00
Add support for an 'About' field on your profile.
This commit is contained in:
@@ -21,6 +21,7 @@ import org.whispersystems.libsignal.state.SignedPreKeyRecord;
|
||||
import org.whispersystems.libsignal.util.guava.Optional;
|
||||
import org.whispersystems.signalservice.api.crypto.InvalidCiphertextException;
|
||||
import org.whispersystems.signalservice.api.crypto.ProfileCipher;
|
||||
import org.whispersystems.signalservice.api.crypto.ProfileCipherInputStream;
|
||||
import org.whispersystems.signalservice.api.crypto.ProfileCipherOutputStream;
|
||||
import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations;
|
||||
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Api;
|
||||
@@ -634,12 +635,14 @@ public class SignalServiceAccountManager {
|
||||
/**
|
||||
* @return The avatar URL path, if one was written.
|
||||
*/
|
||||
public Optional<String> setVersionedProfile(UUID uuid, ProfileKey profileKey, String name, StreamDetails avatar)
|
||||
public Optional<String> setVersionedProfile(UUID uuid, ProfileKey profileKey, String name, String about, String aboutEmoji, StreamDetails avatar)
|
||||
throws IOException
|
||||
{
|
||||
if (name == null) name = "";
|
||||
|
||||
byte[] ciphertextName = new ProfileCipher(profileKey).encryptName(name.getBytes(StandardCharsets.UTF_8), ProfileCipher.getTargetNameLength(name));
|
||||
byte[] ciphertextAbout = new ProfileCipher(profileKey).encryptName(about.getBytes(StandardCharsets.UTF_8), ProfileCipher.getTargetAboutLength(about));
|
||||
byte[] ciphertextEmoji = new ProfileCipher(profileKey).encryptName(aboutEmoji.getBytes(StandardCharsets.UTF_8), ProfileCipher.EMOJI_PADDED_LENGTH);
|
||||
boolean hasAvatar = avatar != null;
|
||||
ProfileAvatarData profileAvatarData = null;
|
||||
|
||||
@@ -652,6 +655,8 @@ public class SignalServiceAccountManager {
|
||||
|
||||
return this.pushServiceSocket.writeProfile(new SignalServiceProfileWrite(profileKey.getProfileKeyVersion(uuid).serialize(),
|
||||
ciphertextName,
|
||||
ciphertextAbout,
|
||||
ciphertextEmoji,
|
||||
hasAvatar,
|
||||
profileKey.getCommitment(uuid).serialize()),
|
||||
profileAvatarData);
|
||||
|
||||
@@ -23,8 +23,13 @@ public class ProfileCipher {
|
||||
|
||||
private static final int NAME_PADDED_LENGTH_1 = 53;
|
||||
private static final int NAME_PADDED_LENGTH_2 = 257;
|
||||
private static final int ABOUT_PADDED_LENGTH_1 = 128;
|
||||
private static final int ABOUT_PADDED_LENGTH_2 = 254;
|
||||
private static final int ABOUT_PADDED_LENGTH_3 = 512;
|
||||
|
||||
public static final int MAX_POSSIBLE_NAME_LENGTH = NAME_PADDED_LENGTH_2;
|
||||
public static final int MAX_POSSIBLE_NAME_LENGTH = NAME_PADDED_LENGTH_2;
|
||||
public static final int MAX_POSSIBLE_ABOUT_LENGTH = ABOUT_PADDED_LENGTH_3;
|
||||
public static final int EMOJI_PADDED_LENGTH = 32;
|
||||
|
||||
private final ProfileKey key;
|
||||
|
||||
@@ -112,4 +117,16 @@ public class ProfileCipher {
|
||||
return NAME_PADDED_LENGTH_2;
|
||||
}
|
||||
}
|
||||
|
||||
public static int getTargetAboutLength(String about) {
|
||||
int aboutLength = about.getBytes(StandardCharsets.UTF_8).length;
|
||||
|
||||
if (aboutLength <= ABOUT_PADDED_LENGTH_1) {
|
||||
return ABOUT_PADDED_LENGTH_1;
|
||||
} else if (aboutLength < ABOUT_PADDED_LENGTH_2){
|
||||
return ABOUT_PADDED_LENGTH_2;
|
||||
} else {
|
||||
return ABOUT_PADDED_LENGTH_3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,12 @@ public class SignalServiceProfile {
|
||||
@JsonProperty
|
||||
private String name;
|
||||
|
||||
@JsonProperty
|
||||
private String about;
|
||||
|
||||
@JsonProperty
|
||||
private String aboutEmoji;
|
||||
|
||||
@JsonProperty
|
||||
private String avatar;
|
||||
|
||||
@@ -62,6 +68,14 @@ public class SignalServiceProfile {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getAbout() {
|
||||
return about;
|
||||
}
|
||||
|
||||
public String getAboutEmoji() {
|
||||
return aboutEmoji;
|
||||
}
|
||||
|
||||
public String getAvatar() {
|
||||
return avatar;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,12 @@ public class SignalServiceProfileWrite {
|
||||
@JsonProperty
|
||||
private byte[] name;
|
||||
|
||||
@JsonProperty
|
||||
private byte[] about;
|
||||
|
||||
@JsonProperty
|
||||
private byte[] aboutEmoji;
|
||||
|
||||
@JsonProperty
|
||||
private boolean avatar;
|
||||
|
||||
@@ -21,9 +27,11 @@ public class SignalServiceProfileWrite {
|
||||
public SignalServiceProfileWrite(){
|
||||
}
|
||||
|
||||
public SignalServiceProfileWrite(String version, byte[] name, boolean avatar, byte[] commitment) {
|
||||
public SignalServiceProfileWrite(String version, byte[] name, byte[] about, byte[] aboutEmoji, boolean avatar, byte[] commitment) {
|
||||
this.version = version;
|
||||
this.name = name;
|
||||
this.about = about;
|
||||
this.aboutEmoji = aboutEmoji;
|
||||
this.avatar = avatar;
|
||||
this.commitment = commitment;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user