Update to libsignal 0.65.4

This commit is contained in:
Greyson Parrelli
2025-01-28 10:52:53 -05:00
parent 2e89b8acee
commit 9862b758e5
40 changed files with 92 additions and 56 deletions

View File

@@ -130,6 +130,10 @@ object ExportOddities {
return log(0, "Distribution list had self as a member. Removing it.")
}
fun emptyQuote(sentTimestamp: Long): String {
return log(sentTimestamp, "Quote had no text or attachments. Removing it.")
}
private fun log(sentTimestamp: Long, message: String): String {
return "[ODDITY][$sentTimestamp] $message"
}

View File

@@ -956,21 +956,28 @@ private fun BackupMessageRecord.toRemoteQuote(mediaArchiveEnabled: Boolean, atta
}
val bodyRanges = this.quoteBodyRanges?.toRemoteBodyRanges(dateSent) ?: emptyList()
return Quote(
targetSentTimestamp = this.quoteTargetSentTimestamp.takeIf { !this.quoteMissing && it != MessageTable.QUOTE_TARGET_MISSING_ID }?.clampToValidBackupRange(),
authorId = this.quoteAuthor,
text = this.quoteBody?.let { body ->
val body = this.quoteBody?.takeUnless { it.isBlank() }?.let { body ->
Text(
body = body,
bodyRanges = bodyRanges
)
},
attachments = if (remoteType == Quote.Type.VIEW_ONCE) {
}
val attachments = if (remoteType == Quote.Type.VIEW_ONCE) {
emptyList()
} else {
attachments?.toRemoteQuoteAttachments(mediaArchiveEnabled) ?: emptyList()
},
}
if (body == null && attachments.isEmpty()) {
Log.w(TAG, ExportOddities.emptyQuote(this.dateSent))
return null
}
return Quote(
targetSentTimestamp = this.quoteTargetSentTimestamp.takeIf { !this.quoteMissing && it != MessageTable.QUOTE_TARGET_MISSING_ID }?.clampToValidBackupRange(),
authorId = this.quoteAuthor,
text = body,
attachments = attachments,
type = remoteType
)
}

View File

