]> nmode's Git Repositories - signal-cli/commitdiff
Update libsignal-service
authorAsamK <asamk@gmx.de>
Sat, 23 Sep 2023 14:21:19 +0000 (16:21 +0200)
committerAsamK <asamk@gmx.de>
Sat, 23 Sep 2023 14:21:19 +0000 (16:21 +0200)
22 files changed:
graalvm-config-dir/reflect-config.json
lib/build.gradle.kts
lib/src/main/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java
lib/src/main/java/org/asamk/signal/manager/api/GroupInviteLinkUrl.java
lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java
lib/src/main/java/org/asamk/signal/manager/api/TextStyle.java
lib/src/main/java/org/asamk/signal/manager/groups/GroupUtils.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java
lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java
lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/LegacyGroupStore.java
lib/src/main/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogEntry.java
lib/src/main/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogStore.java
lib/src/main/java/org/asamk/signal/manager/util/MessageCacheUtils.java
lib/src/main/java/org/asamk/signal/manager/util/PaymentUtils.java
lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java
settings.gradle.kts
src/main/java/org/asamk/signal/json/JsonCallMessage.java

index a1465c188e175c4d7bd063b906df71449a5de810..442ad3c276c6607c3d74cf371e50d8379eb9e390 100644 (file)
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
 {
-  "name":"com.google.protobuf.AbstractProtobufList",
+  "name":"com.squareup.wire.internal.ImmutableList",
   "allDeclaredFields":true,
-  "allDeclaredMethods":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"
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true
 },
 {
   "name":"com.sun.crypto.provider.AESCipher$General",
 {
   "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.jvm.internal.DefaultConstructorMarker"
 },
+{
+  "name":"kotlin.jvm.internal.markers.KMappedMarker",
+  "queryAllDeclaredMethods":true
+},
 {
   "name":"kotlin.reflect.jvm.internal.ReflectionFactoryImpl",
   "methods":[{"name":"<init>","parameterTypes":[] }]
   "name":"org.asamk.signal.json.JsonContactAddress",
   "allDeclaredFields":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",
   "allDeclaredFields":true,
   "allDeclaredMethods":true,
-  "allDeclaredConstructors":true
+  "allDeclaredConstructors":true,
+  "methods":[{"name":"attachment","parameterTypes":[] }, {"name":"isProfile","parameterTypes":[] }]
 },
 {
   "name":"org.asamk.signal.json.JsonContactEmail",
   "allDeclaredFields":true,
   "allDeclaredMethods":true,
-  "allDeclaredConstructors":true
+  "allDeclaredConstructors":true,
+  "methods":[{"name":"label","parameterTypes":[] }, {"name":"type","parameterTypes":[] }, {"name":"value","parameterTypes":[] }]
 },
 {
   "name":"org.asamk.signal.json.JsonContactName",
   "allDeclaredFields":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",
   "allDeclaredFields":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.JsonSharedContact",
   "allDeclaredFields":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.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.internal.push.SenderCertificate$ByteArrayDesieralizer",
   "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",
   "allDeclaredFields":true,
index 8c766a8198d42e3098d3294e3a8748c9cb29cfd9..dd765cbacc77ecf6f7cb515dc59de1e62117cfa9 100644 (file)
@@ -20,7 +20,6 @@ dependencies {
         implementation(files(libsignalClientPath))
     }
     implementation(libs.jackson.databind)
-    implementation(libs.protobuf)
     implementation(libs.bouncycastle)
     implementation(libs.slf4j.api)
     implementation(libs.sqlite)
index add09e72efd44515cd78f2080c59de868c754a11..1975fd1794cc1003376cc2c778b46cc58f9b0e88 100644 (file)
@@ -8,7 +8,7 @@ import org.signal.libsignal.protocol.message.CiphertextMessage;
 import org.signal.libsignal.protocol.message.DecryptionErrorMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
 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;
 
@@ -62,10 +62,14 @@ public class SendRetryMessageRequestAction implements HandleAction {
     }
 
     private static int envelopeTypeToCiphertextMessageType(int envelopeType) {
-        return switch (envelopeType) {
-            case SignalServiceProtos.Envelope.Type.PREKEY_BUNDLE_VALUE -> CiphertextMessage.PREKEY_TYPE;
-            case SignalServiceProtos.Envelope.Type.UNIDENTIFIED_SENDER_VALUE -> CiphertextMessage.SENDERKEY_TYPE;
-            case SignalServiceProtos.Envelope.Type.PLAINTEXT_CONTENT_VALUE -> CiphertextMessage.PLAINTEXT_CONTENT_TYPE;
+        final var type = Envelope.Type.fromValue(envelopeType);
+        if (type == null) {
+            return CiphertextMessage.WHISPER_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;
         };
     }
index b21aeb97c2b150601dda057c8707b4cebab675c5..d44fc98221cbf6047d993e0f17f1d8590b4fc02e 100644 (file)
@@ -1,7 +1,5 @@
 package org.asamk.signal.manager.api;
 
-import com.google.protobuf.ByteString;
-
 import org.asamk.signal.manager.groups.GroupLinkPassword;
 import org.signal.libsignal.zkgroup.InvalidInputException;
 import org.signal.libsignal.zkgroup.groups.GroupMasterKey;
@@ -13,6 +11,8 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 
+import okio.ByteString;
+
 public final class GroupInviteLinkUrl {
 
     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) {
         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 groupInviteLink = GroupInviteLink.parseFrom(bytes);
-
-            switch (groupInviteLink.getContentsCase()) {
-                case V1CONTENTS -> {
-                    var groupInviteLinkContentsV1 = groupInviteLink.getV1Contents();
-                    var groupMasterKey = new GroupMasterKey(groupInviteLinkContentsV1.getGroupMasterKey()
-                            .toByteArray());
-                    var password = GroupLinkPassword.fromBytes(groupInviteLinkContentsV1.getInviteLinkPassword()
-                            .toByteArray());
-
-                    return new GroupInviteLinkUrl(groupMasterKey, password);
-                }
-                default -> throw new UnknownGroupLinkVersionException("Url contains no known group link content");
+            GroupInviteLink groupInviteLink = GroupInviteLink.ADAPTER.decode(bytes);
+
+            if (groupInviteLink.v1Contents != null) {
+                var groupInviteLinkContentsV1 = groupInviteLink.v1Contents;
+                var groupMasterKey = new GroupMasterKey(groupInviteLinkContentsV1.groupMasterKey.toByteArray());
+                var password = GroupLinkPassword.fromBytes(groupInviteLinkContentsV1.inviteLinkPassword.toByteArray());
+
+                return new GroupInviteLinkUrl(groupMasterKey, password);
+            } else {
+                throw new UnknownGroupLinkVersionException("Url contains no known group link content");
             }
         } catch (InvalidInputException | IOException e) {
             throw new InvalidGroupLinkException(e);
@@ -93,13 +90,12 @@ public final class GroupInviteLinkUrl {
     }
 
     private static String createUrl(GroupMasterKey groupMasterKey, GroupLinkPassword password) {
-        var groupInviteLink = GroupInviteLink.newBuilder()
-                .setV1Contents(GroupInviteLink.GroupInviteLinkContentsV1.newBuilder()
-                        .setGroupMasterKey(ByteString.copyFrom(groupMasterKey.serialize()))
-                        .setInviteLinkPassword(ByteString.copyFrom(password.serialize())))
-                .build();
+        var groupInviteLink = new GroupInviteLink.Builder().v1Contents(new GroupInviteLink.GroupInviteLinkContentsV1.Builder().groupMasterKey(
+                        ByteString.of(groupMasterKey.serialize()))
+                .inviteLinkPassword(ByteString.of(password.serialize()))
+                .build()).build();
 
-        var encoding = Base64UrlSafe.encodeBytesWithoutPadding(groupInviteLink.toByteArray());
+        var encoding = Base64UrlSafe.encodeBytesWithoutPadding(groupInviteLink.encode());
 
         return GROUP_URL_PREFIX + encoding;
     }
index 1ba25af62cef58eec2a6ec7b4bd3dfb077b73d0e..00abd93e74ffe37caead69418ef012e534ed2ba4 100644 (file)
@@ -39,8 +39,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import static org.whispersystems.signalservice.internal.push.SignalServiceProtos.BodyRange;
-
 public record MessageEnvelope(
         Optional<RecipientAddress> sourceAddress,
         int sourceDevice,
@@ -160,7 +158,7 @@ public record MessageEnvelope(
                             .map(a -> a.stream().map(preview -> Preview.from(preview, fileProvider)).toList())
                             .orElse(List.of()),
                     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()));
         }
 
@@ -250,7 +248,7 @@ public record MessageEnvelope(
                                 ? List.of()
                                 : quote.getBodyRanges()
                                         .stream()
-                                        .filter(BodyRange::hasStyle)
+                                        .filter(r -> r.style != null)
                                         .map(TextStyle::from)
                                         .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) {
                 return new Hangup(hangupMessage.getId(),
                         Type.from(hangupMessage.getType()),
-                        hangupMessage.getDeviceId(),
-                        hangupMessage.isLegacy());
+                        hangupMessage.getDeviceId());
             }
 
             public enum Type {
index 483163088738b1686d3056f65c546da1deebb00b..bec504f0f326629524527991eb14426215d03857 100644 (file)
@@ -1,8 +1,8 @@
 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 {
         NONE,
@@ -12,7 +12,10 @@ public record TextStyle(Style style, int start, int length) {
         STRIKETHROUGH,
         MONOSPACE;
 
-        static Style fromInternal(SignalServiceProtos.BodyRange.Style style) {
+        static Style fromInternal(BodyRange.Style style) {
+            if (style == null) {
+                return NONE;
+            }
             return switch (style) {
                 case NONE -> NONE;
                 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) {
-                case NONE -> SignalServiceProtos.BodyRange.Style.NONE;
-                case BOLD -> SignalServiceProtos.BodyRange.Style.BOLD;
-                case ITALIC -> SignalServiceProtos.BodyRange.Style.ITALIC;
-                case SPOILER -> SignalServiceProtos.BodyRange.Style.SPOILER;
-                case STRIKETHROUGH -> SignalServiceProtos.BodyRange.Style.STRIKETHROUGH;
-                case MONOSPACE -> SignalServiceProtos.BodyRange.Style.MONOSPACE;
+                case NONE -> BodyRange.Style.NONE;
+                case BOLD -> BodyRange.Style.BOLD;
+                case ITALIC -> BodyRange.Style.ITALIC;
+                case SPOILER -> BodyRange.Style.SPOILER;
+                case STRIKETHROUGH -> BodyRange.Style.STRIKETHROUGH;
+                case MONOSPACE -> BodyRange.Style.MONOSPACE;
             };
         }
     }
 
-    static TextStyle from(SignalServiceProtos.BodyRange bodyRange) {
-        return new TextStyle(Style.fromInternal(bodyRange.getStyle()), bodyRange.getStart(), bodyRange.getLength());
+    static TextStyle from(BodyRange bodyRange) {
+        return new TextStyle(Style.fromInternal(bodyRange.style), bodyRange.start, bodyRange.length);
     }
 
-    public SignalServiceProtos.BodyRange toBodyRange() {
-        return SignalServiceProtos.BodyRange.newBuilder()
-                .setStart(this.start())
-                .setLength(this.length())
-                .setStyle(this.style().toBodyRangeStyle())
+    public BodyRange toBodyRange() {
+        return new BodyRange.Builder().start(this.start())
+                .length(this.length())
+                .style(this.style().toBodyRangeStyle())
                 .build();
     }
 }
index b73be0ab0ada04eaa3cc5d5a6b398d7cf957e3e6..76352d1ad984d826c990b44c16ffecfe1fef2be2 100644 (file)
@@ -28,7 +28,7 @@ public class GroupUtils {
         } else {
             final var groupInfoV2 = (GroupInfoV2) groupInfo;
             var group = SignalServiceGroupV2.newBuilder(groupInfoV2.getMasterKey())
-                    .withRevision(groupInfoV2.getGroup() == null ? 0 : groupInfoV2.getGroup().getRevision())
+                    .withRevision(groupInfoV2.getGroup() == null ? 0 : groupInfoV2.getGroup().revision)
                     .build();
             messageBuilder.asGroupMessage(group);
         }
index d30c79e420ed98e53b588ae91115cb445e8a4f90..ef104fa2fc577defe84558d69cc1746f981453ca 100644 (file)
@@ -125,11 +125,11 @@ public class GroupHelper {
             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;
             if (signedGroupChange != null
                     && groupInfoV2.getGroup() != null
-                    && groupInfoV2.getGroup().getRevision() + 1 == revision) {
+                    && groupInfoV2.getGroup().revision + 1 == revision) {
                 final var decryptedGroupChange = context.getGroupV2Helper()
                         .getDecryptedGroupChange(signedGroupChange, groupMasterKey);
 
@@ -151,8 +151,8 @@ public class GroupHelper {
             }
             if (group != null) {
                 storeProfileKeysFromMembers(group);
-                final var avatar = group.getAvatar();
-                if (avatar != null && !avatar.isEmpty()) {
+                final var avatar = group.avatar;
+                if (!avatar.isEmpty()) {
                     downloadGroupAvatar(groupId, groupSecretParams, avatar);
                 }
             }
@@ -300,14 +300,14 @@ public class GroupHelper {
         } catch (GroupLinkNotActiveException 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.");
         }
         final var groupChange = context.getGroupV2Helper()
                 .joinGroup(inviteLinkUrl.getGroupMasterKey(), inviteLinkUrl.getPassword(), groupJoinInfo);
         final var group = getOrMigrateGroup(inviteLinkUrl.getGroupMasterKey(),
-                groupJoinInfo.getRevision() + 1,
-                groupChange.toByteArray());
+                groupJoinInfo.revision + 1,
+                groupChange.encode());
 
         if (group.getGroup() == null) {
             // Only requested member, can't send update to group members
@@ -400,8 +400,8 @@ public class GroupHelper {
                     } catch (NotAGroupMemberException ignored) {
                     }
                     storeProfileKeysFromMembers(decryptedGroup);
-                    final var avatar = decryptedGroup.getAvatar();
-                    if (avatar != null && !avatar.isEmpty()) {
+                    final var avatar = decryptedGroup.avatar;
+                    if (!avatar.isEmpty()) {
                         downloadGroupAvatar(groupInfoV2.getGroupId(), groupSecretParams, avatar);
                     }
                 }
@@ -446,8 +446,8 @@ public class GroupHelper {
     }
 
     private void storeProfileKeysFromMembers(final DecryptedGroup group) {
-        for (var member : group.getMembersList()) {
-            final var serviceId = ServiceId.parseOrThrow(member.getAciBytes());
+        for (var member : group.members) {
+            final var serviceId = ServiceId.parseOrThrow(member.aciBytes);
             final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId);
             final var profileStore = account.getProfileStore();
             if (profileStore.getProfileKey(recipientId) != null) {
@@ -455,7 +455,7 @@ public class GroupHelper {
                 continue;
             }
             try {
-                profileStore.storeProfileKey(recipientId, new ProfileKey(member.getProfileKey().toByteArray()));
+                profileStore.storeProfileKey(recipientId, new ProfileKey(member.profileKey.toByteArray()));
             } catch (InvalidInputException ignored) {
             }
         }
@@ -479,7 +479,7 @@ public class GroupHelper {
             final DecryptedGroup newDecryptedGroup
     ) throws NotAGroupMemberException {
         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);
         final var newProfileKeys = new HashMap<RecipientId, ProfileKey>();
         while (true) {
@@ -753,7 +753,7 @@ public class GroupHelper {
         groupInfoV2.setGroup(groupGroupChangePair.first());
         account.getGroupStore().updateGroup(groupInfoV2);
 
-        var messageBuilder = getGroupUpdateMessageBuilder(groupInfoV2, groupGroupChangePair.second().toByteArray());
+        var messageBuilder = getGroupUpdateMessageBuilder(groupInfoV2, groupGroupChangePair.second().encode());
         return sendGroupMessage(messageBuilder,
                 groupInfoV2.getMembersIncludingPendingWithout(account.getSelfRecipientId()),
                 groupInfoV2.getDistributionId());
@@ -782,7 +782,7 @@ public class GroupHelper {
 
     private SignalServiceDataMessage.Builder getGroupUpdateMessageBuilder(GroupInfoV2 g, byte[] signedGroupChange) {
         var group = SignalServiceGroupV2.newBuilder(g.getMasterKey())
-                .withRevision(g.getGroup().getRevision())
+                .withRevision(g.getGroup().revision)
                 .withSignedGroupChange(signedGroupChange);
         return SignalServiceDataMessage.newBuilder()
                 .asGroupMessage(group.build())
@@ -798,7 +798,7 @@ public class GroupHelper {
         members.addAll(group.getMembersIncludingPendingWithout(selfRecipientId));
         account.getGroupStore().updateGroup(group);
 
-        final var messageBuilder = getGroupUpdateMessageBuilder(group, groupChange.toByteArray());
+        final var messageBuilder = getGroupUpdateMessageBuilder(group, groupChange.encode());
         return sendGroupMessage(messageBuilder, members, group.getDistributionId());
     }
 
index 30de7b19a62d2240429b7e1b71e035c29572c5ab..96ecf2c076e1277a686ba2db9fbd6cfc4447c1af 100644 (file)
@@ -1,8 +1,5 @@
 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.GroupPermission;
 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.DecryptedMember;
 import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
-import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 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.Stream;
 
+import okio.ByteString;
+
 class GroupV2Helper {
 
     private final static Logger logger = LoggerFactory.getLogger(GroupV2Helper.class);
@@ -126,12 +124,12 @@ class GroupV2Helper {
     int findRevisionWeWereAdded(DecryptedGroup partialDecryptedGroup) {
         ByteString aciBytes = getSelfAci().toByteString();
         ByteString pniBytes = getSelfPni().toByteString();
-        for (DecryptedMember decryptedMember : partialDecryptedGroup.getMembersList()) {
-            if (decryptedMember.getAciBytes().equals(aciBytes) || decryptedMember.getPniBytes().equals(pniBytes)) {
-                return decryptedMember.getJoinedAtRevision();
+        for (DecryptedMember decryptedMember : partialDecryptedGroup.members) {
+            if (decryptedMember.aciBytes.equals(aciBytes) || decryptedMember.pniBytes.equals(pniBytes)) {
+                return decryptedMember.joinedAtRevision;
             }
         }
-        return partialDecryptedGroup.getRevision();
+        return partialDecryptedGroup.revision;
     }
 
     Pair<GroupInfoV2, DecryptedGroup> createGroup(
@@ -203,19 +201,19 @@ class GroupV2Helper {
         final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey());
         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) {
-            change.setModifyDescription(groupOperations.createModifyGroupDescriptionAction(description));
+            change.modifyDescription(groupOperations.createModifyGroupDescriptionAction(description).build());
         }
 
         if (avatarFile != null) {
             var avatarCdnKey = dependencies.getGroupsV2Api()
                     .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);
     }
@@ -241,7 +239,7 @@ class GroupV2Helper {
         final var aci = getSelfAci();
         final var change = groupOperations.createModifyGroupMembershipChange(candidates, bannedUuids, aci);
 
-        change.setSourceServiceId(getSelfAci().toByteString());
+        change.sourceServiceId(getSelfAci().toByteString());
 
         return commitChange(groupInfoV2, change);
     }
@@ -249,7 +247,7 @@ class GroupV2Helper {
     Pair<DecryptedGroup, GroupChange> leaveGroup(
             GroupInfoV2 groupInfoV2, Set<RecipientId> membersToMakeAdmin
     ) throws IOException {
-        var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList();
+        var pendingMembersList = groupInfoV2.getGroup().pendingMembers;
         final var selfAci = getSelfAci();
         var selfPendingMember = DecryptedGroupUtil.findPendingByServiceId(pendingMembersList, selfAci);
 
@@ -302,7 +300,7 @@ class GroupV2Helper {
     Pair<DecryptedGroup, GroupChange> revokeInvitedMembers(
             GroupInfoV2 groupInfoV2, Set<RecipientId> members
     ) throws IOException {
-        var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList();
+        var pendingMembersList = groupInfoV2.getGroup().pendingMembers;
         final var memberUuids = members.stream()
                 .map(context.getRecipientHelper()::resolveSignalServiceAddress)
                 .map(SignalServiceAddress::getServiceId)
@@ -324,9 +322,9 @@ class GroupV2Helper {
 
         final var change = groupOperations.createBanServiceIdsChange(serviceIds,
                 false,
-                groupInfoV2.getGroup().getBannedMembersList());
+                groupInfoV2.getGroup().bannedMembers);
 
-        change.setSourceServiceId(getSelfAci().toByteString());
+        change.sourceServiceId(getSelfAci().toByteString());
 
         return commitChange(groupInfoV2, change);
     }
@@ -342,7 +340,7 @@ class GroupV2Helper {
 
         final var change = groupOperations.createUnbanServiceIdsChange(serviceIds);
 
-        change.setSourceServiceId(getSelfAci().toByteString());
+        change.sourceServiceId(getSelfAci().toByteString());
 
         return commitChange(groupInfoV2, change);
     }
@@ -360,9 +358,8 @@ class GroupV2Helper {
         final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
 
         final var accessRequired = toAccessControl(state);
-        final var requiresNewPassword = state != GroupLinkState.DISABLED && groupInfoV2.getGroup()
-                .getInviteLinkPassword()
-                .isEmpty();
+        final var requiresNewPassword = state != GroupLinkState.DISABLED
+                && groupInfoV2.getGroup().inviteLinkPassword.toByteArray().length == 0;
 
         final var change = requiresNewPassword ? groupOperations.createModifyGroupLinkPasswordAndRightsChange(
                 GroupLinkPassword.createNew().serialize(),
@@ -393,14 +390,14 @@ class GroupV2Helper {
     Pair<DecryptedGroup, GroupChange> updateSelfProfileKey(GroupInfoV2 groupInfoV2) throws IOException {
         Optional<DecryptedMember> selfInGroup = groupInfoV2.getGroup() == null
                 ? Optional.empty()
-                : DecryptedGroupUtil.findMemberByAci(groupInfoV2.getGroup().getMembersList(), getSelfAci());
+                : DecryptedGroupUtil.findMemberByAci(groupInfoV2.getGroup().members, getSelfAci());
         if (selfInGroup.isEmpty()) {
             logger.trace("Not updating group, self not in group " + groupInfoV2.getGroupId().toBase64());
             return null;
         }
 
         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 "
                     + groupInfoV2.getGroupId().toBase64());
             return null;
@@ -416,7 +413,7 @@ class GroupV2Helper {
 
         final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
         final var change = groupOperations.createUpdateProfileKeyCredentialChange(profileKeyCredential);
-        change.setSourceServiceId(getSelfAci().toByteString());
+        change.sourceServiceId(getSelfAci().toByteString());
         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");
         }
 
-        var requestToJoin = decryptedGroupJoinInfo.getAddFromInviteLink() == AccessControl.AccessRequired.ADMINISTRATOR;
+        var requestToJoin = decryptedGroupJoinInfo.addFromInviteLink == AccessControl.AccessRequired.ADMINISTRATOR;
         var change = requestToJoin
                 ? groupOperations.createGroupJoinRequest(profileKeyCredential)
                 : groupOperations.createGroupJoinDirect(profileKeyCredential);
 
-        change.setSourceServiceId(context.getRecipientHelper()
+        change.sourceServiceId(context.getRecipientHelper()
                 .resolveSignalServiceAddress(selfRecipientId)
                 .getServiceId()
                 .toByteString());
 
-        return commitChange(groupSecretParams, decryptedGroupJoinInfo.getRevision(), change, groupLinkPassword);
+        return commitChange(groupSecretParams, decryptedGroupJoinInfo.revision, change, groupLinkPassword);
     }
 
     Pair<DecryptedGroup, GroupChange> acceptInvite(GroupInfoV2 groupInfoV2) throws IOException {
@@ -459,7 +456,7 @@ class GroupV2Helper {
         final var change = groupOperations.createAcceptInviteChange(profileKeyCredential);
 
         final var aci = context.getRecipientHelper().resolveSignalServiceAddress(selfRecipientId).getServiceId();
-        change.setSourceServiceId(aci.toByteString());
+        change.sourceServiceId(aci.toByteString());
 
         return commitChange(groupInfoV2, change);
     }
@@ -520,7 +517,7 @@ class GroupV2Helper {
         final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
         final var uuidCipherTexts = pendingMembers.stream().map(member -> {
             try {
-                return new UuidCiphertext(member.getServiceIdCipherText().toByteArray());
+                return new UuidCiphertext(member.serviceIdCipherText.toByteArray());
             } catch (InvalidInputException e) {
                 throw new AssertionError(e);
             }
@@ -555,8 +552,8 @@ class GroupV2Helper {
         final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey());
         final var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams);
         final var previousGroupState = groupInfoV2.getGroup();
-        final var nextRevision = previousGroupState.getRevision() + 1;
-        final var changeActions = change.setRevision(nextRevision).build();
+        final var nextRevision = previousGroupState.revision + 1;
+        final var changeActions = change.revision(nextRevision).build();
         final DecryptedGroupChange decryptedChange;
         final DecryptedGroup decryptedGroupState;
 
@@ -580,7 +577,7 @@ class GroupV2Helper {
             GroupLinkPassword password
     ) throws IOException {
         final var nextRevision = currentRevision + 1;
-        final var changeActions = change.setRevision(nextRevision).build();
+        final var changeActions = change.revision(nextRevision).build();
 
         return dependencies.getGroupsV2Api()
                 .patchGroup(changeActions,
@@ -589,17 +586,16 @@ class GroupV2Helper {
     }
 
     Pair<ServiceId, ProfileKey> getAuthoritativeProfileKeyFromChange(final DecryptedGroupChange change) {
-        UUID editor = UuidUtil.fromByteStringOrNull(change.getEditorServiceIdBytes());
-        final var editorProfileKeyBytes = Stream.concat(Stream.of(change.getNewMembersList().stream(),
-                                change.getPromotePendingMembersList().stream(),
-                                change.getModifiedProfileKeysList().stream())
+        UUID editor = UuidUtil.fromByteStringOrNull(change.editorServiceIdBytes);
+        final var editorProfileKeyBytes = Stream.concat(Stream.of(change.newMembers.stream(),
+                                change.promotePendingMembers.stream(),
+                                change.modifiedProfileKeys.stream())
                         .flatMap(Function.identity())
-                        .filter(m -> UuidUtil.fromByteString(m.getAciBytes()).equals(editor))
-                        .map(DecryptedMember::getProfileKey),
-                change.getNewRequestingMembersList()
-                        .stream()
-                        .filter(m -> UuidUtil.fromByteString(m.getAciBytes()).equals(editor))
-                        .map(DecryptedRequestingMember::getProfileKey)).findFirst();
+                        .filter(m -> UuidUtil.fromByteString(m.aciBytes).equals(editor))
+                        .map(m -> m.profileKey),
+                change.newRequestingMembers.stream()
+                        .filter(m -> UuidUtil.fromByteString(m.aciBytes).equals(editor))
+                        .map(m -> m.profileKey)).findFirst();
 
         if (editorProfileKeyBytes.isEmpty()) {
             return null;
@@ -630,8 +626,8 @@ class GroupV2Helper {
                     .forGroup(GroupSecretParams.deriveFromMasterKey(groupMasterKey));
 
             try {
-                return groupOperations.decryptChange(GroupChange.parseFrom(signedGroupChange), true).orElse(null);
-            } catch (VerificationFailedException | InvalidGroupStateException | InvalidProtocolBufferException e) {
+                return groupOperations.decryptChange(GroupChange.ADAPTER.decode(signedGroupChange), true).orElse(null);
+            } catch (VerificationFailedException | InvalidGroupStateException | IOException e) {
                 return null;
             }
         }
index cad112b52002fbf3d62a39d67e84d94f8f45aad1..aa4bdba3a4429c51d9aa708a2c91019766b93d90 100644 (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.PNI;
 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.serialize.SignalServiceAddressProtobufSerializer;
-import org.whispersystems.signalservice.internal.serialize.SignalServiceMetadataProtobufSerializer;
-import org.whispersystems.signalservice.internal.serialize.protos.SignalServiceContentProto;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -213,7 +210,7 @@ public final class IncomingMessageHandler {
     }
 
     private SignalServiceContent validate(
-            SignalServiceProtos.Envelope envelope, SignalServiceCipherResult cipherResult, long serverDeliveredTimestamp
+            Envelope envelope, SignalServiceCipherResult cipherResult, long serverDeliveredTimestamp
     ) throws ProtocolInvalidKeyException, ProtocolInvalidMessageException, UnsupportedDataMessageException, InvalidMessageStructureException {
         final var content = cipherResult.getContent();
         final var envelopeMetadata = cipherResult.getMetadata();
@@ -236,21 +233,15 @@ public final class IncomingMessageHandler {
         final var metadata = new SignalServiceMetadata(new SignalServiceAddress(envelopeMetadata.getSourceServiceId(),
                 Optional.ofNullable(envelopeMetadata.getSourceE164())),
                 envelopeMetadata.getSourceDeviceId(),
-                envelope.getTimestamp(),
-                envelope.getServerTimestamp(),
+                envelope.timestamp,
+                envelope.serverTimestamp,
                 serverDeliveredTimestamp,
                 envelopeMetadata.getSealedSender(),
-                envelope.getServerGuid(),
+                envelope.serverGuid,
                 Optional.ofNullable(envelopeMetadata.getGroupId()),
                 envelopeMetadata.getDestinationServiceId().toString());
 
-        final var contentProto = SignalServiceContentProto.newBuilder()
-                .setLocalAddress(SignalServiceAddressProtobufSerializer.toProtobuf(localAddress))
-                .setMetadata(SignalServiceMetadataProtobufSerializer.toProtobuf(metadata))
-                .setContent(content)
-                .build();
-
-        return SignalServiceContent.createFromProto(contentProto);
+        return SignalServiceContent.createFrom(localAddress, metadata, content);
     }
 
     private List<HandleAction> checkAndHandleMessage(
@@ -635,23 +626,21 @@ public final class IncomingMessageHandler {
         if (syncMessage.getPniChangeNumber().isPresent()) {
             final var pniChangeNumber = syncMessage.getPniChangeNumber().get();
             logger.debug("Received PNI change number sync message, applying.");
-            if (pniChangeNumber.hasIdentityKeyPair()
-                    && pniChangeNumber.hasRegistrationId()
-                    && pniChangeNumber.hasSignedPreKey()
+            if (pniChangeNumber.identityKeyPair != null
+                    && pniChangeNumber.registrationId != null
+                    && pniChangeNumber.signedPreKey != null
                     && !envelope.getUpdatedPni().isEmpty()) {
                 logger.debug("New PNI: {}", envelope.getUpdatedPni());
                 try {
                     final var updatedPni = PNI.parseOrThrow(envelope.getUpdatedPni());
                     context.getAccountHelper()
                             .setPni(updatedPni,
-                                    new IdentityKeyPair(pniChangeNumber.getIdentityKeyPair().toByteArray()),
-                                    pniChangeNumber.hasNewE164() ? pniChangeNumber.getNewE164() : null,
-                                    pniChangeNumber.getRegistrationId(),
-                                    new SignedPreKeyRecord(pniChangeNumber.getSignedPreKey().toByteArray()),
-                                    pniChangeNumber.hasLastResortKyberPreKey()
-                                            ? new KyberPreKeyRecord(pniChangeNumber.getLastResortKyberPreKey()
-                                            .toByteArray())
-                                            : null);
+                                    new IdentityKeyPair(pniChangeNumber.identityKeyPair.toByteArray()),
+                                    pniChangeNumber.newE164,
+                                    pniChangeNumber.registrationId,
+                                    new SignedPreKeyRecord(pniChangeNumber.signedPreKey.toByteArray()),
+                                    pniChangeNumber.lastResortKyberPreKey != null ? new KyberPreKeyRecord(
+                                            pniChangeNumber.lastResortKyberPreKey.toByteArray()) : null);
                 } catch (Exception e) {
                     logger.warn("Failed to handle change number message", e);
                 }
index 8cd37aa9c2860397b44c0c54bb2a134b3d197b4e..51c1e9ca764639d432846f53e263cbb34fd2415e 100644 (file)
@@ -1,7 +1,5 @@
 package org.asamk.signal.manager.helper;
 
-import com.google.protobuf.ByteString;
-
 import org.asamk.signal.manager.api.Contact;
 import org.asamk.signal.manager.api.GroupId;
 import org.asamk.signal.manager.api.GroupNotFoundException;
@@ -54,6 +52,8 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
+import okio.ByteString;
+
 public class SendHelper {
 
     private final static Logger logger = LoggerFactory.getLogger(SendHelper.class);
@@ -267,10 +267,10 @@ public class SendHelper {
 
         final var senderKeyDistributionMessage = dependencies.getMessageSender()
                 .getOrCreateNewGroupSession(group.getDistributionId());
-        final var distributionBytes = ByteString.copyFrom(senderKeyDistributionMessage.serialize());
+        final var distributionBytes = ByteString.of(senderKeyDistributionMessage.serialize());
         final var contentToSend = messageSendLogEntry.content()
-                .toBuilder()
-                .setSenderKeyDistributionMessage(distributionBytes)
+                .newBuilder()
+                .senderKeyDistributionMessage(distributionBytes)
                 .build();
 
         final var result = handleSendMessage(recipientId,
index 47923051a3d9bdc4bb0f6e0ee31dc5479b1ac171..41ae761a57c9a37e34e29041f837faa1a24a2c45 100644 (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.VerifiedMessage;
 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.FileOutputStream;
@@ -58,20 +58,20 @@ public class SyncHelper {
     }
 
     public void requestAllSyncData() {
-        requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.GROUPS);
-        requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.CONTACTS);
-        requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.BLOCKED);
-        requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.CONFIGURATION);
+        requestSyncData(SyncMessage.Request.Type.GROUPS);
+        requestSyncData(SyncMessage.Request.Type.CONTACTS);
+        requestSyncData(SyncMessage.Request.Type.BLOCKED);
+        requestSyncData(SyncMessage.Request.Type.CONFIGURATION);
         requestSyncKeys();
         requestSyncPniIdentity();
     }
 
     public void requestSyncKeys() {
-        requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.KEYS);
+        requestSyncData(SyncMessage.Request.Type.KEYS);
     }
 
     public void requestSyncPniIdentity() {
-        requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.PNI_IDENTITY);
+        requestSyncData(SyncMessage.Request.Type.PNI_IDENTITY);
     }
 
     public void sendSyncFetchProfileMessage() {
@@ -346,8 +346,8 @@ public class SyncHelper {
         }
     }
 
-    private void requestSyncData(final SignalServiceProtos.SyncMessage.Request.Type type) {
-        var r = SignalServiceProtos.SyncMessage.Request.newBuilder().setType(type).build();
+    private void requestSyncData(final SyncMessage.Request.Type type) {
+        var r = new SyncMessage.Request.Builder().type(type).build();
         var message = SignalServiceSyncMessage.forRequest(new RequestMessage(r));
         context.getSendHelper().sendSyncMessage(message);
     }
index 6a8de5924e8425d2a5901e92d0558674d98dec02..c263aa9bcfff7d52d82ee768ae236c3f1a825d53 100644 (file)
@@ -21,7 +21,7 @@ public final class GroupInfoV2 extends GroupInfo {
 
     private final GroupIdV2 groupId;
     private final GroupMasterKey masterKey;
-    private DistributionId distributionId;
+    private final DistributionId distributionId;
     private boolean blocked;
     private DecryptedGroup group;
     private boolean permissionDenied;
@@ -84,7 +84,7 @@ public final class GroupInfoV2 extends GroupInfo {
         if (this.group == null) {
             return null;
         }
-        return this.group.getTitle();
+        return this.group.title;
     }
 
     @Override
@@ -92,15 +92,15 @@ public final class GroupInfoV2 extends GroupInfo {
         if (this.group == null) {
             return null;
         }
-        return this.group.getDescription();
+        return this.group.description;
     }
 
     @Override
     public GroupInviteLinkUrl getGroupInviteLink() {
-        if (this.group == null || this.group.getInviteLinkPassword().isEmpty() || (
-                this.group.getAccessControl().getAddFromInviteLink() != AccessControl.AccessRequired.ANY
-                        && this.group.getAccessControl().getAddFromInviteLink()
-                        != AccessControl.AccessRequired.ADMINISTRATOR
+        if (this.group == null || this.group.inviteLinkPassword.toByteArray().length == 0 || (
+                this.group.accessControl != null
+                        && this.group.accessControl.addFromInviteLink != AccessControl.AccessRequired.ANY
+                        && this.group.accessControl.addFromInviteLink != AccessControl.AccessRequired.ADMINISTRATOR
         )) {
             return null;
         }
@@ -113,9 +113,8 @@ public final class GroupInfoV2 extends GroupInfo {
         if (this.group == null) {
             return Set.of();
         }
-        return group.getMembersList()
-                .stream()
-                .map(m -> ServiceId.parseOrThrow(m.getAciBytes()))
+        return group.members.stream()
+                .map(m -> ServiceId.parseOrThrow(m.aciBytes))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -125,9 +124,8 @@ public final class GroupInfoV2 extends GroupInfo {
         if (this.group == null) {
             return Set.of();
         }
-        return group.getBannedMembersList()
-                .stream()
-                .map(m -> ServiceId.parseOrThrow(m.getServiceIdBytes()))
+        return group.bannedMembers.stream()
+                .map(m -> ServiceId.parseOrThrow(m.serviceIdBytes))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -137,9 +135,8 @@ public final class GroupInfoV2 extends GroupInfo {
         if (this.group == null) {
             return Set.of();
         }
-        return group.getPendingMembersList()
-                .stream()
-                .map(m -> ServiceId.parseOrThrow(m.getServiceIdBytes()))
+        return group.pendingMembers.stream()
+                .map(m -> ServiceId.parseOrThrow(m.serviceIdBytes))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -149,9 +146,8 @@ public final class GroupInfoV2 extends GroupInfo {
         if (this.group == null) {
             return Set.of();
         }
-        return group.getRequestingMembersList()
-                .stream()
-                .map(m -> ServiceId.parseOrThrow(m.getAciBytes()))
+        return group.requestingMembers.stream()
+                .map(m -> ServiceId.parseOrThrow(m.aciBytes))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -161,11 +157,10 @@ public final class GroupInfoV2 extends GroupInfo {
         if (this.group == null) {
             return Set.of();
         }
-        return group.getMembersList()
-                .stream()
-                .filter(m -> m.getRole() == Member.Role.ADMINISTRATOR)
-                .map(m -> new RecipientAddress(ServiceId.ACI.parseOrNull(m.getAciBytes()),
-                        ServiceId.PNI.parseOrNull(m.getPniBytes()),
+        return group.members.stream()
+                .filter(m -> m.role == Member.Role.ADMINISTRATOR)
+                .map(m -> new RecipientAddress(ServiceId.ACI.parseOrNull(m.aciBytes),
+                        ServiceId.PNI.parseOrNull(m.pniBytes),
                         null))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
@@ -183,26 +178,26 @@ public final class GroupInfoV2 extends GroupInfo {
 
     @Override
     public int getMessageExpirationTimer() {
-        return this.group != null && this.group.hasDisappearingMessagesTimer()
-                ? this.group.getDisappearingMessagesTimer().getDuration()
+        return this.group != null && this.group.disappearingMessagesTimer != null
+                ? this.group.disappearingMessagesTimer.duration
                 : 0;
     }
 
     @Override
     public boolean isAnnouncementGroup() {
-        return this.group != null && this.group.getIsAnnouncementGroup() == EnabledState.ENABLED;
+        return this.group != null && this.group.isAnnouncementGroup == EnabledState.ENABLED;
     }
 
     @Override
     public GroupPermission getPermissionAddMember() {
         final var accessControl = getAccessControl();
-        return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.getMembers());
+        return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.members);
     }
 
     @Override
     public GroupPermission getPermissionEditDetails() {
         final var accessControl = getAccessControl();
-        return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.getAttributes());
+        return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.attributes);
     }
 
     @Override
@@ -219,11 +214,11 @@ public final class GroupInfoV2 extends GroupInfo {
     }
 
     private AccessControl getAccessControl() {
-        if (this.group == null || !this.group.hasAccessControl()) {
+        if (this.group == null || this.group.accessControl == null) {
             return null;
         }
 
-        return this.group.getAccessControl();
+        return this.group.accessControl;
     }
 
     private static GroupPermission toGroupPermission(final AccessControl.AccessRequired permission) {
index af5ada26d88175abeb909db2e53abcb5675288ed..71fa0f9d4461c2d21640b63d832e1ff6264d1565 100644 (file)
@@ -1,7 +1,5 @@
 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.GroupIdV1;
 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.util.UuidUtil;
 
+import java.io.IOException;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -295,7 +294,7 @@ public class GroupStore {
                 if (groupV2.getGroup() == null) {
                     statement.setNull(4, Types.NUMERIC);
                 } else {
-                    statement.setBytes(4, groupV2.getGroup().toByteArray());
+                    statement.setBytes(4, groupV2.getGroup().encode());
                 }
                 statement.setBytes(5, UuidUtil.toByteArray(groupV2.getDistributionId().asUuid()));
                 statement.setBoolean(6, groupV2.isBlocked());
@@ -349,12 +348,12 @@ public class GroupStore {
             final var permissionDenied = resultSet.getBoolean("permission_denied");
             return new GroupInfoV2(GroupId.v2(groupId),
                     new GroupMasterKey(masterKey),
-                    groupData == null ? null : DecryptedGroup.parseFrom(groupData),
+                    groupData == null ? null : DecryptedGroup.ADAPTER.decode(groupData),
                     DistributionId.from(UuidUtil.parseOrThrow(distributionId)),
                     blocked,
                     permissionDenied,
                     recipientResolver);
-        } catch (InvalidInputException | InvalidProtocolBufferException e) {
+        } catch (InvalidInputException | IOException e) {
             return null;
         }
     }
index f004ae69883fab5cdf5e597853b5ce088f117253..b53b14c0ae167954a81540a915589d3521036b09 100644 (file)
@@ -113,7 +113,7 @@ public class LegacyGroupStore {
             return null;
         }
         try (var stream = new FileInputStream(groupFile)) {
-            return DecryptedGroup.parseFrom(stream);
+            return DecryptedGroup.ADAPTER.decode(stream);
         } catch (IOException ignored) {
             return null;
         }
index c7f373964919978eeb78040c160bd531a0429ad4..b8d951c1207fa59146b16e01a07b3acc54a1b978 100644 (file)
@@ -2,10 +2,10 @@ package org.asamk.signal.manager.storage.sendLog;
 
 import org.asamk.signal.manager.api.GroupId;
 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;
 
 public record MessageSendLogEntry(
-        Optional<GroupId> groupId, SignalServiceProtos.Content content, ContentHint contentHint, boolean urgent
+        Optional<GroupId> groupId, Content content, ContentHint contentHint, boolean urgent
 ) {}
index 08b23933703528cac6e834601755724590072c9d..751f345bed1cb5d8c4f16347533d1d6c027833c4 100644 (file)
@@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.crypto.ContentHint;
 import org.whispersystems.signalservice.api.messages.SendMessageResult;
 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.sql.Connection;
@@ -267,7 +267,7 @@ public class MessageSendLogStore implements AutoCloseable {
     private long insert(
             final List<RecipientDevices> recipientDevices,
             final long sentTimestamp,
-            final SignalServiceProtos.Content content,
+            final Content content,
             final ContentHint contentHint,
             final boolean urgent
     ) {
@@ -284,7 +284,7 @@ public class MessageSendLogStore implements AutoCloseable {
             try (final var statement = connection.prepareStatement(sql)) {
                 statement.setLong(1, sentTimestamp);
                 statement.setBytes(2, groupId);
-                statement.setBytes(3, content.toByteArray());
+                statement.setBytes(3, content.encode());
                 statement.setInt(4, contentHint.getType());
                 statement.setBoolean(5, urgent);
                 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 {
-            return !content.hasDataMessage()
+            return content.dataMessage == null
                     ? null
-                    : content.getDataMessage().hasGroup()
-                            ? content.getDataMessage().getGroup().getId().toByteArray()
-                            : content.getDataMessage().hasGroupV2()
-                                    ? GroupUtils.getGroupIdV2(new GroupMasterKey(content.getDataMessage()
-                                    .getGroupV2()
-                                    .getMasterKey()
-                                    .toByteArray())).serialize()
+                    : content.dataMessage.group != null && content.dataMessage.group.id != null
+                            ? content.dataMessage.group.id.toByteArray()
+                            : content.dataMessage.groupV2 != null && content.dataMessage.groupV2.masterKey != null
+                                    ? GroupUtils.getGroupIdV2(new GroupMasterKey(content.dataMessage.groupV2.masterKey.toByteArray()))
+                                    .serialize()
                                     : null;
         } catch (InvalidInputException e) {
             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 {
         final var groupId = Optional.ofNullable(resultSet.getBytes("group_id")).map(GroupId::unknownVersion);
-        final SignalServiceProtos.Content content;
+        final Content content;
         try {
-            content = SignalServiceProtos.Content.parseFrom(resultSet.getBinaryStream("content"));
+            content = Content.ADAPTER.decode(resultSet.getBinaryStream("content"));
         } catch (IOException e) {
             logger.warn("Failed to parse content from message send log", e);
             return null;
index a7682682bce3333983f0d0d576851d163db6a03f..b1568bdc21494261652964af48372c8d3e495604 100644 (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.SignalServiceAddress;
 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.DataOutputStream;
@@ -34,7 +34,7 @@ public class MessageCacheUtils {
             }
             if (version >= 9) {
                 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);
             } else {
                 var type = in.readInt();
@@ -114,7 +114,7 @@ public class MessageCacheUtils {
             try (var out = new DataOutputStream(f)) {
                 out.writeInt(CURRENT_VERSION); // version
                 out.writeLong(envelope.getServerDeliveredTimestamp());
-                envelope.getProto().writeTo(out);
+                envelope.getProto().encode(out);
             }
         }
     }
index 1471d8fed0bd153a1c3c8e87105c1cd3f2d9d09e..ca55008c93ee575583284c6ceff6802736a26375 100644 (file)
@@ -1,14 +1,14 @@
 package org.asamk.signal.manager.util;
 
-import com.google.protobuf.ByteString;
-
 import org.signal.libsignal.protocol.IdentityKey;
 import org.signal.libsignal.protocol.IdentityKeyPair;
 import org.signal.libsignal.protocol.ecc.ECPrivateKey;
 import org.signal.libsignal.protocol.ecc.ECPublicKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
+import org.whispersystems.signalservice.internal.push.PaymentAddress;
+
+import okio.ByteString;
 
 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.
      */
-    public static SignalServiceProtos.PaymentAddress signPaymentsAddress(
+    public static PaymentAddress signPaymentsAddress(
             byte[] publicAddressBytes, ECPrivateKey privateKey
     ) {
         byte[] signature = privateKey.calculateSignature(publicAddressBytes);
 
-        return SignalServiceProtos.PaymentAddress.newBuilder()
-                .setMobileCoinAddress(SignalServiceProtos.PaymentAddress.MobileCoinAddress.newBuilder()
-                        .setAddress(ByteString.copyFrom(publicAddressBytes))
-                        .setSignature(ByteString.copyFrom(signature)))
-                .build();
+        return new PaymentAddress.Builder().mobileCoinAddress(new PaymentAddress.MobileCoinAddress.Builder().address(
+                ByteString.of(publicAddressBytes)).signature(ByteString.of(signature)).build()).build();
     }
 
     /**
@@ -38,15 +35,16 @@ public class PaymentUtils {
      * Returns the validated bytes if so, otherwise returns null.
      */
     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.");
             return null;
         }
 
-        byte[] bytes = paymentAddress.getMobileCoinAddress().getAddress().toByteArray();
-        byte[] signature = paymentAddress.getMobileCoinAddress().getSignature().toByteArray();
+        byte[] bytes = mobileCoinAddress.address.toByteArray();
+        byte[] signature = mobileCoinAddress.signature.toByteArray();
 
         if (signature.length != 64 || !publicKey.verifySignature(bytes, signature)) {
             logger.debug("Got mobile coin address with invalid signature, ignoring.");
index cfbfc3ccdcaf5c90fbab229a4be72227e17b0170..40fc8f7b2c2879fe7787db3d587ae6dcd9c96c33 100644 (file)
@@ -1,7 +1,5 @@
 package org.asamk.signal.manager.util;
 
-import com.google.protobuf.InvalidProtocolBufferException;
-
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.Profile;
 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.ProfileCipher;
 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.util.Base64;
@@ -117,10 +115,10 @@ public class ProfileUtils {
             return null;
         }
 
-        SignalServiceProtos.PaymentAddress paymentAddress;
+        PaymentAddress paymentAddress;
         try {
-            paymentAddress = SignalServiceProtos.PaymentAddress.parseFrom(decrypted);
-        } catch (InvalidProtocolBufferException e) {
+            paymentAddress = PaymentAddress.ADAPTER.decode(decrypted);
+        } catch (IOException e) {
             logger.debug("Failed to parse payment address", e);
             return null;
         }
index 2d3cd01a4bb3a08bb09ae1f075a080f9ddb98746..bb2d1974b21ea0f7f40f534c6ffc4d12de9e0ae2 100644 (file)
@@ -16,8 +16,7 @@ dependencyResolutionManagement {
             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("protobuf", "com.google.protobuf", "protobuf-javalite").version("3.24.0")
+            library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_81")
             library("sqlite", "org.xerial", "sqlite-jdbc").version("3.43.0.0")
             library("hikari", "com.zaxxer", "HikariCP").version("5.0.1")
             library("junit", "org.junit.jupiter", "junit-jupiter").version("5.10.0")
index 70b1951c98c255d3878abc8d7bb57d7a21d61503..3438cf394b89992b7d5c04c97e67481d332d9614 100644 (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) {
-            return new Hangup(hangup.id(), hangup.type().name(), hangup.deviceId(), hangup.isLegacy());
+            return new Hangup(hangup.id(), hangup.type().name(), hangup.deviceId());
         }
     }