Update libsignal-service

This commit is contained in:
AsamK 2023-09-23 16:21:19 +02:00
parent 73b4239744
commit f1d735f93d
22 changed files with 229 additions and 555 deletions

View File

@ -101,55 +101,10 @@
"methods":[{"name":"<init>","parameterTypes":[] }] "methods":[{"name":"<init>","parameterTypes":[] }]
}, },
{ {
"name":"com.google.protobuf.AbstractProtobufList", "name":"com.squareup.wire.internal.ImmutableList",
"allDeclaredFields":true, "allDeclaredFields":true,
"allDeclaredMethods":true "queryAllDeclaredMethods":true,
}, "queryAllDeclaredConstructors":true
{
"name":"com.google.protobuf.ByteString"
},
{
"name":"com.google.protobuf.DescriptorMessageInfoFactory"
},
{
"name":"com.google.protobuf.ExtensionRegistry"
},
{
"name":"com.google.protobuf.ExtensionSchemaFull"
},
{
"name":"com.google.protobuf.GeneratedMessageLite",
"fields":[{"name":"unknownFields"}]
},
{
"name":"com.google.protobuf.GeneratedMessageV3"
},
{
"name":"com.google.protobuf.Internal$LongList",
"allDeclaredMethods":true
},
{
"name":"com.google.protobuf.Internal$ProtobufList",
"allDeclaredMethods":true
},
{
"name":"com.google.protobuf.LongArrayList",
"allDeclaredFields":true,
"allDeclaredMethods":true,
"allDeclaredConstructors":true
},
{
"name":"com.google.protobuf.MapFieldSchemaFull"
},
{
"name":"com.google.protobuf.NewInstanceSchemaFull"
},
{
"name":"com.google.protobuf.PrimitiveNonBoxingCollection",
"allDeclaredMethods":true
},
{
"name":"com.google.protobuf.UnknownFieldSetSchema"
}, },
{ {
"name":"com.sun.crypto.provider.AESCipher$General", "name":"com.sun.crypto.provider.AESCipher$General",
@ -534,6 +489,16 @@
{ {
"name":"kotlin.String" "name":"kotlin.String"
}, },
{
"name":"kotlin.collections.AbstractCollection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"kotlin.collections.AbstractList",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{ {
"name":"kotlin.collections.List" "name":"kotlin.collections.List"
}, },
@ -547,6 +512,10 @@
{ {
"name":"kotlin.jvm.internal.DefaultConstructorMarker" "name":"kotlin.jvm.internal.DefaultConstructorMarker"
}, },
{
"name":"kotlin.jvm.internal.markers.KMappedMarker",
"queryAllDeclaredMethods":true
},
{ {
"name":"kotlin.reflect.jvm.internal.ReflectionFactoryImpl", "name":"kotlin.reflect.jvm.internal.ReflectionFactoryImpl",
"methods":[{"name":"<init>","parameterTypes":[] }] "methods":[{"name":"<init>","parameterTypes":[] }]
@ -844,31 +813,36 @@
"name":"org.asamk.signal.json.JsonContactAddress", "name":"org.asamk.signal.json.JsonContactAddress",
"allDeclaredFields":true, "allDeclaredFields":true,
"allDeclaredMethods":true, "allDeclaredMethods":true,
"allDeclaredConstructors":true "allDeclaredConstructors":true,
"methods":[{"name":"city","parameterTypes":[] }, {"name":"country","parameterTypes":[] }, {"name":"label","parameterTypes":[] }, {"name":"neighborhood","parameterTypes":[] }, {"name":"pobox","parameterTypes":[] }, {"name":"postcode","parameterTypes":[] }, {"name":"region","parameterTypes":[] }, {"name":"street","parameterTypes":[] }, {"name":"type","parameterTypes":[] }]
}, },
{ {
"name":"org.asamk.signal.json.JsonContactAvatar", "name":"org.asamk.signal.json.JsonContactAvatar",
"allDeclaredFields":true, "allDeclaredFields":true,
"allDeclaredMethods":true, "allDeclaredMethods":true,
"allDeclaredConstructors":true "allDeclaredConstructors":true,
"methods":[{"name":"attachment","parameterTypes":[] }, {"name":"isProfile","parameterTypes":[] }]
}, },
{ {
"name":"org.asamk.signal.json.JsonContactEmail", "name":"org.asamk.signal.json.JsonContactEmail",
"allDeclaredFields":true, "allDeclaredFields":true,
"allDeclaredMethods":true, "allDeclaredMethods":true,
"allDeclaredConstructors":true "allDeclaredConstructors":true,
"methods":[{"name":"label","parameterTypes":[] }, {"name":"type","parameterTypes":[] }, {"name":"value","parameterTypes":[] }]
}, },
{ {
"name":"org.asamk.signal.json.JsonContactName", "name":"org.asamk.signal.json.JsonContactName",
"allDeclaredFields":true, "allDeclaredFields":true,
"allDeclaredMethods":true, "allDeclaredMethods":true,
"allDeclaredConstructors":true "allDeclaredConstructors":true,
"methods":[{"name":"display","parameterTypes":[] }, {"name":"family","parameterTypes":[] }, {"name":"given","parameterTypes":[] }, {"name":"middle","parameterTypes":[] }, {"name":"prefix","parameterTypes":[] }, {"name":"suffix","parameterTypes":[] }]
}, },
{ {
"name":"org.asamk.signal.json.JsonContactPhone", "name":"org.asamk.signal.json.JsonContactPhone",
"allDeclaredFields":true, "allDeclaredFields":true,
"allDeclaredMethods":true, "allDeclaredMethods":true,
"allDeclaredConstructors":true "allDeclaredConstructors":true,
"methods":[{"name":"label","parameterTypes":[] }, {"name":"type","parameterTypes":[] }, {"name":"value","parameterTypes":[] }]
}, },
{ {
"name":"org.asamk.signal.json.JsonDataMessage", "name":"org.asamk.signal.json.JsonDataMessage",
@ -984,7 +958,8 @@
"name":"org.asamk.signal.json.JsonSharedContact", "name":"org.asamk.signal.json.JsonSharedContact",
"allDeclaredFields":true, "allDeclaredFields":true,
"allDeclaredMethods":true, "allDeclaredMethods":true,
"allDeclaredConstructors":true "allDeclaredConstructors":true,
"methods":[{"name":"address","parameterTypes":[] }, {"name":"avatar","parameterTypes":[] }, {"name":"email","parameterTypes":[] }, {"name":"name","parameterTypes":[] }, {"name":"organization","parameterTypes":[] }, {"name":"phone","parameterTypes":[] }]
}, },
{ {
"name":"org.asamk.signal.json.JsonSticker", "name":"org.asamk.signal.json.JsonSticker",
@ -2130,13 +2105,6 @@
{ {
"name":"org.whispersystems.signalservice.api.push.ServiceId$ACI" "name":"org.whispersystems.signalservice.api.push.ServiceId$ACI"
}, },
{
"name":"org.whispersystems.signalservice.api.push.ServiceId$Companion",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"fromLibSignal","parameterTypes":["org.signal.libsignal.protocol.ServiceId"] }, {"name":"parseOrNull","parameterTypes":["com.google.protobuf.ByteString"] }, {"name":"parseOrNull","parameterTypes":["java.lang.String"] }, {"name":"parseOrNull","parameterTypes":["byte[]"] }, {"name":"parseOrThrow","parameterTypes":["com.google.protobuf.ByteString"] }, {"name":"parseOrThrow","parameterTypes":["java.lang.String"] }, {"name":"parseOrThrow","parameterTypes":["byte[]"] }]
},
{ {
"name":"org.whispersystems.signalservice.api.push.ServiceId$PNI" "name":"org.whispersystems.signalservice.api.push.ServiceId$PNI"
}, },
@ -2534,270 +2502,6 @@
"name":"org.whispersystems.signalservice.internal.push.SenderCertificate$ByteArrayDesieralizer", "name":"org.whispersystems.signalservice.internal.push.SenderCertificate$ByteArrayDesieralizer",
"methods":[{"name":"<init>","parameterTypes":[] }] "methods":[{"name":"<init>","parameterTypes":[] }]
}, },
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$AttachmentPointer",
"fields":[{"name":"attachmentIdentifierCase_"}, {"name":"attachmentIdentifier_"}, {"name":"bitField0_"}, {"name":"blurHash_"}, {"name":"caption_"}, {"name":"cdnNumber_"}, {"name":"contentType_"}, {"name":"digest_"}, {"name":"fileName_"}, {"name":"flags_"}, {"name":"height_"}, {"name":"incrementalDigest_"}, {"name":"key_"}, {"name":"size_"}, {"name":"thumbnail_"}, {"name":"uploadTimestamp_"}, {"name":"width_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$BodyRange",
"fields":[{"name":"associatedValueCase_"}, {"name":"associatedValue_"}, {"name":"bitField0_"}, {"name":"length_"}, {"name":"start_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage",
"fields":[{"name":"answer_"}, {"name":"bitField0_"}, {"name":"busy_"}, {"name":"destinationDeviceId_"}, {"name":"hangup_"}, {"name":"iceUpdate_"}, {"name":"legacyHangup_"}, {"name":"multiRing_"}, {"name":"offer_"}, {"name":"opaque_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Answer",
"fields":[{"name":"bitField0_"}, {"name":"id_"}, {"name":"opaque_"}, {"name":"sdp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Hangup",
"fields":[{"name":"bitField0_"}, {"name":"deviceId_"}, {"name":"id_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$IceUpdate",
"fields":[{"name":"bitField0_"}, {"name":"id_"}, {"name":"line_"}, {"name":"mid_"}, {"name":"opaque_"}, {"name":"sdp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Offer",
"fields":[{"name":"bitField0_"}, {"name":"id_"}, {"name":"opaque_"}, {"name":"sdp_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Opaque",
"fields":[{"name":"bitField0_"}, {"name":"data_"}, {"name":"urgency_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ContactDetails",
"fields":[{"name":"aci_"}, {"name":"archived_"}, {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"blocked_"}, {"name":"color_"}, {"name":"expireTimer_"}, {"name":"inboxPosition_"}, {"name":"name_"}, {"name":"number_"}, {"name":"profileKey_"}, {"name":"verified_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ContactDetails$Avatar",
"fields":[{"name":"bitField0_"}, {"name":"contentType_"}, {"name":"length_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Content",
"fields":[{"name":"bitField0_"}, {"name":"callMessage_"}, {"name":"dataMessage_"}, {"name":"decryptionErrorMessage_"}, {"name":"editMessage_"}, {"name":"nullMessage_"}, {"name":"pniSignatureMessage_"}, {"name":"receiptMessage_"}, {"name":"senderKeyDistributionMessage_"}, {"name":"storyMessage_"}, {"name":"syncMessage_"}, {"name":"typingMessage_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage",
"fields":[{"name":"attachments_"}, {"name":"bitField0_"}, {"name":"bodyRanges_"}, {"name":"body_"}, {"name":"contact_"}, {"name":"delete_"}, {"name":"expireTimer_"}, {"name":"flags_"}, {"name":"giftBadge_"}, {"name":"groupCallUpdate_"}, {"name":"groupV2_"}, {"name":"group_"}, {"name":"isViewOnce_"}, {"name":"payment_"}, {"name":"preview_"}, {"name":"profileKey_"}, {"name":"quote_"}, {"name":"reaction_"}, {"name":"requiredProtocolVersion_"}, {"name":"sticker_"}, {"name":"storyContext_"}, {"name":"timestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact",
"fields":[{"name":"address_"}, {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"email_"}, {"name":"name_"}, {"name":"number_"}, {"name":"organization_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Avatar",
"fields":[{"name":"avatar_"}, {"name":"bitField0_"}, {"name":"isProfile_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Email",
"fields":[{"name":"bitField0_"}, {"name":"label_"}, {"name":"type_"}, {"name":"value_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Name",
"fields":[{"name":"bitField0_"}, {"name":"displayName_"}, {"name":"familyName_"}, {"name":"givenName_"}, {"name":"middleName_"}, {"name":"prefix_"}, {"name":"suffix_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Phone",
"fields":[{"name":"bitField0_"}, {"name":"label_"}, {"name":"type_"}, {"name":"value_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$PostalAddress",
"fields":[{"name":"bitField0_"}, {"name":"city_"}, {"name":"country_"}, {"name":"label_"}, {"name":"neighborhood_"}, {"name":"pobox_"}, {"name":"postcode_"}, {"name":"region_"}, {"name":"street_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Delete",
"fields":[{"name":"bitField0_"}, {"name":"targetSentTimestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$GroupCallUpdate",
"fields":[{"name":"bitField0_"}, {"name":"eraId_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Payment",
"fields":[{"name":"itemCase_"}, {"name":"item_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Payment$Notification",
"fields":[{"name":"bitField0_"}, {"name":"note_"}, {"name":"transactionCase_"}, {"name":"transaction_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Payment$Notification$MobileCoin",
"fields":[{"name":"bitField0_"}, {"name":"receipt_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Quote",
"fields":[{"name":"attachments_"}, {"name":"authorAci_"}, {"name":"bitField0_"}, {"name":"bodyRanges_"}, {"name":"id_"}, {"name":"text_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Quote$QuotedAttachment",
"fields":[{"name":"bitField0_"}, {"name":"contentType_"}, {"name":"fileName_"}, {"name":"thumbnail_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Reaction",
"fields":[{"name":"bitField0_"}, {"name":"emoji_"}, {"name":"remove_"}, {"name":"targetAuthorAci_"}, {"name":"targetSentTimestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Sticker",
"fields":[{"name":"bitField0_"}, {"name":"data_"}, {"name":"emoji_"}, {"name":"packId_"}, {"name":"packKey_"}, {"name":"stickerId_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$StoryContext",
"fields":[{"name":"authorAci_"}, {"name":"bitField0_"}, {"name":"sentTimestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$EditMessage",
"fields":[{"name":"bitField0_"}, {"name":"dataMessage_"}, {"name":"targetSentTimestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Envelope",
"fields":[{"name":"bitField0_"}, {"name":"content_"}, {"name":"destinationServiceId_"}, {"name":"reportingToken_"}, {"name":"serverGuid_"}, {"name":"serverTimestamp_"}, {"name":"sourceDevice_"}, {"name":"sourceServiceId_"}, {"name":"story_"}, {"name":"timestamp_"}, {"name":"type_"}, {"name":"updatedPni_"}, {"name":"urgent_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContext",
"fields":[{"name":"avatar_"}, {"name":"bitField0_"}, {"name":"id_"}, {"name":"membersE164_"}, {"name":"members_"}, {"name":"name_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContext$Member",
"fields":[{"name":"bitField0_"}, {"name":"e164_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContextV2",
"fields":[{"name":"bitField0_"}, {"name":"groupChange_"}, {"name":"masterKey_"}, {"name":"revision_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupDetails",
"fields":[{"name":"active_"}, {"name":"archived_"}, {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"blocked_"}, {"name":"color_"}, {"name":"expireTimer_"}, {"name":"id_"}, {"name":"inboxPosition_"}, {"name":"membersE164_"}, {"name":"members_"}, {"name":"name_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupDetails$Avatar",
"fields":[{"name":"bitField0_"}, {"name":"contentType_"}, {"name":"length_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupDetails$Member",
"fields":[{"name":"bitField0_"}, {"name":"e164_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$NullMessage",
"fields":[{"name":"bitField0_"}, {"name":"padding_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$PaymentAddress",
"fields":[{"name":"addressCase_"}, {"name":"address_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$PaymentAddress$MobileCoinAddress",
"fields":[{"name":"address_"}, {"name":"bitField0_"}, {"name":"signature_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$PniSignatureMessage",
"fields":[{"name":"bitField0_"}, {"name":"pni_"}, {"name":"signature_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Preview",
"fields":[{"name":"bitField0_"}, {"name":"date_"}, {"name":"description_"}, {"name":"image_"}, {"name":"title_"}, {"name":"url_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ReceiptMessage",
"fields":[{"name":"bitField0_"}, {"name":"timestamp_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$StoryMessage",
"fields":[{"name":"allowsReplies_"}, {"name":"attachmentCase_"}, {"name":"attachment_"}, {"name":"bitField0_"}, {"name":"bodyRanges_"}, {"name":"group_"}, {"name":"profileKey_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage",
"fields":[{"name":"bitField0_"}, {"name":"blocked_"}, {"name":"callEvent_"}, {"name":"callLinkUpdate_"}, {"name":"callLogEvent_"}, {"name":"configuration_"}, {"name":"contacts_"}, {"name":"fetchLatest_"}, {"name":"groups_"}, {"name":"keys_"}, {"name":"messageRequestResponse_"}, {"name":"outgoingPayment_"}, {"name":"padding_"}, {"name":"pniChangeNumber_"}, {"name":"read_"}, {"name":"request_"}, {"name":"sent_"}, {"name":"stickerPackOperation_"}, {"name":"verified_"}, {"name":"viewOnceOpen_"}, {"name":"viewed_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Blocked",
"fields":[{"name":"acis_"}, {"name":"groupIds_"}, {"name":"numbers_"}, {"name":"uuids_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$CallEvent",
"fields":[{"name":"bitField0_"}, {"name":"conversationId_"}, {"name":"direction_"}, {"name":"event_"}, {"name":"id_"}, {"name":"timestamp_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Configuration",
"fields":[{"name":"bitField0_"}, {"name":"linkPreviews_"}, {"name":"provisioningVersion_"}, {"name":"readReceipts_"}, {"name":"typingIndicators_"}, {"name":"unidentifiedDeliveryIndicators_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Contacts",
"fields":[{"name":"bitField0_"}, {"name":"blob_"}, {"name":"complete_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$FetchLatest",
"fields":[{"name":"bitField0_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Groups",
"fields":[{"name":"bitField0_"}, {"name":"blob_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Keys",
"fields":[{"name":"bitField0_"}, {"name":"storageService_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$MessageRequestResponse",
"fields":[{"name":"bitField0_"}, {"name":"groupId_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$OutgoingPayment",
"fields":[{"name":"bitField0_"}, {"name":"note_"}, {"name":"paymentDetailCase_"}, {"name":"paymentDetail_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$OutgoingPayment$MobileCoin",
"fields":[{"name":"amountPicoMob_"}, {"name":"bitField0_"}, {"name":"feePicoMob_"}, {"name":"ledgerBlockIndex_"}, {"name":"ledgerBlockTimestamp_"}, {"name":"outputPublicKeys_"}, {"name":"receipt_"}, {"name":"recipientAddress_"}, {"name":"spentKeyImages_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Read",
"fields":[{"name":"bitField0_"}, {"name":"senderAci_"}, {"name":"timestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Request",
"fields":[{"name":"bitField0_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent",
"fields":[{"name":"bitField0_"}, {"name":"destinationE164_"}, {"name":"destinationServiceId_"}, {"name":"editMessage_"}, {"name":"expirationStartTimestamp_"}, {"name":"isRecipientUpdate_"}, {"name":"message_"}, {"name":"storyMessageRecipients_"}, {"name":"storyMessage_"}, {"name":"timestamp_"}, {"name":"unidentifiedStatus_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent$StoryMessageRecipient",
"fields":[{"name":"bitField0_"}, {"name":"destinationServiceId_"}, {"name":"distributionListIds_"}, {"name":"isAllowedToReply_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent$UnidentifiedDeliveryStatus",
"fields":[{"name":"bitField0_"}, {"name":"destinationServiceId_"}, {"name":"unidentified_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$StickerPackOperation",
"fields":[{"name":"bitField0_"}, {"name":"packId_"}, {"name":"packKey_"}, {"name":"type_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$ViewOnceOpen",
"fields":[{"name":"bitField0_"}, {"name":"timestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Viewed",
"fields":[{"name":"bitField0_"}, {"name":"senderAci_"}, {"name":"timestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$TextAttachment",
"fields":[{"name":"backgroundCase_"}, {"name":"background_"}, {"name":"bitField0_"}, {"name":"preview_"}, {"name":"textBackgroundColor_"}, {"name":"textForegroundColor_"}, {"name":"textStyle_"}, {"name":"text_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$TextAttachment$Gradient",
"fields":[{"name":"angle_"}, {"name":"bitField0_"}, {"name":"colors_"}, {"name":"endColor_"}, {"name":"positions_"}, {"name":"startColor_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$TypingMessage",
"fields":[{"name":"action_"}, {"name":"bitField0_"}, {"name":"groupId_"}, {"name":"timestamp_"}]
},
{
"name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Verified",
"fields":[{"name":"bitField0_"}, {"name":"destinationAci_"}, {"name":"identityKey_"}, {"name":"nullMessage_"}, {"name":"state_"}]
},
{ {
"name":"org.whispersystems.signalservice.internal.push.StaleDevices", "name":"org.whispersystems.signalservice.internal.push.StaleDevices",
"allDeclaredFields":true, "allDeclaredFields":true,

View File

@ -20,7 +20,6 @@ dependencies {
implementation(files(libsignalClientPath)) implementation(files(libsignalClientPath))
} }
implementation(libs.jackson.databind) implementation(libs.jackson.databind)
implementation(libs.protobuf)
implementation(libs.bouncycastle) implementation(libs.bouncycastle)
implementation(libs.slf4j.api) implementation(libs.slf4j.api)
implementation(libs.sqlite) implementation(libs.sqlite)

View File

@ -8,7 +8,7 @@ import org.signal.libsignal.protocol.message.CiphertextMessage;
import org.signal.libsignal.protocol.message.DecryptionErrorMessage; import org.signal.libsignal.protocol.message.DecryptionErrorMessage;
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.Envelope;
import java.util.Optional; import java.util.Optional;
@ -62,10 +62,14 @@ public class SendRetryMessageRequestAction implements HandleAction {
} }
private static int envelopeTypeToCiphertextMessageType(int envelopeType) { private static int envelopeTypeToCiphertextMessageType(int envelopeType) {
return switch (envelopeType) { final var type = Envelope.Type.fromValue(envelopeType);
case SignalServiceProtos.Envelope.Type.PREKEY_BUNDLE_VALUE -> CiphertextMessage.PREKEY_TYPE; if (type == null) {
case SignalServiceProtos.Envelope.Type.UNIDENTIFIED_SENDER_VALUE -> CiphertextMessage.SENDERKEY_TYPE; return CiphertextMessage.WHISPER_TYPE;
case SignalServiceProtos.Envelope.Type.PLAINTEXT_CONTENT_VALUE -> CiphertextMessage.PLAINTEXT_CONTENT_TYPE; }
return switch (type) {
case PREKEY_BUNDLE -> CiphertextMessage.PREKEY_TYPE;
case UNIDENTIFIED_SENDER -> CiphertextMessage.SENDERKEY_TYPE;
case PLAINTEXT_CONTENT -> CiphertextMessage.PLAINTEXT_CONTENT_TYPE;
default -> CiphertextMessage.WHISPER_TYPE; default -> CiphertextMessage.WHISPER_TYPE;
}; };
} }

View File

@ -1,7 +1,5 @@
package org.asamk.signal.manager.api; package org.asamk.signal.manager.api;
import com.google.protobuf.ByteString;
import org.asamk.signal.manager.groups.GroupLinkPassword; import org.asamk.signal.manager.groups.GroupLinkPassword;
import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.InvalidInputException;
import org.signal.libsignal.zkgroup.groups.GroupMasterKey; import org.signal.libsignal.zkgroup.groups.GroupMasterKey;
@ -13,6 +11,8 @@ import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import okio.ByteString;
public final class GroupInviteLinkUrl { public final class GroupInviteLinkUrl {
private static final String GROUP_URL_HOST = "signal.group"; private static final String GROUP_URL_HOST = "signal.group";
@ -24,7 +24,7 @@ public final class GroupInviteLinkUrl {
public static GroupInviteLinkUrl forGroup(GroupMasterKey groupMasterKey, DecryptedGroup group) { public static GroupInviteLinkUrl forGroup(GroupMasterKey groupMasterKey, DecryptedGroup group) {
return new GroupInviteLinkUrl(groupMasterKey, return new GroupInviteLinkUrl(groupMasterKey,
GroupLinkPassword.fromBytes(group.getInviteLinkPassword().toByteArray())); GroupLinkPassword.fromBytes(group.inviteLinkPassword.toByteArray()));
} }
/** /**
@ -50,19 +50,16 @@ public final class GroupInviteLinkUrl {
} }
var bytes = Base64UrlSafe.decodePaddingAgnostic(encoding); var bytes = Base64UrlSafe.decodePaddingAgnostic(encoding);
var groupInviteLink = GroupInviteLink.parseFrom(bytes); GroupInviteLink groupInviteLink = GroupInviteLink.ADAPTER.decode(bytes);
switch (groupInviteLink.getContentsCase()) { if (groupInviteLink.v1Contents != null) {
case V1CONTENTS -> { var groupInviteLinkContentsV1 = groupInviteLink.v1Contents;
var groupInviteLinkContentsV1 = groupInviteLink.getV1Contents(); var groupMasterKey = new GroupMasterKey(groupInviteLinkContentsV1.groupMasterKey.toByteArray());
var groupMasterKey = new GroupMasterKey(groupInviteLinkContentsV1.getGroupMasterKey() var password = GroupLinkPassword.fromBytes(groupInviteLinkContentsV1.inviteLinkPassword.toByteArray());
.toByteArray());
var password = GroupLinkPassword.fromBytes(groupInviteLinkContentsV1.getInviteLinkPassword()
.toByteArray());
return new GroupInviteLinkUrl(groupMasterKey, password); return new GroupInviteLinkUrl(groupMasterKey, password);
} } else {
default -> throw new UnknownGroupLinkVersionException("Url contains no known group link content"); throw new UnknownGroupLinkVersionException("Url contains no known group link content");
} }
} catch (InvalidInputException | IOException e) { } catch (InvalidInputException | IOException e) {
throw new InvalidGroupLinkException(e); throw new InvalidGroupLinkException(e);
@ -93,13 +90,12 @@ public final class GroupInviteLinkUrl {
} }
private static String createUrl(GroupMasterKey groupMasterKey, GroupLinkPassword password) { private static String createUrl(GroupMasterKey groupMasterKey, GroupLinkPassword password) {
var groupInviteLink = GroupInviteLink.newBuilder() var groupInviteLink = new GroupInviteLink.Builder().v1Contents(new GroupInviteLink.GroupInviteLinkContentsV1.Builder().groupMasterKey(
.setV1Contents(GroupInviteLink.GroupInviteLinkContentsV1.newBuilder() ByteString.of(groupMasterKey.serialize()))
.setGroupMasterKey(ByteString.copyFrom(groupMasterKey.serialize())) .inviteLinkPassword(ByteString.of(password.serialize()))
.setInviteLinkPassword(ByteString.copyFrom(password.serialize()))) .build()).build();
.build();
var encoding = Base64UrlSafe.encodeBytesWithoutPadding(groupInviteLink.toByteArray()); var encoding = Base64UrlSafe.encodeBytesWithoutPadding(groupInviteLink.encode());
return GROUP_URL_PREFIX + encoding; return GROUP_URL_PREFIX + encoding;
} }

View File

@ -39,8 +39,6 @@ import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.whispersystems.signalservice.internal.push.SignalServiceProtos.BodyRange;
public record MessageEnvelope( public record MessageEnvelope(
Optional<RecipientAddress> sourceAddress, Optional<RecipientAddress> sourceAddress,
int sourceDevice, int sourceDevice,
@ -160,7 +158,7 @@ public record MessageEnvelope(
.map(a -> a.stream().map(preview -> Preview.from(preview, fileProvider)).toList()) .map(a -> a.stream().map(preview -> Preview.from(preview, fileProvider)).toList())
.orElse(List.of()), .orElse(List.of()),
dataMessage.getBodyRanges() dataMessage.getBodyRanges()
.map(a -> a.stream().filter(BodyRange::hasStyle).map(TextStyle::from).toList()) .map(a -> a.stream().filter(r -> r.style != null).map(TextStyle::from).toList())
.orElse(List.of())); .orElse(List.of()));
} }
@ -250,7 +248,7 @@ public record MessageEnvelope(
? List.of() ? List.of()
: quote.getBodyRanges() : quote.getBodyRanges()
.stream() .stream()
.filter(BodyRange::hasStyle) .filter(r -> r.style != null)
.map(TextStyle::from) .map(TextStyle::from)
.toList()); .toList());
} }
@ -765,13 +763,12 @@ public record MessageEnvelope(
} }
} }
public record Hangup(long id, Type type, int deviceId, boolean isLegacy) { public record Hangup(long id, Type type, int deviceId) {
static Hangup from(HangupMessage hangupMessage) { static Hangup from(HangupMessage hangupMessage) {
return new Hangup(hangupMessage.getId(), return new Hangup(hangupMessage.getId(),
Type.from(hangupMessage.getType()), Type.from(hangupMessage.getType()),
hangupMessage.getDeviceId(), hangupMessage.getDeviceId());
hangupMessage.isLegacy());
} }
public enum Type { public enum Type {

View File

@ -1,8 +1,8 @@
package org.asamk.signal.manager.api; package org.asamk.signal.manager.api;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.BodyRange;
public record TextStyle(Style style, int start, int length) { public record TextStyle(Style style, Integer start, Integer length) {
public enum Style { public enum Style {
NONE, NONE,
@ -12,7 +12,10 @@ public record TextStyle(Style style, int start, int length) {
STRIKETHROUGH, STRIKETHROUGH,
MONOSPACE; MONOSPACE;
static Style fromInternal(SignalServiceProtos.BodyRange.Style style) { static Style fromInternal(BodyRange.Style style) {
if (style == null) {
return NONE;
}
return switch (style) { return switch (style) {
case NONE -> NONE; case NONE -> NONE;
case BOLD -> BOLD; case BOLD -> BOLD;
@ -35,27 +38,26 @@ public record TextStyle(Style style, int start, int length) {
}; };
} }
SignalServiceProtos.BodyRange.Style toBodyRangeStyle() { BodyRange.Style toBodyRangeStyle() {
return switch (this) { return switch (this) {
case NONE -> SignalServiceProtos.BodyRange.Style.NONE; case NONE -> BodyRange.Style.NONE;
case BOLD -> SignalServiceProtos.BodyRange.Style.BOLD; case BOLD -> BodyRange.Style.BOLD;
case ITALIC -> SignalServiceProtos.BodyRange.Style.ITALIC; case ITALIC -> BodyRange.Style.ITALIC;
case SPOILER -> SignalServiceProtos.BodyRange.Style.SPOILER; case SPOILER -> BodyRange.Style.SPOILER;
case STRIKETHROUGH -> SignalServiceProtos.BodyRange.Style.STRIKETHROUGH; case STRIKETHROUGH -> BodyRange.Style.STRIKETHROUGH;
case MONOSPACE -> SignalServiceProtos.BodyRange.Style.MONOSPACE; case MONOSPACE -> BodyRange.Style.MONOSPACE;
}; };
} }
} }
static TextStyle from(SignalServiceProtos.BodyRange bodyRange) { static TextStyle from(BodyRange bodyRange) {
return new TextStyle(Style.fromInternal(bodyRange.getStyle()), bodyRange.getStart(), bodyRange.getLength()); return new TextStyle(Style.fromInternal(bodyRange.style), bodyRange.start, bodyRange.length);
} }
public SignalServiceProtos.BodyRange toBodyRange() { public BodyRange toBodyRange() {
return SignalServiceProtos.BodyRange.newBuilder() return new BodyRange.Builder().start(this.start())
.setStart(this.start()) .length(this.length())
.setLength(this.length()) .style(this.style().toBodyRangeStyle())
.setStyle(this.style().toBodyRangeStyle())
.build(); .build();
} }
} }

View File

@ -28,7 +28,7 @@ public class GroupUtils {
} else { } else {
final var groupInfoV2 = (GroupInfoV2) groupInfo; final var groupInfoV2 = (GroupInfoV2) groupInfo;
var group = SignalServiceGroupV2.newBuilder(groupInfoV2.getMasterKey()) var group = SignalServiceGroupV2.newBuilder(groupInfoV2.getMasterKey())
.withRevision(groupInfoV2.getGroup() == null ? 0 : groupInfoV2.getGroup().getRevision()) .withRevision(groupInfoV2.getGroup() == null ? 0 : groupInfoV2.getGroup().revision)
.build(); .build();
messageBuilder.asGroupMessage(group); messageBuilder.asGroupMessage(group);
} }

View File

@ -125,11 +125,11 @@ public class GroupHelper {
groupInfoV2 = new GroupInfoV2(groupId, groupMasterKey, account.getRecipientResolver()); groupInfoV2 = new GroupInfoV2(groupId, groupMasterKey, account.getRecipientResolver());
} }
if (groupInfoV2.getGroup() == null || groupInfoV2.getGroup().getRevision() < revision) { if (groupInfoV2.getGroup() == null || groupInfoV2.getGroup().revision < revision) {
DecryptedGroup group = null; DecryptedGroup group = null;
if (signedGroupChange != null if (signedGroupChange != null
&& groupInfoV2.getGroup() != null && groupInfoV2.getGroup() != null
&& groupInfoV2.getGroup().getRevision() + 1 == revision) { && groupInfoV2.getGroup().revision + 1 == revision) {
final var decryptedGroupChange = context.getGroupV2Helper() final var decryptedGroupChange = context.getGroupV2Helper()
.getDecryptedGroupChange(signedGroupChange, groupMasterKey); .getDecryptedGroupChange(signedGroupChange, groupMasterKey);
@ -151,8 +151,8 @@ public class GroupHelper {
} }
if (group != null) { if (group != null) {
storeProfileKeysFromMembers(group); storeProfileKeysFromMembers(group);
final var avatar = group.getAvatar(); final var avatar = group.avatar;
if (avatar != null && !avatar.isEmpty()) { if (!avatar.isEmpty()) {
downloadGroupAvatar(groupId, groupSecretParams, avatar); downloadGroupAvatar(groupId, groupSecretParams, avatar);
} }
} }
@ -300,14 +300,14 @@ public class GroupHelper {
} catch (GroupLinkNotActiveException e) { } catch (GroupLinkNotActiveException e) {
throw new InactiveGroupLinkException("Group link inactive (reason: " + e.getReason() + ")", e); throw new InactiveGroupLinkException("Group link inactive (reason: " + e.getReason() + ")", e);
} }
if (groupJoinInfo.getPendingAdminApproval()) { if (groupJoinInfo.pendingAdminApproval) {
throw new PendingAdminApprovalException("You have already requested to join the group."); throw new PendingAdminApprovalException("You have already requested to join the group.");
} }
final var groupChange = context.getGroupV2Helper() final var groupChange = context.getGroupV2Helper()
.joinGroup(inviteLinkUrl.getGroupMasterKey(), inviteLinkUrl.getPassword(), groupJoinInfo); .joinGroup(inviteLinkUrl.getGroupMasterKey(), inviteLinkUrl.getPassword(), groupJoinInfo);
final var group = getOrMigrateGroup(inviteLinkUrl.getGroupMasterKey(), final var group = getOrMigrateGroup(inviteLinkUrl.getGroupMasterKey(),
groupJoinInfo.getRevision() + 1, groupJoinInfo.revision + 1,
groupChange.toByteArray()); groupChange.encode());
if (group.getGroup() == null) { if (group.getGroup() == null) {
// Only requested member, can't send update to group members // Only requested member, can't send update to group members
@ -400,8 +400,8 @@ public class GroupHelper {
} catch (NotAGroupMemberException ignored) { } catch (NotAGroupMemberException ignored) {
} }
storeProfileKeysFromMembers(decryptedGroup); storeProfileKeysFromMembers(decryptedGroup);
final var avatar = decryptedGroup.getAvatar(); final var avatar = decryptedGroup.avatar;
if (avatar != null && !avatar.isEmpty()) { if (!avatar.isEmpty()) {
downloadGroupAvatar(groupInfoV2.getGroupId(), groupSecretParams, avatar); downloadGroupAvatar(groupInfoV2.getGroupId(), groupSecretParams, avatar);
} }
} }
@ -446,8 +446,8 @@ public class GroupHelper {
} }
private void storeProfileKeysFromMembers(final DecryptedGroup group) { private void storeProfileKeysFromMembers(final DecryptedGroup group) {
for (var member : group.getMembersList()) { for (var member : group.members) {
final var serviceId = ServiceId.parseOrThrow(member.getAciBytes()); final var serviceId = ServiceId.parseOrThrow(member.aciBytes);
final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId); final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId);
final var profileStore = account.getProfileStore(); final var profileStore = account.getProfileStore();
if (profileStore.getProfileKey(recipientId) != null) { if (profileStore.getProfileKey(recipientId) != null) {
@ -455,7 +455,7 @@ public class GroupHelper {
continue; continue;
} }
try { try {
profileStore.storeProfileKey(recipientId, new ProfileKey(member.getProfileKey().toByteArray())); profileStore.storeProfileKey(recipientId, new ProfileKey(member.profileKey.toByteArray()));
} catch (InvalidInputException ignored) { } catch (InvalidInputException ignored) {
} }
} }
@ -479,7 +479,7 @@ public class GroupHelper {
final DecryptedGroup newDecryptedGroup final DecryptedGroup newDecryptedGroup
) throws NotAGroupMemberException { ) throws NotAGroupMemberException {
final var revisionWeWereAdded = context.getGroupV2Helper().findRevisionWeWereAdded(newDecryptedGroup); final var revisionWeWereAdded = context.getGroupV2Helper().findRevisionWeWereAdded(newDecryptedGroup);
final var localRevision = localGroup.getGroup() == null ? 0 : localGroup.getGroup().getRevision(); final var localRevision = localGroup.getGroup() == null ? 0 : localGroup.getGroup().revision;
var fromRevision = Math.max(revisionWeWereAdded, localRevision); var fromRevision = Math.max(revisionWeWereAdded, localRevision);
final var newProfileKeys = new HashMap<RecipientId, ProfileKey>(); final var newProfileKeys = new HashMap<RecipientId, ProfileKey>();
while (true) { while (true) {
@ -753,7 +753,7 @@ public class GroupHelper {
groupInfoV2.setGroup(groupGroupChangePair.first()); groupInfoV2.setGroup(groupGroupChangePair.first());
account.getGroupStore().updateGroup(groupInfoV2); account.getGroupStore().updateGroup(groupInfoV2);
var messageBuilder = getGroupUpdateMessageBuilder(groupInfoV2, groupGroupChangePair.second().toByteArray()); var messageBuilder = getGroupUpdateMessageBuilder(groupInfoV2, groupGroupChangePair.second().encode());
return sendGroupMessage(messageBuilder, return sendGroupMessage(messageBuilder,
groupInfoV2.getMembersIncludingPendingWithout(account.getSelfRecipientId()), groupInfoV2.getMembersIncludingPendingWithout(account.getSelfRecipientId()),
groupInfoV2.getDistributionId()); groupInfoV2.getDistributionId());
@ -782,7 +782,7 @@ public class GroupHelper {
private SignalServiceDataMessage.Builder getGroupUpdateMessageBuilder(GroupInfoV2 g, byte[] signedGroupChange) { private SignalServiceDataMessage.Builder getGroupUpdateMessageBuilder(GroupInfoV2 g, byte[] signedGroupChange) {
var group = SignalServiceGroupV2.newBuilder(g.getMasterKey()) var group = SignalServiceGroupV2.newBuilder(g.getMasterKey())
.withRevision(g.getGroup().getRevision()) .withRevision(g.getGroup().revision)
.withSignedGroupChange(signedGroupChange); .withSignedGroupChange(signedGroupChange);
return SignalServiceDataMessage.newBuilder() return SignalServiceDataMessage.newBuilder()
.asGroupMessage(group.build()) .asGroupMessage(group.build())
@ -798,7 +798,7 @@ public class GroupHelper {
members.addAll(group.getMembersIncludingPendingWithout(selfRecipientId)); members.addAll(group.getMembersIncludingPendingWithout(selfRecipientId));
account.getGroupStore().updateGroup(group); account.getGroupStore().updateGroup(group);
final var messageBuilder = getGroupUpdateMessageBuilder(group, groupChange.toByteArray()); final var messageBuilder = getGroupUpdateMessageBuilder(group, groupChange.encode());
return sendGroupMessage(messageBuilder, members, group.getDistributionId()); return sendGroupMessage(messageBuilder, members, group.getDistributionId());
} }

View File

@ -1,8 +1,5 @@
package org.asamk.signal.manager.helper; package org.asamk.signal.manager.helper;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import org.asamk.signal.manager.api.GroupLinkState; import org.asamk.signal.manager.api.GroupLinkState;
import org.asamk.signal.manager.api.GroupPermission; import org.asamk.signal.manager.api.GroupPermission;
import org.asamk.signal.manager.api.NotAGroupMemberException; import org.asamk.signal.manager.api.NotAGroupMemberException;
@ -28,7 +25,6 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
import org.signal.storageservice.protos.groups.local.DecryptedGroupJoinInfo; import org.signal.storageservice.protos.groups.local.DecryptedGroupJoinInfo;
import org.signal.storageservice.protos.groups.local.DecryptedMember; import org.signal.storageservice.protos.groups.local.DecryptedMember;
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember; import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil;
@ -59,6 +55,8 @@ import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import okio.ByteString;
class GroupV2Helper { class GroupV2Helper {
private final static Logger logger = LoggerFactory.getLogger(GroupV2Helper.class); private final static Logger logger = LoggerFactory.getLogger(GroupV2Helper.class);
@ -126,12 +124,12 @@ class GroupV2Helper {
int findRevisionWeWereAdded(DecryptedGroup partialDecryptedGroup) { int findRevisionWeWereAdded(DecryptedGroup partialDecryptedGroup) {
ByteString aciBytes = getSelfAci().toByteString(); ByteString aciBytes = getSelfAci().toByteString();
ByteString pniBytes = getSelfPni().toByteString(); ByteString pniBytes = getSelfPni().toByteString();
for (DecryptedMember decryptedMember : partialDecryptedGroup.getMembersList()) { for (DecryptedMember decryptedMember : partialDecryptedGroup.members) {
if (decryptedMember.getAciBytes().equals(aciBytes) || decryptedMember.getPniBytes().equals(pniBytes)) { if (decryptedMember.aciBytes.equals(aciBytes) || decryptedMember.pniBytes.equals(pniBytes)) {
return decryptedMember.getJoinedAtRevision(); return decryptedMember.joinedAtRevision;
} }
} }
return partialDecryptedGroup.getRevision(); return partialDecryptedGroup.revision;
} }
Pair<GroupInfoV2, DecryptedGroup> createGroup( Pair<GroupInfoV2, DecryptedGroup> createGroup(
@ -203,19 +201,19 @@ class GroupV2Helper {
final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey());
var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams); var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams);
var change = name != null ? groupOperations.createModifyGroupTitle(name) : GroupChange.Actions.newBuilder(); var change = name != null ? groupOperations.createModifyGroupTitle(name) : new GroupChange.Actions.Builder();
if (description != null) { if (description != null) {
change.setModifyDescription(groupOperations.createModifyGroupDescriptionAction(description)); change.modifyDescription(groupOperations.createModifyGroupDescriptionAction(description).build());
} }
if (avatarFile != null) { if (avatarFile != null) {
var avatarCdnKey = dependencies.getGroupsV2Api() var avatarCdnKey = dependencies.getGroupsV2Api()
.uploadAvatar(avatarFile, groupSecretParams, getGroupAuthForToday(groupSecretParams)); .uploadAvatar(avatarFile, groupSecretParams, getGroupAuthForToday(groupSecretParams));
change.setModifyAvatar(GroupChange.Actions.ModifyAvatarAction.newBuilder().setAvatar(avatarCdnKey)); change.modifyAvatar(new GroupChange.Actions.ModifyAvatarAction.Builder().avatar(avatarCdnKey).build());
} }
change.setSourceServiceId(getSelfAci().toByteString()); change.sourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change); return commitChange(groupInfoV2, change);
} }
@ -241,7 +239,7 @@ class GroupV2Helper {
final var aci = getSelfAci(); final var aci = getSelfAci();
final var change = groupOperations.createModifyGroupMembershipChange(candidates, bannedUuids, aci); final var change = groupOperations.createModifyGroupMembershipChange(candidates, bannedUuids, aci);
change.setSourceServiceId(getSelfAci().toByteString()); change.sourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change); return commitChange(groupInfoV2, change);
} }
@ -249,7 +247,7 @@ class GroupV2Helper {
Pair<DecryptedGroup, GroupChange> leaveGroup( Pair<DecryptedGroup, GroupChange> leaveGroup(
GroupInfoV2 groupInfoV2, Set<RecipientId> membersToMakeAdmin GroupInfoV2 groupInfoV2, Set<RecipientId> membersToMakeAdmin
) throws IOException { ) throws IOException {
var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList(); var pendingMembersList = groupInfoV2.getGroup().pendingMembers;
final var selfAci = getSelfAci(); final var selfAci = getSelfAci();
var selfPendingMember = DecryptedGroupUtil.findPendingByServiceId(pendingMembersList, selfAci); var selfPendingMember = DecryptedGroupUtil.findPendingByServiceId(pendingMembersList, selfAci);
@ -302,7 +300,7 @@ class GroupV2Helper {
Pair<DecryptedGroup, GroupChange> revokeInvitedMembers( Pair<DecryptedGroup, GroupChange> revokeInvitedMembers(
GroupInfoV2 groupInfoV2, Set<RecipientId> members GroupInfoV2 groupInfoV2, Set<RecipientId> members
) throws IOException { ) throws IOException {
var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList(); var pendingMembersList = groupInfoV2.getGroup().pendingMembers;
final var memberUuids = members.stream() final var memberUuids = members.stream()
.map(context.getRecipientHelper()::resolveSignalServiceAddress) .map(context.getRecipientHelper()::resolveSignalServiceAddress)
.map(SignalServiceAddress::getServiceId) .map(SignalServiceAddress::getServiceId)
@ -324,9 +322,9 @@ class GroupV2Helper {
final var change = groupOperations.createBanServiceIdsChange(serviceIds, final var change = groupOperations.createBanServiceIdsChange(serviceIds,
false, false,
groupInfoV2.getGroup().getBannedMembersList()); groupInfoV2.getGroup().bannedMembers);
change.setSourceServiceId(getSelfAci().toByteString()); change.sourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change); return commitChange(groupInfoV2, change);
} }
@ -342,7 +340,7 @@ class GroupV2Helper {
final var change = groupOperations.createUnbanServiceIdsChange(serviceIds); final var change = groupOperations.createUnbanServiceIdsChange(serviceIds);
change.setSourceServiceId(getSelfAci().toByteString()); change.sourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change); return commitChange(groupInfoV2, change);
} }
@ -360,9 +358,8 @@ class GroupV2Helper {
final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
final var accessRequired = toAccessControl(state); final var accessRequired = toAccessControl(state);
final var requiresNewPassword = state != GroupLinkState.DISABLED && groupInfoV2.getGroup() final var requiresNewPassword = state != GroupLinkState.DISABLED
.getInviteLinkPassword() && groupInfoV2.getGroup().inviteLinkPassword.toByteArray().length == 0;
.isEmpty();
final var change = requiresNewPassword ? groupOperations.createModifyGroupLinkPasswordAndRightsChange( final var change = requiresNewPassword ? groupOperations.createModifyGroupLinkPasswordAndRightsChange(
GroupLinkPassword.createNew().serialize(), GroupLinkPassword.createNew().serialize(),
@ -393,14 +390,14 @@ class GroupV2Helper {
Pair<DecryptedGroup, GroupChange> updateSelfProfileKey(GroupInfoV2 groupInfoV2) throws IOException { Pair<DecryptedGroup, GroupChange> updateSelfProfileKey(GroupInfoV2 groupInfoV2) throws IOException {
Optional<DecryptedMember> selfInGroup = groupInfoV2.getGroup() == null Optional<DecryptedMember> selfInGroup = groupInfoV2.getGroup() == null
? Optional.empty() ? Optional.empty()
: DecryptedGroupUtil.findMemberByAci(groupInfoV2.getGroup().getMembersList(), getSelfAci()); : DecryptedGroupUtil.findMemberByAci(groupInfoV2.getGroup().members, getSelfAci());
if (selfInGroup.isEmpty()) { if (selfInGroup.isEmpty()) {
logger.trace("Not updating group, self not in group " + groupInfoV2.getGroupId().toBase64()); logger.trace("Not updating group, self not in group " + groupInfoV2.getGroupId().toBase64());
return null; return null;
} }
final var profileKey = context.getAccount().getProfileKey(); final var profileKey = context.getAccount().getProfileKey();
if (Arrays.equals(profileKey.serialize(), selfInGroup.get().getProfileKey().toByteArray())) { if (Arrays.equals(profileKey.serialize(), selfInGroup.get().profileKey.toByteArray())) {
logger.trace("Not updating group, own Profile Key is already up to date in group " logger.trace("Not updating group, own Profile Key is already up to date in group "
+ groupInfoV2.getGroupId().toBase64()); + groupInfoV2.getGroupId().toBase64());
return null; return null;
@ -416,7 +413,7 @@ class GroupV2Helper {
final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
final var change = groupOperations.createUpdateProfileKeyCredentialChange(profileKeyCredential); final var change = groupOperations.createUpdateProfileKeyCredentialChange(profileKeyCredential);
change.setSourceServiceId(getSelfAci().toByteString()); change.sourceServiceId(getSelfAci().toByteString());
return commitChange(groupInfoV2, change); return commitChange(groupInfoV2, change);
} }
@ -434,17 +431,17 @@ class GroupV2Helper {
throw new IOException("Cannot join a V2 group as self does not have a versioned profile"); throw new IOException("Cannot join a V2 group as self does not have a versioned profile");
} }
var requestToJoin = decryptedGroupJoinInfo.getAddFromInviteLink() == AccessControl.AccessRequired.ADMINISTRATOR; var requestToJoin = decryptedGroupJoinInfo.addFromInviteLink == AccessControl.AccessRequired.ADMINISTRATOR;
var change = requestToJoin var change = requestToJoin
? groupOperations.createGroupJoinRequest(profileKeyCredential) ? groupOperations.createGroupJoinRequest(profileKeyCredential)
: groupOperations.createGroupJoinDirect(profileKeyCredential); : groupOperations.createGroupJoinDirect(profileKeyCredential);
change.setSourceServiceId(context.getRecipientHelper() change.sourceServiceId(context.getRecipientHelper()
.resolveSignalServiceAddress(selfRecipientId) .resolveSignalServiceAddress(selfRecipientId)
.getServiceId() .getServiceId()
.toByteString()); .toByteString());
return commitChange(groupSecretParams, decryptedGroupJoinInfo.getRevision(), change, groupLinkPassword); return commitChange(groupSecretParams, decryptedGroupJoinInfo.revision, change, groupLinkPassword);
} }
Pair<DecryptedGroup, GroupChange> acceptInvite(GroupInfoV2 groupInfoV2) throws IOException { Pair<DecryptedGroup, GroupChange> acceptInvite(GroupInfoV2 groupInfoV2) throws IOException {
@ -459,7 +456,7 @@ class GroupV2Helper {
final var change = groupOperations.createAcceptInviteChange(profileKeyCredential); final var change = groupOperations.createAcceptInviteChange(profileKeyCredential);
final var aci = context.getRecipientHelper().resolveSignalServiceAddress(selfRecipientId).getServiceId(); final var aci = context.getRecipientHelper().resolveSignalServiceAddress(selfRecipientId).getServiceId();
change.setSourceServiceId(aci.toByteString()); change.sourceServiceId(aci.toByteString());
return commitChange(groupInfoV2, change); return commitChange(groupInfoV2, change);
} }
@ -520,7 +517,7 @@ class GroupV2Helper {
final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
final var uuidCipherTexts = pendingMembers.stream().map(member -> { final var uuidCipherTexts = pendingMembers.stream().map(member -> {
try { try {
return new UuidCiphertext(member.getServiceIdCipherText().toByteArray()); return new UuidCiphertext(member.serviceIdCipherText.toByteArray());
} catch (InvalidInputException e) { } catch (InvalidInputException e) {
throw new AssertionError(e); throw new AssertionError(e);
} }
@ -555,8 +552,8 @@ class GroupV2Helper {
final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey());
final var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams); final var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams);
final var previousGroupState = groupInfoV2.getGroup(); final var previousGroupState = groupInfoV2.getGroup();
final var nextRevision = previousGroupState.getRevision() + 1; final var nextRevision = previousGroupState.revision + 1;
final var changeActions = change.setRevision(nextRevision).build(); final var changeActions = change.revision(nextRevision).build();
final DecryptedGroupChange decryptedChange; final DecryptedGroupChange decryptedChange;
final DecryptedGroup decryptedGroupState; final DecryptedGroup decryptedGroupState;
@ -580,7 +577,7 @@ class GroupV2Helper {
GroupLinkPassword password GroupLinkPassword password
) throws IOException { ) throws IOException {
final var nextRevision = currentRevision + 1; final var nextRevision = currentRevision + 1;
final var changeActions = change.setRevision(nextRevision).build(); final var changeActions = change.revision(nextRevision).build();
return dependencies.getGroupsV2Api() return dependencies.getGroupsV2Api()
.patchGroup(changeActions, .patchGroup(changeActions,
@ -589,17 +586,16 @@ class GroupV2Helper {
} }
Pair<ServiceId, ProfileKey> getAuthoritativeProfileKeyFromChange(final DecryptedGroupChange change) { Pair<ServiceId, ProfileKey> getAuthoritativeProfileKeyFromChange(final DecryptedGroupChange change) {
UUID editor = UuidUtil.fromByteStringOrNull(change.getEditorServiceIdBytes()); UUID editor = UuidUtil.fromByteStringOrNull(change.editorServiceIdBytes);
final var editorProfileKeyBytes = Stream.concat(Stream.of(change.getNewMembersList().stream(), final var editorProfileKeyBytes = Stream.concat(Stream.of(change.newMembers.stream(),
change.getPromotePendingMembersList().stream(), change.promotePendingMembers.stream(),
change.getModifiedProfileKeysList().stream()) change.modifiedProfileKeys.stream())
.flatMap(Function.identity()) .flatMap(Function.identity())
.filter(m -> UuidUtil.fromByteString(m.getAciBytes()).equals(editor)) .filter(m -> UuidUtil.fromByteString(m.aciBytes).equals(editor))
.map(DecryptedMember::getProfileKey), .map(m -> m.profileKey),
change.getNewRequestingMembersList() change.newRequestingMembers.stream()
.stream() .filter(m -> UuidUtil.fromByteString(m.aciBytes).equals(editor))
.filter(m -> UuidUtil.fromByteString(m.getAciBytes()).equals(editor)) .map(m -> m.profileKey)).findFirst();
.map(DecryptedRequestingMember::getProfileKey)).findFirst();
if (editorProfileKeyBytes.isEmpty()) { if (editorProfileKeyBytes.isEmpty()) {
return null; return null;
@ -630,8 +626,8 @@ class GroupV2Helper {
.forGroup(GroupSecretParams.deriveFromMasterKey(groupMasterKey)); .forGroup(GroupSecretParams.deriveFromMasterKey(groupMasterKey));
try { try {
return groupOperations.decryptChange(GroupChange.parseFrom(signedGroupChange), true).orElse(null); return groupOperations.decryptChange(GroupChange.ADAPTER.decode(signedGroupChange), true).orElse(null);
} catch (VerificationFailedException | InvalidGroupStateException | InvalidProtocolBufferException e) { } catch (VerificationFailedException | InvalidGroupStateException | IOException e) {
return null; return null;
} }
} }

View File

@ -70,11 +70,8 @@ import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.push.ServiceId.PNI; import org.whispersystems.signalservice.api.push.ServiceId.PNI;
import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.Envelope;
import org.whispersystems.signalservice.internal.push.UnsupportedDataMessageException; import org.whispersystems.signalservice.internal.push.UnsupportedDataMessageException;
import org.whispersystems.signalservice.internal.serialize.SignalServiceAddressProtobufSerializer;
import org.whispersystems.signalservice.internal.serialize.SignalServiceMetadataProtobufSerializer;
import org.whispersystems.signalservice.internal.serialize.protos.SignalServiceContentProto;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -213,7 +210,7 @@ public final class IncomingMessageHandler {
} }
private SignalServiceContent validate( private SignalServiceContent validate(
SignalServiceProtos.Envelope envelope, SignalServiceCipherResult cipherResult, long serverDeliveredTimestamp Envelope envelope, SignalServiceCipherResult cipherResult, long serverDeliveredTimestamp
) throws ProtocolInvalidKeyException, ProtocolInvalidMessageException, UnsupportedDataMessageException, InvalidMessageStructureException { ) throws ProtocolInvalidKeyException, ProtocolInvalidMessageException, UnsupportedDataMessageException, InvalidMessageStructureException {
final var content = cipherResult.getContent(); final var content = cipherResult.getContent();
final var envelopeMetadata = cipherResult.getMetadata(); final var envelopeMetadata = cipherResult.getMetadata();
@ -236,21 +233,15 @@ public final class IncomingMessageHandler {
final var metadata = new SignalServiceMetadata(new SignalServiceAddress(envelopeMetadata.getSourceServiceId(), final var metadata = new SignalServiceMetadata(new SignalServiceAddress(envelopeMetadata.getSourceServiceId(),
Optional.ofNullable(envelopeMetadata.getSourceE164())), Optional.ofNullable(envelopeMetadata.getSourceE164())),
envelopeMetadata.getSourceDeviceId(), envelopeMetadata.getSourceDeviceId(),
envelope.getTimestamp(), envelope.timestamp,
envelope.getServerTimestamp(), envelope.serverTimestamp,
serverDeliveredTimestamp, serverDeliveredTimestamp,
envelopeMetadata.getSealedSender(), envelopeMetadata.getSealedSender(),
envelope.getServerGuid(), envelope.serverGuid,
Optional.ofNullable(envelopeMetadata.getGroupId()), Optional.ofNullable(envelopeMetadata.getGroupId()),
envelopeMetadata.getDestinationServiceId().toString()); envelopeMetadata.getDestinationServiceId().toString());
final var contentProto = SignalServiceContentProto.newBuilder() return SignalServiceContent.createFrom(localAddress, metadata, content);
.setLocalAddress(SignalServiceAddressProtobufSerializer.toProtobuf(localAddress))
.setMetadata(SignalServiceMetadataProtobufSerializer.toProtobuf(metadata))
.setContent(content)
.build();
return SignalServiceContent.createFromProto(contentProto);
} }
private List<HandleAction> checkAndHandleMessage( private List<HandleAction> checkAndHandleMessage(
@ -635,23 +626,21 @@ public final class IncomingMessageHandler {
if (syncMessage.getPniChangeNumber().isPresent()) { if (syncMessage.getPniChangeNumber().isPresent()) {
final var pniChangeNumber = syncMessage.getPniChangeNumber().get(); final var pniChangeNumber = syncMessage.getPniChangeNumber().get();
logger.debug("Received PNI change number sync message, applying."); logger.debug("Received PNI change number sync message, applying.");
if (pniChangeNumber.hasIdentityKeyPair() if (pniChangeNumber.identityKeyPair != null
&& pniChangeNumber.hasRegistrationId() && pniChangeNumber.registrationId != null
&& pniChangeNumber.hasSignedPreKey() && pniChangeNumber.signedPreKey != null
&& !envelope.getUpdatedPni().isEmpty()) { && !envelope.getUpdatedPni().isEmpty()) {
logger.debug("New PNI: {}", envelope.getUpdatedPni()); logger.debug("New PNI: {}", envelope.getUpdatedPni());
try { try {
final var updatedPni = PNI.parseOrThrow(envelope.getUpdatedPni()); final var updatedPni = PNI.parseOrThrow(envelope.getUpdatedPni());
context.getAccountHelper() context.getAccountHelper()
.setPni(updatedPni, .setPni(updatedPni,
new IdentityKeyPair(pniChangeNumber.getIdentityKeyPair().toByteArray()), new IdentityKeyPair(pniChangeNumber.identityKeyPair.toByteArray()),
pniChangeNumber.hasNewE164() ? pniChangeNumber.getNewE164() : null, pniChangeNumber.newE164,
pniChangeNumber.getRegistrationId(), pniChangeNumber.registrationId,
new SignedPreKeyRecord(pniChangeNumber.getSignedPreKey().toByteArray()), new SignedPreKeyRecord(pniChangeNumber.signedPreKey.toByteArray()),
pniChangeNumber.hasLastResortKyberPreKey() pniChangeNumber.lastResortKyberPreKey != null ? new KyberPreKeyRecord(
? new KyberPreKeyRecord(pniChangeNumber.getLastResortKyberPreKey() pniChangeNumber.lastResortKyberPreKey.toByteArray()) : null);
.toByteArray())
: null);
} catch (Exception e) { } catch (Exception e) {
logger.warn("Failed to handle change number message", e); logger.warn("Failed to handle change number message", e);
} }

View File

@ -1,7 +1,5 @@
package org.asamk.signal.manager.helper; package org.asamk.signal.manager.helper;
import com.google.protobuf.ByteString;
import org.asamk.signal.manager.api.Contact; import org.asamk.signal.manager.api.Contact;
import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.GroupId;
import org.asamk.signal.manager.api.GroupNotFoundException; import org.asamk.signal.manager.api.GroupNotFoundException;
@ -54,6 +52,8 @@ import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import okio.ByteString;
public class SendHelper { public class SendHelper {
private final static Logger logger = LoggerFactory.getLogger(SendHelper.class); private final static Logger logger = LoggerFactory.getLogger(SendHelper.class);
@ -267,10 +267,10 @@ public class SendHelper {
final var senderKeyDistributionMessage = dependencies.getMessageSender() final var senderKeyDistributionMessage = dependencies.getMessageSender()
.getOrCreateNewGroupSession(group.getDistributionId()); .getOrCreateNewGroupSession(group.getDistributionId());
final var distributionBytes = ByteString.copyFrom(senderKeyDistributionMessage.serialize()); final var distributionBytes = ByteString.of(senderKeyDistributionMessage.serialize());
final var contentToSend = messageSendLogEntry.content() final var contentToSend = messageSendLogEntry.content()
.toBuilder() .newBuilder()
.setSenderKeyDistributionMessage(distributionBytes) .senderKeyDistributionMessage(distributionBytes)
.build(); .build();
final var result = handleSendMessage(recipientId, final var result = handleSendMessage(recipientId,

View File

@ -31,7 +31,7 @@ import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSy
import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOperationMessage; import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOperationMessage;
import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage; import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage;
import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.SyncMessage;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -58,20 +58,20 @@ public class SyncHelper {
} }
public void requestAllSyncData() { public void requestAllSyncData() {
requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.GROUPS); requestSyncData(SyncMessage.Request.Type.GROUPS);
requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.CONTACTS); requestSyncData(SyncMessage.Request.Type.CONTACTS);
requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.BLOCKED); requestSyncData(SyncMessage.Request.Type.BLOCKED);
requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.CONFIGURATION); requestSyncData(SyncMessage.Request.Type.CONFIGURATION);
requestSyncKeys(); requestSyncKeys();
requestSyncPniIdentity(); requestSyncPniIdentity();
} }
public void requestSyncKeys() { public void requestSyncKeys() {
requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.KEYS); requestSyncData(SyncMessage.Request.Type.KEYS);
} }
public void requestSyncPniIdentity() { public void requestSyncPniIdentity() {
requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.PNI_IDENTITY); requestSyncData(SyncMessage.Request.Type.PNI_IDENTITY);
} }
public void sendSyncFetchProfileMessage() { public void sendSyncFetchProfileMessage() {
@ -346,8 +346,8 @@ public class SyncHelper {
} }
} }
private void requestSyncData(final SignalServiceProtos.SyncMessage.Request.Type type) { private void requestSyncData(final SyncMessage.Request.Type type) {
var r = SignalServiceProtos.SyncMessage.Request.newBuilder().setType(type).build(); var r = new SyncMessage.Request.Builder().type(type).build();
var message = SignalServiceSyncMessage.forRequest(new RequestMessage(r)); var message = SignalServiceSyncMessage.forRequest(new RequestMessage(r));
context.getSendHelper().sendSyncMessage(message); context.getSendHelper().sendSyncMessage(message);
} }

View File

@ -21,7 +21,7 @@ public final class GroupInfoV2 extends GroupInfo {
private final GroupIdV2 groupId; private final GroupIdV2 groupId;
private final GroupMasterKey masterKey; private final GroupMasterKey masterKey;
private DistributionId distributionId; private final DistributionId distributionId;
private boolean blocked; private boolean blocked;
private DecryptedGroup group; private DecryptedGroup group;
private boolean permissionDenied; private boolean permissionDenied;
@ -84,7 +84,7 @@ public final class GroupInfoV2 extends GroupInfo {
if (this.group == null) { if (this.group == null) {
return null; return null;
} }
return this.group.getTitle(); return this.group.title;
} }
@Override @Override
@ -92,15 +92,15 @@ public final class GroupInfoV2 extends GroupInfo {
if (this.group == null) { if (this.group == null) {
return null; return null;
} }
return this.group.getDescription(); return this.group.description;
} }
@Override @Override
public GroupInviteLinkUrl getGroupInviteLink() { public GroupInviteLinkUrl getGroupInviteLink() {
if (this.group == null || this.group.getInviteLinkPassword().isEmpty() || ( if (this.group == null || this.group.inviteLinkPassword.toByteArray().length == 0 || (
this.group.getAccessControl().getAddFromInviteLink() != AccessControl.AccessRequired.ANY this.group.accessControl != null
&& this.group.getAccessControl().getAddFromInviteLink() && this.group.accessControl.addFromInviteLink != AccessControl.AccessRequired.ANY
!= AccessControl.AccessRequired.ADMINISTRATOR && this.group.accessControl.addFromInviteLink != AccessControl.AccessRequired.ADMINISTRATOR
)) { )) {
return null; return null;
} }
@ -113,9 +113,8 @@ public final class GroupInfoV2 extends GroupInfo {
if (this.group == null) { if (this.group == null) {
return Set.of(); return Set.of();
} }
return group.getMembersList() return group.members.stream()
.stream() .map(m -> ServiceId.parseOrThrow(m.aciBytes))
.map(m -> ServiceId.parseOrThrow(m.getAciBytes()))
.map(recipientResolver::resolveRecipient) .map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
@ -125,9 +124,8 @@ public final class GroupInfoV2 extends GroupInfo {
if (this.group == null) { if (this.group == null) {
return Set.of(); return Set.of();
} }
return group.getBannedMembersList() return group.bannedMembers.stream()
.stream() .map(m -> ServiceId.parseOrThrow(m.serviceIdBytes))
.map(m -> ServiceId.parseOrThrow(m.getServiceIdBytes()))
.map(recipientResolver::resolveRecipient) .map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
@ -137,9 +135,8 @@ public final class GroupInfoV2 extends GroupInfo {
if (this.group == null) { if (this.group == null) {
return Set.of(); return Set.of();
} }
return group.getPendingMembersList() return group.pendingMembers.stream()
.stream() .map(m -> ServiceId.parseOrThrow(m.serviceIdBytes))
.map(m -> ServiceId.parseOrThrow(m.getServiceIdBytes()))
.map(recipientResolver::resolveRecipient) .map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
@ -149,9 +146,8 @@ public final class GroupInfoV2 extends GroupInfo {
if (this.group == null) { if (this.group == null) {
return Set.of(); return Set.of();
} }
return group.getRequestingMembersList() return group.requestingMembers.stream()
.stream() .map(m -> ServiceId.parseOrThrow(m.aciBytes))
.map(m -> ServiceId.parseOrThrow(m.getAciBytes()))
.map(recipientResolver::resolveRecipient) .map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
@ -161,11 +157,10 @@ public final class GroupInfoV2 extends GroupInfo {
if (this.group == null) { if (this.group == null) {
return Set.of(); return Set.of();
} }
return group.getMembersList() return group.members.stream()
.stream() .filter(m -> m.role == Member.Role.ADMINISTRATOR)
.filter(m -> m.getRole() == Member.Role.ADMINISTRATOR) .map(m -> new RecipientAddress(ServiceId.ACI.parseOrNull(m.aciBytes),
.map(m -> new RecipientAddress(ServiceId.ACI.parseOrNull(m.getAciBytes()), ServiceId.PNI.parseOrNull(m.pniBytes),
ServiceId.PNI.parseOrNull(m.getPniBytes()),
null)) null))
.map(recipientResolver::resolveRecipient) .map(recipientResolver::resolveRecipient)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
@ -183,26 +178,26 @@ public final class GroupInfoV2 extends GroupInfo {
@Override @Override
public int getMessageExpirationTimer() { public int getMessageExpirationTimer() {
return this.group != null && this.group.hasDisappearingMessagesTimer() return this.group != null && this.group.disappearingMessagesTimer != null
? this.group.getDisappearingMessagesTimer().getDuration() ? this.group.disappearingMessagesTimer.duration
: 0; : 0;
} }
@Override @Override
public boolean isAnnouncementGroup() { public boolean isAnnouncementGroup() {
return this.group != null && this.group.getIsAnnouncementGroup() == EnabledState.ENABLED; return this.group != null && this.group.isAnnouncementGroup == EnabledState.ENABLED;
} }
@Override @Override
public GroupPermission getPermissionAddMember() { public GroupPermission getPermissionAddMember() {
final var accessControl = getAccessControl(); final var accessControl = getAccessControl();
return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.getMembers()); return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.members);
} }
@Override @Override
public GroupPermission getPermissionEditDetails() { public GroupPermission getPermissionEditDetails() {
final var accessControl = getAccessControl(); final var accessControl = getAccessControl();
return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.getAttributes()); return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.attributes);
} }
@Override @Override
@ -219,11 +214,11 @@ public final class GroupInfoV2 extends GroupInfo {
} }
private AccessControl getAccessControl() { private AccessControl getAccessControl() {
if (this.group == null || !this.group.hasAccessControl()) { if (this.group == null || this.group.accessControl == null) {
return null; return null;
} }
return this.group.getAccessControl(); return this.group.accessControl;
} }
private static GroupPermission toGroupPermission(final AccessControl.AccessRequired permission) { private static GroupPermission toGroupPermission(final AccessControl.AccessRequired permission) {

View File

@ -1,7 +1,5 @@
package org.asamk.signal.manager.storage.groups; package org.asamk.signal.manager.storage.groups;
import com.google.protobuf.InvalidProtocolBufferException;
import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.GroupId;
import org.asamk.signal.manager.api.GroupIdV1; import org.asamk.signal.manager.api.GroupIdV1;
import org.asamk.signal.manager.api.GroupIdV2; import org.asamk.signal.manager.api.GroupIdV2;
@ -19,6 +17,7 @@ import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.push.DistributionId; import org.whispersystems.signalservice.api.push.DistributionId;
import org.whispersystems.signalservice.api.util.UuidUtil; import org.whispersystems.signalservice.api.util.UuidUtil;
import java.io.IOException;
import java.sql.Connection; import java.sql.Connection;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -295,7 +294,7 @@ public class GroupStore {
if (groupV2.getGroup() == null) { if (groupV2.getGroup() == null) {
statement.setNull(4, Types.NUMERIC); statement.setNull(4, Types.NUMERIC);
} else { } else {
statement.setBytes(4, groupV2.getGroup().toByteArray()); statement.setBytes(4, groupV2.getGroup().encode());
} }
statement.setBytes(5, UuidUtil.toByteArray(groupV2.getDistributionId().asUuid())); statement.setBytes(5, UuidUtil.toByteArray(groupV2.getDistributionId().asUuid()));
statement.setBoolean(6, groupV2.isBlocked()); statement.setBoolean(6, groupV2.isBlocked());
@ -349,12 +348,12 @@ public class GroupStore {
final var permissionDenied = resultSet.getBoolean("permission_denied"); final var permissionDenied = resultSet.getBoolean("permission_denied");
return new GroupInfoV2(GroupId.v2(groupId), return new GroupInfoV2(GroupId.v2(groupId),
new GroupMasterKey(masterKey), new GroupMasterKey(masterKey),
groupData == null ? null : DecryptedGroup.parseFrom(groupData), groupData == null ? null : DecryptedGroup.ADAPTER.decode(groupData),
DistributionId.from(UuidUtil.parseOrThrow(distributionId)), DistributionId.from(UuidUtil.parseOrThrow(distributionId)),
blocked, blocked,
permissionDenied, permissionDenied,
recipientResolver); recipientResolver);
} catch (InvalidInputException | InvalidProtocolBufferException e) { } catch (InvalidInputException | IOException e) {
return null; return null;
} }
} }

View File

@ -113,7 +113,7 @@ public class LegacyGroupStore {
return null; return null;
} }
try (var stream = new FileInputStream(groupFile)) { try (var stream = new FileInputStream(groupFile)) {
return DecryptedGroup.parseFrom(stream); return DecryptedGroup.ADAPTER.decode(stream);
} catch (IOException ignored) { } catch (IOException ignored) {
return null; return null;
} }

View File

@ -2,10 +2,10 @@ package org.asamk.signal.manager.storage.sendLog;
import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.GroupId;
import org.whispersystems.signalservice.api.crypto.ContentHint; import org.whispersystems.signalservice.api.crypto.ContentHint;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.Content;
import java.util.Optional; import java.util.Optional;
public record MessageSendLogEntry( public record MessageSendLogEntry(
Optional<GroupId> groupId, SignalServiceProtos.Content content, ContentHint contentHint, boolean urgent Optional<GroupId> groupId, Content content, ContentHint contentHint, boolean urgent
) {} ) {}

View File

@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.crypto.ContentHint; import org.whispersystems.signalservice.api.crypto.ContentHint;
import org.whispersystems.signalservice.api.messages.SendMessageResult; import org.whispersystems.signalservice.api.messages.SendMessageResult;
import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.Content;
import java.io.IOException; import java.io.IOException;
import java.sql.Connection; import java.sql.Connection;
@ -267,7 +267,7 @@ public class MessageSendLogStore implements AutoCloseable {
private long insert( private long insert(
final List<RecipientDevices> recipientDevices, final List<RecipientDevices> recipientDevices,
final long sentTimestamp, final long sentTimestamp,
final SignalServiceProtos.Content content, final Content content,
final ContentHint contentHint, final ContentHint contentHint,
final boolean urgent final boolean urgent
) { ) {
@ -284,7 +284,7 @@ public class MessageSendLogStore implements AutoCloseable {
try (final var statement = connection.prepareStatement(sql)) { try (final var statement = connection.prepareStatement(sql)) {
statement.setLong(1, sentTimestamp); statement.setLong(1, sentTimestamp);
statement.setBytes(2, groupId); statement.setBytes(2, groupId);
statement.setBytes(3, content.toByteArray()); statement.setBytes(3, content.encode());
statement.setInt(4, contentHint.getType()); statement.setInt(4, contentHint.getType());
statement.setBoolean(5, urgent); statement.setBoolean(5, urgent);
final var generatedKey = Utils.executeQueryForOptional(statement, Utils::getIdMapper); final var generatedKey = Utils.executeQueryForOptional(statement, Utils::getIdMapper);
@ -308,17 +308,15 @@ public class MessageSendLogStore implements AutoCloseable {
} }
} }
private byte[] getGroupId(final SignalServiceProtos.Content content) { private byte[] getGroupId(final Content content) {
try { try {
return !content.hasDataMessage() return content.dataMessage == null
? null ? null
: content.getDataMessage().hasGroup() : content.dataMessage.group != null && content.dataMessage.group.id != null
? content.getDataMessage().getGroup().getId().toByteArray() ? content.dataMessage.group.id.toByteArray()
: content.getDataMessage().hasGroupV2() : content.dataMessage.groupV2 != null && content.dataMessage.groupV2.masterKey != null
? GroupUtils.getGroupIdV2(new GroupMasterKey(content.getDataMessage() ? GroupUtils.getGroupIdV2(new GroupMasterKey(content.dataMessage.groupV2.masterKey.toByteArray()))
.getGroupV2() .serialize()
.getMasterKey()
.toByteArray())).serialize()
: null; : null;
} catch (InvalidInputException e) { } catch (InvalidInputException e) {
logger.warn("Failed to parse groupId id from content"); logger.warn("Failed to parse groupId id from content");
@ -385,9 +383,9 @@ public class MessageSendLogStore implements AutoCloseable {
private MessageSendLogEntry getMessageSendLogEntryFromResultSet(ResultSet resultSet) throws SQLException { private MessageSendLogEntry getMessageSendLogEntryFromResultSet(ResultSet resultSet) throws SQLException {
final var groupId = Optional.ofNullable(resultSet.getBytes("group_id")).map(GroupId::unknownVersion); final var groupId = Optional.ofNullable(resultSet.getBytes("group_id")).map(GroupId::unknownVersion);
final SignalServiceProtos.Content content; final Content content;
try { try {
content = SignalServiceProtos.Content.parseFrom(resultSet.getBinaryStream("content")); content = Content.ADAPTER.decode(resultSet.getBinaryStream("content"));
} catch (IOException e) { } catch (IOException e) {
logger.warn("Failed to parse content from message send log", e); logger.warn("Failed to parse content from message send log", e);
return null; return null;

View File

@ -6,7 +6,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.util.UuidUtil; import org.whispersystems.signalservice.api.util.UuidUtil;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.Envelope;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
@ -34,7 +34,7 @@ public class MessageCacheUtils {
} }
if (version >= 9) { if (version >= 9) {
final var serverReceivedTimestamp = in.readLong(); final var serverReceivedTimestamp = in.readLong();
final var envelope = SignalServiceProtos.Envelope.parseFrom(in.readAllBytes()); final var envelope = Envelope.ADAPTER.decode(in.readAllBytes());
return new SignalServiceEnvelope(envelope, serverReceivedTimestamp); return new SignalServiceEnvelope(envelope, serverReceivedTimestamp);
} else { } else {
var type = in.readInt(); var type = in.readInt();
@ -114,7 +114,7 @@ public class MessageCacheUtils {
try (var out = new DataOutputStream(f)) { try (var out = new DataOutputStream(f)) {
out.writeInt(CURRENT_VERSION); // version out.writeInt(CURRENT_VERSION); // version
out.writeLong(envelope.getServerDeliveredTimestamp()); out.writeLong(envelope.getServerDeliveredTimestamp());
envelope.getProto().writeTo(out); envelope.getProto().encode(out);
} }
} }
} }

View File

@ -1,14 +1,14 @@
package org.asamk.signal.manager.util; package org.asamk.signal.manager.util;
import com.google.protobuf.ByteString;
import org.signal.libsignal.protocol.IdentityKey; import org.signal.libsignal.protocol.IdentityKey;
import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.IdentityKeyPair;
import org.signal.libsignal.protocol.ecc.ECPrivateKey; import org.signal.libsignal.protocol.ecc.ECPrivateKey;
import org.signal.libsignal.protocol.ecc.ECPublicKey; import org.signal.libsignal.protocol.ecc.ECPublicKey;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.PaymentAddress;
import okio.ByteString;
public class PaymentUtils { public class PaymentUtils {
@ -20,16 +20,13 @@ public class PaymentUtils {
/** /**
* Signs the supplied address bytes with the {@link IdentityKeyPair}'s private key and returns a proto that includes it, and it's signature. * Signs the supplied address bytes with the {@link IdentityKeyPair}'s private key and returns a proto that includes it, and it's signature.
*/ */
public static SignalServiceProtos.PaymentAddress signPaymentsAddress( public static PaymentAddress signPaymentsAddress(
byte[] publicAddressBytes, ECPrivateKey privateKey byte[] publicAddressBytes, ECPrivateKey privateKey
) { ) {
byte[] signature = privateKey.calculateSignature(publicAddressBytes); byte[] signature = privateKey.calculateSignature(publicAddressBytes);
return SignalServiceProtos.PaymentAddress.newBuilder() return new PaymentAddress.Builder().mobileCoinAddress(new PaymentAddress.MobileCoinAddress.Builder().address(
.setMobileCoinAddress(SignalServiceProtos.PaymentAddress.MobileCoinAddress.newBuilder() ByteString.of(publicAddressBytes)).signature(ByteString.of(signature)).build()).build();
.setAddress(ByteString.copyFrom(publicAddressBytes))
.setSignature(ByteString.copyFrom(signature)))
.build();
} }
/** /**
@ -38,15 +35,16 @@ public class PaymentUtils {
* Returns the validated bytes if so, otherwise returns null. * Returns the validated bytes if so, otherwise returns null.
*/ */
public static byte[] verifyPaymentsAddress( public static byte[] verifyPaymentsAddress(
SignalServiceProtos.PaymentAddress paymentAddress, ECPublicKey publicKey PaymentAddress paymentAddress, ECPublicKey publicKey
) { ) {
if (!paymentAddress.hasMobileCoinAddress()) { final var mobileCoinAddress = paymentAddress.mobileCoinAddress;
if (mobileCoinAddress == null || mobileCoinAddress.address == null || mobileCoinAddress.signature == null) {
logger.debug("Got payment address without mobile coin address, ignoring."); logger.debug("Got payment address without mobile coin address, ignoring.");
return null; return null;
} }
byte[] bytes = paymentAddress.getMobileCoinAddress().getAddress().toByteArray(); byte[] bytes = mobileCoinAddress.address.toByteArray();
byte[] signature = paymentAddress.getMobileCoinAddress().getSignature().toByteArray(); byte[] signature = mobileCoinAddress.signature.toByteArray();
if (signature.length != 64 || !publicKey.verifySignature(bytes, signature)) { if (signature.length != 64 || !publicKey.verifySignature(bytes, signature)) {
logger.debug("Got mobile coin address with invalid signature, ignoring."); logger.debug("Got mobile coin address with invalid signature, ignoring.");

View File

@ -1,7 +1,5 @@
package org.asamk.signal.manager.util; package org.asamk.signal.manager.util;
import com.google.protobuf.InvalidProtocolBufferException;
import org.asamk.signal.manager.api.Pair; import org.asamk.signal.manager.api.Pair;
import org.asamk.signal.manager.api.Profile; import org.asamk.signal.manager.api.Profile;
import org.signal.libsignal.protocol.IdentityKey; import org.signal.libsignal.protocol.IdentityKey;
@ -13,7 +11,7 @@ import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.crypto.InvalidCiphertextException; import org.whispersystems.signalservice.api.crypto.InvalidCiphertextException;
import org.whispersystems.signalservice.api.crypto.ProfileCipher; import org.whispersystems.signalservice.api.crypto.ProfileCipher;
import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; import org.whispersystems.signalservice.api.profiles.SignalServiceProfile;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import org.whispersystems.signalservice.internal.push.PaymentAddress;
import java.io.IOException; import java.io.IOException;
import java.util.Base64; import java.util.Base64;
@ -117,10 +115,10 @@ public class ProfileUtils {
return null; return null;
} }
SignalServiceProtos.PaymentAddress paymentAddress; PaymentAddress paymentAddress;
try { try {
paymentAddress = SignalServiceProtos.PaymentAddress.parseFrom(decrypted); paymentAddress = PaymentAddress.ADAPTER.decode(decrypted);
} catch (InvalidProtocolBufferException e) { } catch (IOException e) {
logger.debug("Failed to parse payment address", e); logger.debug("Failed to parse payment address", e);
return null; return null;
} }

View File

@ -16,8 +16,7 @@ dependencyResolutionManagement {
library("logback", "ch.qos.logback", "logback-classic").version("1.4.11") library("logback", "ch.qos.logback", "logback-classic").version("1.4.11")
library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_80") library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_81")
library("protobuf", "com.google.protobuf", "protobuf-javalite").version("3.24.0")
library("sqlite", "org.xerial", "sqlite-jdbc").version("3.43.0.0") library("sqlite", "org.xerial", "sqlite-jdbc").version("3.43.0.0")
library("hikari", "com.zaxxer", "HikariCP").version("5.0.1") library("hikari", "com.zaxxer", "HikariCP").version("5.0.1")
library("junit", "org.junit.jupiter", "junit-jupiter").version("5.10.0") library("junit", "org.junit.jupiter", "junit-jupiter").version("5.10.0")

View File

@ -47,10 +47,10 @@ record JsonCallMessage(
} }
} }
public record Hangup(long id, String type, int deviceId, boolean isLegacy) { public record Hangup(long id, String type, int deviceId) {
public static Hangup from(final MessageEnvelope.Call.Hangup hangup) { public static Hangup from(final MessageEnvelope.Call.Hangup hangup) {
return new Hangup(hangup.id(), hangup.type().name(), hangup.deviceId(), hangup.isLegacy()); return new Hangup(hangup.id(), hangup.type().name(), hangup.deviceId());
} }
} }