@@ -56,6 +56,7 @@ class GroupArchiveExporter(private val selfAci: ServiceId.ACI, private val curso
group = ArchiveGroup(
masterKey = cursor.requireNonNullBlob(GroupTable.V2_MASTER_KEY).toByteString(),
whitelisted = cursor.requireBoolean(RecipientTable.PROFILE_SHARING),
blocked = cursor.requireBoolean(RecipientTable.BLOCKED),
hideStory = extras?.hideStory() ?: false,
storySendMode = showAsStoryState.toRemote(),
snapshot = decryptedGroup.toRemote(isActive, selfAci)

View File

@@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.backup.v2.importer
import android.content.ContentValues
import org.signal.core.util.Base64
import org.signal.core.util.toInt
import org.signal.libsignal.zkgroup.groups.GroupMasterKey
import org.signal.libsignal.zkgroup.groups.GroupSecretParams
import org.signal.storageservice.protos.groups.AccessControl
@@ -51,7 +52,8 @@ object GroupArchiveImporter {
val values = ContentValues().apply {
put(RecipientTable.GROUP_ID, groupId.toString())
put(RecipientTable.AVATAR_COLOR, AvatarColorHash.forGroupId(groupId).serialize())
put(RecipientTable.PROFILE_SHARING, group.whitelisted)
put(RecipientTable.PROFILE_SHARING, group.whitelisted.toInt())
put(RecipientTable.BLOCKED, group.blocked.toInt())
put(RecipientTable.TYPE, RecipientTable.RecipientType.GV2.id)
put(RecipientTable.STORAGE_SERVICE_ID, Base64.encodeWithPadding(StorageSyncHelper.generateKey()))
if (group.hideStory) {

View File

@@ -30,6 +30,7 @@ message BackupInfo {
// For example, Chats may all be together at the beginning,
// or may each immediately precede its first ChatItem.
message Frame {
// If unset, importers should skip this frame without throwing an error.
oneof item {
AccountData account = 1;
Recipient recipient = 2;
@@ -44,13 +45,13 @@ message Frame {
message AccountData {
enum PhoneNumberSharingMode {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Nobody"
EVERYBODY = 1;
NOBODY = 2;
}
message UsernameLink {
enum Color {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Blue"
BLUE = 1;
WHITE = 2;
GREY = 3;
@@ -97,6 +98,7 @@ message AccountData {
message IAPSubscriberData {
bytes subscriberId = 1;
// If unset, importers should ignore the subscriber data without throwing an error.
oneof iapSubscriptionId {
// Identifies an Android Play Store IAP subscription.
string purchaseToken = 2;
@@ -119,6 +121,7 @@ message AccountData {
message Recipient {
uint64 id = 1; // generated id for reference only within this file
// If unset, importers should skip this frame without throwing an error.
oneof destination {
Contact contact = 2;
Group group = 3;
@@ -131,9 +134,9 @@ message Recipient {
message Contact {
enum IdentityState {
DEFAULT = 0;
DEFAULT = 0; // A valid value -- indicates unset by the user
VERIFIED = 1;
UNVERIFIED = 2;
UNVERIFIED = 2; // Was once verified and is now unverified
}
message Registered {}
@@ -142,7 +145,7 @@ message Contact {
}
enum Visibility {
VISIBLE = 0;
VISIBLE = 0; // A valid value -- the contact is not hidden
HIDDEN = 1;
HIDDEN_MESSAGE_REQUEST = 2;
}
@@ -159,6 +162,7 @@ message Contact {
bool blocked = 5;
Visibility visibility = 6;
// If unset, consider the user to be registered
oneof registration {
Registered registered = 7;
NotRegistered notRegistered = 8;
@@ -177,7 +181,7 @@ message Contact {
message Group {
enum StorySendMode {
DEFAULT = 0;
DEFAULT = 0; // A valid value -- indicates unset by the user
DISABLED = 1;
ENABLED = 2;
}
@@ -187,6 +191,7 @@ message Group {
bool hideStory = 3;
StorySendMode storySendMode = 4;
GroupSnapshot snapshot = 5;
bool blocked = 6;
// These are simply plaintext copies of the groups proto from Groups.proto.
// They should be kept completely in-sync with Groups.proto.
@@ -210,6 +215,7 @@ message Group {
}
message GroupAttributeBlob {
// If unset, consider the field it represents to not be present
oneof content {
string title = 1;
bytes avatar = 2;
@@ -220,7 +226,7 @@ message Group {
message Member {
enum Role {
UNKNOWN = 0;
UNKNOWN = 0; // Intepret as "Default"
DEFAULT = 1;
ADMINISTRATOR = 2;
}
@@ -252,7 +258,7 @@ message Group {
message AccessControl {
enum AccessRequired {
UNKNOWN = 0;
UNKNOWN = 0; // Intepret as "Unsatisfiable"
ANY = 1;
MEMBER = 2;
ADMINISTRATOR = 3;
@@ -292,7 +298,7 @@ message Chat {
*/
message CallLink {
enum Restrictions {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Admin Approval"
NONE = 1;
ADMIN_APPROVAL = 2;
}
@@ -306,7 +312,7 @@ message CallLink {
message AdHocCall {
enum State {
UNKNOWN_STATE = 0;
UNKNOWN_STATE = 0; // Interpret as "Generic"
GENERIC = 1;
}
@@ -322,6 +328,7 @@ message DistributionListItem {
// by an all-0 UUID (00000000-0000-0000-0000-000000000000).
bytes distributionId = 1; // distribution list ids are uuids
// If unset, importers should skip the item entirely without showing an error.
oneof item {
uint64 deletionTimestamp = 2;
DistributionList distributionList = 3;
@@ -330,7 +337,7 @@ message DistributionListItem {
message DistributionList {
enum PrivacyMode {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Only with"
ONLY_WITH = 1;
ALL_EXCEPT = 2;
ALL = 3;
@@ -365,12 +372,14 @@ message ChatItem {
repeated ChatItem revisions = 6; // ordered from oldest to newest
bool sms = 7;
// If unset, importers should skip this item without throwing an error.
oneof directionalDetails {
IncomingMessageDetails incoming = 8;
OutgoingMessageDetails outgoing = 9;
DirectionlessMessageDetails directionless = 10;
}
// If unset, importers should skip this item without throwing an error.
oneof item {
StandardMessage standardMessage = 11;
ContactMessage contactMessage = 12;
@@ -419,6 +428,7 @@ message SendStatus {
uint64 recipientId = 1;
uint64 timestamp = 2; // the time the status was last updated -- if from a receipt, it should be the sentTime of the receipt
// If unset, importers should consider the status to be "pending"
oneof deliveryStatus {
Pending pending = 3;
Sent sent = 4;
@@ -455,6 +465,7 @@ message DirectStoryReplyMessage {
FilePointer longText = 2;
}
// If unset, importers should ignore the message without throwing an error.
oneof reply {
TextReply textReply = 1;
string emoji = 2;
@@ -473,7 +484,7 @@ message PaymentNotification {
message FailedTransaction { // Failed payments can't be synced from the ledger
enum FailureReason {
GENERIC = 0;
GENERIC = 0; // A valid value -- reason unknown
NETWORK = 1;
INSUFFICIENT_FUNDS = 2;
}
@@ -482,7 +493,7 @@ message PaymentNotification {
message Transaction {
enum Status {
INITIAL = 0;
INITIAL = 0; // A valid value -- state unconfirmed
SUBMITTED = 1;
SUCCESSFUL = 2;
}
@@ -499,6 +510,7 @@ message PaymentNotification {
optional bytes receipt = 7; // mobile coin blobs
}
// If unset, importers should treat the transaction as successful with no metadata.
oneof payment {
Transaction transaction = 1;
FailedTransaction failedTransaction = 2;
@@ -513,7 +525,7 @@ message PaymentNotification {
message GiftBadge {
enum State {
UNOPENED = 0;
UNOPENED = 0; // A valid state
OPENED = 1;
REDEEMED = 2;
FAILED = 3;
@@ -541,7 +553,7 @@ message ContactAttachment {
message Phone {
enum Type {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Home"
HOME = 1;
MOBILE = 2;
WORK = 3;
@@ -555,7 +567,7 @@ message ContactAttachment {
message Email {
enum Type {
UNKNOWN = 0;
UNKNOWN = 0; // Intepret as "Home"
HOME = 1;
MOBILE = 2;
WORK = 3;
@@ -569,7 +581,7 @@ message ContactAttachment {
message PostalAddress {
enum Type {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Home"
HOME = 1;
WORK = 2;
CUSTOM = 3;
@@ -629,7 +641,7 @@ message MessageAttachment {
// but explicitly mutually exclusive. Note the different raw values
// (non-zero starting values are not supported in proto3.)
enum Flag {
NONE = 0;
NONE = 0; // A valid value -- no flag applied
VOICE_MESSAGE = 1;
BORDERLESS = 2;
GIF = 3;
@@ -680,6 +692,7 @@ message FilePointer {
message InvalidAttachmentLocator {
}
// If unset, importers should consider it to be an InvalidAttachmentLocator without throwing an error.
oneof locator {
BackupLocator backupLocator = 1;
AttachmentLocator attachmentLocator = 2;
@@ -698,7 +711,7 @@ message FilePointer {
message Quote {
enum Type {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Normal"
NORMAL = 1;
GIFT_BADGE = 2;
VIEW_ONCE = 3;
@@ -719,7 +732,7 @@ message Quote {
message BodyRange {
enum Style {
NONE = 0;
NONE = 0; // Importers should ignore the body range without throwing an error.
BOLD = 1;
ITALIC = 2;
SPOILER = 3;
@@ -727,9 +740,12 @@ message BodyRange {
MONOSPACE = 5;
}
optional uint32 start = 1;
optional uint32 length = 2;
// 'start' and 'length' are measured in UTF-16 code units.
// They may refer to offsets in a longText attachment.
uint32 start = 1;
uint32 length = 2;
// If unset, importers should ignore the body range without throwing an error.
oneof associatedValue {
bytes mentionAci = 3;
Style style = 4;
@@ -746,6 +762,7 @@ message Reaction {
}
message ChatUpdateMessage {
// If unset, importers should ignore the update message without throwing an error.
oneof update {
SimpleChatUpdate simpleUpdate = 1;
GroupChangeChatUpdate groupChange = 2;
@@ -761,19 +778,19 @@ message ChatUpdateMessage {
message IndividualCall {
enum Type {
UNKNOWN_TYPE = 0;
UNKNOWN_TYPE = 0; // Interpret as "Audio call"
AUDIO_CALL = 1;
VIDEO_CALL = 2;
}
enum Direction {
UNKNOWN_DIRECTION = 0;
UNKNOWN_DIRECTION = 0; // Interpret as "Incoming"
INCOMING = 1;
OUTGOING = 2;
}
enum State {
UNKNOWN_STATE = 0;
UNKNOWN_STATE = 0; // Interpret as "Accepted"
ACCEPTED = 1;
NOT_ACCEPTED = 2;
// An incoming call that is no longer ongoing, which we neither accepted
@@ -794,7 +811,7 @@ message IndividualCall {
message GroupCall {
enum State {
UNKNOWN_STATE = 0;
UNKNOWN_STATE = 0; // Interpret as "Generic"
// A group call was started without ringing.
GENERIC = 1;
// We joined a group call that was started without ringing.
@@ -825,7 +842,7 @@ message GroupCall {
message SimpleChatUpdate {
enum Type {
UNKNOWN = 0;
UNKNOWN = 0; // Importers should skip the update without throwing an error.
JOINED_SIGNAL = 1;
IDENTITY_UPDATE = 2;
IDENTITY_VERIFIED = 3;
@@ -859,6 +876,7 @@ message ProfileChangeChatUpdate {
}
message LearnedProfileChatUpdate {
// If unset, importers should consider the previous name to be an empty string.
oneof previousName {
uint64 e164 = 1;
string username = 2;
@@ -875,6 +893,7 @@ message SessionSwitchoverChatUpdate {
message GroupChangeChatUpdate {
message Update {
// If unset, importers should consider it to be a GenericGroupUpdate with unset updaterAci
oneof update {
GenericGroupUpdate genericGroupUpdate = 1;
GroupCreationUpdate groupCreationUpdate = 2;
@@ -944,7 +963,7 @@ message GroupDescriptionUpdate {
}
enum GroupV2AccessLevel {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Unsatisfiable"
ANY = 1;
MEMBER = 2;
ADMINISTRATOR = 3;
@@ -1134,6 +1153,7 @@ message ChatStyle {
message CustomChatColor {
uint64 id = 1;
// If unset, use the default chat color
oneof color {
fixed32 solid = 2; // 0xAARRGGBB
Gradient gradient = 3;
@@ -1144,7 +1164,7 @@ message ChatStyle {
}
enum WallpaperPreset {
UNKNOWN_WALLPAPER_PRESET = 0;
UNKNOWN_WALLPAPER_PRESET = 0; // Interpret as the wallpaper being unset
SOLID_BLUSH = 1;
SOLID_COPPER = 2;
SOLID_DUST = 3;
@@ -1169,7 +1189,7 @@ message ChatStyle {
}
enum BubbleColorPreset {
UNKNOWN_BUBBLE_COLOR_PRESET = 0;
UNKNOWN_BUBBLE_COLOR_PRESET = 0; // Interpret as the user's default chat bubble color
SOLID_ULTRAMARINE = 1;
SOLID_CRIMSON = 2;
SOLID_VERMILION = 3;
@@ -1194,6 +1214,7 @@ message ChatStyle {
GRADIENT_TANGERINE = 22;
}
// If unset, importers should consider there to be no wallpaper.
oneof wallpaper {
WallpaperPreset wallpaperPreset = 1;
// This `FilePointer` is expected not to contain a `fileName`, `width`,
@@ -1201,6 +1222,7 @@ message ChatStyle {
FilePointer wallpaperPhoto = 2;
}
// If unset, importers should consider it to be AutomaticBubbleColor
oneof bubbleColor {
// Bubble setting is automatically determined based on the wallpaper setting,
// or `SOLID_ULTRAMARINE` for `noWallpaper`
@@ -1216,7 +1238,7 @@ message ChatStyle {
message NotificationProfile {
enum DayOfWeek {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Monday"
MONDAY = 1;
TUESDAY = 2;
WEDNESDAY = 3;
@@ -1242,7 +1264,7 @@ message NotificationProfile {
message ChatFolder {
// Represents the default "All chats" folder record vs all other custom folders
enum FolderType {
UNKNOWN = 0;
UNKNOWN = 0; // Interpret as "Custom"
ALL = 1;
CUSTOM = 2;
}

View File

@@ -13,7 +13,7 @@ androidx-window = "1.3.0"
glide = "4.15.1"
gradle = "8.7.3"
kotlin = "2.1.0"
libsignal-client = "0.65.2"
libsignal-client = "0.65.4"
mp4parser = "1.9.39"
android-gradle-plugin = "8.7.2"
accompanist = "0.28.0"

View File

@@ -6604,20 +6604,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="6eb4422e8a618b3b76cb2096a3619d251f9e27989dc68307a1e5414c3710f2d1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="libsignal-android" version="0.65.2">
<artifact name="libsignal-android-0.65.2.aar">
<sha256 value="faab9438ba2e62324f76dfd2c24fbaabc1fed547dd3d6e6020ad417d8f9321f3" origin="Generated by Gradle"/>
<component group="org.signal" name="libsignal-android" version="0.65.4">
<artifact name="libsignal-android-0.65.4.aar">
<sha256 value="21e2d7f9477e6c790cf460d839daaa7d74fda43e1f33360efd89a52eee26b906" origin="Generated by Gradle"/>
</artifact>
<artifact name="libsignal-android-0.65.2.module">
<sha256 value="fb0c7ea259e7e6d3099b0e738cbd728be4af8cc284b5fb624bb11b4412384837" origin="Generated by Gradle"/>
<artifact name="libsignal-android-0.65.4.module">
<sha256 value="d86f7b3e763be0638e8d0048292834a720412a57c67eeb764ade339a8a66350d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="libsignal-client" version="0.65.2">
<artifact name="libsignal-client-0.65.2.jar">
<sha256 value="ab3f8a2f8915bf14af9b219f7690026c33071a40da4a284213ba6cfc16538d72" origin="Generated by Gradle"/>
<component group="org.signal" name="libsignal-client" version="0.65.4">
<artifact name="libsignal-client-0.65.4.jar">
<sha256 value="4f57d871be39b000a9f5611feba60c305420c4c4a1ed1d224584d0d9c4325d0c" origin="Generated by Gradle"/>
</artifact>
<artifact name="libsignal-client-0.65.2.module">
<sha256 value="4b1ab575de696867241e1bbbee4224824f6c38aa835d422e591a62cdc98dd34c" origin="Generated by Gradle"/>
<artifact name="libsignal-client-0.65.4.module">
<sha256 value="45c7e668b5fa408d9e2c389631e72cd11741aeff375ef2c8f0e74752f6e687d2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="ringrtc-android" version="2.49.3">