2025-02-11 08:20:14 +10:00
/ *
* Copyright 2020 - 2022 Signal Messenger , LLC
* SPDX - License - Identifier : AGPL - 3.0 - only
* /
2021-07-20 16:18:35 -04:00
2018-02-15 14:59:46 -05:00
package signalservice ;
2014-01-15 02:46:05 -05:00
2018-02-15 14:59:46 -05:00
option java_package = "org.whispersystems.signalservice.internal.push" ;
option java_outer_classname = "SignalServiceProtos" ;
2014-01-15 02:46:05 -05:00
2015-06-01 14:08:21 -07:00
message Envelope {
2025-02-11 08:20:14 +10:00
// Our parser does not handle reserved in enums: DESKTOP-1569
2014-03-12 12:52:19 -07:00
enum Type {
2025-02-11 08:20:14 +10:00
UNKNOWN = 0 ;
CIPHERTEXT = 1 ; // content => (version byte | SignalMessage{Content})
// reserved 2;
// reserved "KEY_EXCHANGE";
PREKEY_BUNDLE = 3 ; // content => (version byte | PreKeySignalMessage{Content})
SERVER_DELIVERY_RECEIPT = 5 ; // legacyMessage => [] AND content => []
UNIDENTIFIED_SENDER = 6 ; // legacyMessage => [] AND content => ((version byte | UnidentifiedSenderMessage) OR (version byte | Multi-Recipient Sealed Sender Format))
SENDERKEY_MESSAGE = 7 ; // legacyMessage => [] AND content => (version byte | SenderKeyMessage)
PLAINTEXT_CONTENT = 8 ; // legacyMessage => [] AND content => (marker byte | Content)
}
optional Type type = 1 ;
reserved 2 ; // formerly optional string sourceE164 = 2;
2023-08-10 18:43:33 +02:00
optional string sourceServiceId = 11 ;
2025-02-11 08:20:14 +10:00
optional uint32 sourceDevice = 7 ;
2023-08-10 18:43:33 +02:00
optional string destinationServiceId = 13 ;
2025-02-11 08:20:14 +10:00
reserved 3 ; // formerly optional string relay = 3;
optional uint64 timestamp = 5 ;
reserved 6 ; // formerly optional bytes legacyMessage = 6; // Contains an encrypted DataMessage; this field could have been set historically for type 1 or 3 messages; no longer in use
optional bytes content = 8 ; // Contains an encrypted Content
optional string serverGuid = 9 ;
2018-10-17 18:01:21 -07:00
optional uint64 serverTimestamp = 10 ;
2022-07-01 09:55:13 -07:00
optional bool ephemeral = 12 ; // indicates that the message should not be persisted if the recipient is offline
2025-02-11 08:20:14 +10:00
optional bool urgent = 14 [ default = true ] ; // indicates that the content is considered timely by the sender; defaults to true so senders have to opt-out to say something isn't time critical
optional string updatedPni = 15 ; // for number-change synchronization messages, provides the new server-assigned phone number identifier associated with the changed number
2022-10-07 10:02:08 -07:00
optional bool story = 16 ; // indicates that the content is a story.
2025-02-11 08:20:14 +10:00
optional bytes report_spam_token = 17 ; // token sent when reporting spam
reserved 18 ; // internal server use
// next: 19
2015-06-01 14:08:21 -07:00
}
2014-03-12 12:52:19 -07:00
2015-06-01 14:08:21 -07:00
message Content {
2025-02-11 08:20:14 +10:00
optional DataMessage dataMessage = 1 ;
optional SyncMessage syncMessage = 2 ;
optional CallMessage callMessage = 3 ;
optional NullMessage nullMessage = 4 ;
optional ReceiptMessage receiptMessage = 5 ;
optional TypingMessage typingMessage = 6 ;
optional bytes /* SenderKeyDistributionMessage */ senderKeyDistributionMessage = 7 ;
optional bytes /* DecryptionErrorMessage */ decryptionErrorMessage = 8 ;
optional StoryMessage storyMessage = 9 ;
optional PniSignatureMessage pniSignatureMessage = 10 ;
2023-03-27 19:48:57 -04:00
optional EditMessage editMessage = 11 ;
Feature: Blue check marks for read messages if opted in (#1489)
* Refactor delivery receipt event handler
* Rename the delivery receipt event
For less ambiguity with read receipts.
* Rename synced read event
For less ambiguity with read receipts from other Signal users.
* Add support for incoming receipt messages
Handle ReceiptMessages, which may include encrypted delivery receipts or read
receipts from recipients of our sent messages.
// FREEBIE
* Rename ReadReceipts to ReadSyncs
* Render read messages with blue double checks
* Send read receipts to senders of incoming messages
// FREEBIE
* Move ReadSyncs to their own file
// FREEBIE
* Fixup old comments on read receipts (now read syncs)
And some variable renaming for extra clarity.
// FREEBIE
* Add global setting for read receipts
Don't send read receipt messages unless the setting is enabled.
Don't process read receipts if the setting is disabled.
// FREEBIE
* Sync read receipt setting from mobile
Toggling this setting on your mobile device should sync it to Desktop. When
linking, use the setting in the provisioning message.
// FREEBIE
* Send receipt messages silently
Avoid generating phantom messages on ios
// FREEBIE
* Save recipients on the outgoing message models
For accurate tracking and display of sent/delivered/read state, even if group
membership changes later.
// FREEBIE
* Fix conversation type in profile key update handling
// FREEBIE
* Set recipients on synced sent messages
* Render saved recipients in message detail if available
For older messages, where we did not save the intended set of recipients at the
time of sending, fall back to the current group membership.
// FREEBIE
* Record who has been successfully sent to
// FREEBIE
* Record who a message has been delivered to
* Invert the not-clickable class
* Fix readReceipt setting sync when linking
* Render per recipient sent/delivered/read status
In the message detail view for outgoing messages, render each recipient's
individual sent/delivered/read status with respect to this message, as long as
there are no errors associated with the recipient (ie, safety number changes,
user not registered, etc...) since the error icon is displayed in that case.
*Messages sent before this change may not have per-recipient status lists
and will simply show no status icon.
// FREEBIE
* Add configuration sync request
Send these requests in a one-off fashion when:
1. We have just setup from a chrome app import
2. We have just upgraded to read-receipt support
// FREEBIE
* Expose sendRequestConfigurationSyncMessage
// FREEBIE
* Fix handling of incoming delivery receipts - union with array
FREEBIE
2017-10-05 00:28:43 +02:00
}
2025-02-11 08:20:14 +10:00
message CallMessage {
2017-02-22 10:20:54 -08:00
message Offer {
2020-06-04 11:16:19 -07:00
enum Type {
2020-07-29 09:29:57 -07:00
OFFER_AUDIO_CALL = 0 ;
OFFER_VIDEO_CALL = 1 ;
2025-02-11 08:20:14 +10:00
reserved /* OFFER_NEED_PERMISSION */ 2 ; // removed
2020-06-04 11:16:19 -07:00
}
2025-02-11 08:20:14 +10:00
optional uint64 id = 1 ;
reserved /* sdp */ 2 ;
optional Type type = 3 ;
optional bytes opaque = 4 ;
2017-02-22 10:20:54 -08:00
}
message Answer {
2025-02-11 08:20:14 +10:00
optional uint64 id = 1 ;
reserved /* sdp */ 2 ;
optional bytes opaque = 3 ;
2017-02-22 10:20:54 -08:00
}
2025-02-11 08:20:14 +10:00
message IceUpdate {
optional uint64 id = 1 ;
reserved /* mid */ 2 ;
reserved /* line */ 3 ;
reserved /* sdp */ 4 ;
optional bytes opaque = 5 ;
2017-02-22 10:20:54 -08:00
}
message Busy {
2025-02-11 08:20:14 +10:00
optional uint64 id = 1 ;
2017-02-22 10:20:54 -08:00
}
message Hangup {
2020-06-04 11:16:19 -07:00
enum Type {
2025-02-11 08:20:14 +10:00
HANGUP_NORMAL = 0 ;
HANGUP_ACCEPTED = 1 ;
HANGUP_DECLINED = 2 ;
HANGUP_BUSY = 3 ;
2020-07-06 17:37:43 -07:00
HANGUP_NEED_PERMISSION = 4 ;
2020-06-04 11:16:19 -07:00
}
2025-02-11 08:20:14 +10:00
optional uint64 id = 1 ;
optional Type type = 2 ;
2020-06-04 11:16:19 -07:00
optional uint32 deviceId = 3 ;
}
2017-02-22 10:20:54 -08:00
2020-11-13 13:57:55 -06:00
message Opaque {
2021-08-20 11:06:15 -05:00
enum Urgency {
2025-02-11 08:20:14 +10:00
DROPPABLE = 0 ;
2021-08-20 11:06:15 -05:00
HANDLE_IMMEDIATELY = 1 ;
}
2025-02-11 08:20:14 +10:00
optional bytes data = 1 ;
optional Urgency urgency = 2 ; // If missing, treat as DROPPABLE.
2020-11-13 13:57:55 -06:00
}
2025-02-11 08:20:14 +10:00
optional Offer offer = 1 ;
optional Answer answer = 2 ;
repeated IceUpdate iceUpdate = 3 ;
reserved /* legacyHangup */ 4 ;
optional Busy busy = 5 ;
reserved /* profileKey */ 6 ;
optional Hangup hangup = 7 ;
reserved /* multiRing */ 8 ;
optional uint32 destinationDeviceId = 9 ;
optional Opaque opaque = 10 ;
2015-06-01 14:08:21 -07:00
}
2015-02-12 17:42:07 -08:00
2015-06-01 14:08:21 -07:00
message DataMessage {
2014-03-12 12:52:19 -07:00
enum Flags {
2025-02-11 08:20:14 +10:00
END_SESSION = 1 ;
2016-09-20 14:36:57 -07:00
EXPIRATION_TIMER_UPDATE = 2 ;
2025-02-11 08:20:14 +10:00
PROFILE_KEY_UPDATE = 4 ;
FORWARD = 8 ;
2014-01-15 02:46:05 -05:00
}
2022-11-30 13:47:54 -08:00
message Payment {
message Amount {
message MobileCoin {
optional uint64 picoMob = 1 ; // 1,000,000,000,000 picoMob per Mob
}
oneof Amount {
MobileCoin mobileCoin = 1 ;
}
}
message Notification {
message MobileCoin {
2025-02-11 08:20:14 +10:00
optional bytes receipt = 1 ;
2022-11-30 13:47:54 -08:00
}
oneof Transaction {
MobileCoin mobileCoin = 1 ;
}
// Optional, Refers to the PaymentRequest message, if any.
2025-02-11 08:20:14 +10:00
optional string note = 2 ;
reserved /*requestId*/ 1003 ;
2022-11-30 13:47:54 -08:00
}
message Activation {
enum Type {
REQUEST = 0 ;
ACTIVATED = 1 ;
}
optional Type type = 1 ;
}
oneof Item {
Notification notification = 1 ;
Activation activation = 2 ;
}
2025-02-11 08:20:14 +10:00
reserved /*request*/ 1002 ;
reserved /*cancellation*/ 1003 ;
2022-11-30 13:47:54 -08:00
}
2018-04-06 14:59:26 -07:00
message Quote {
2022-05-11 13:59:58 -07:00
enum Type {
NORMAL = 0 ;
GIFT_BADGE = 1 ;
}
2018-04-06 14:59:26 -07:00
message QuotedAttachment {
2025-02-11 08:20:14 +10:00
optional string contentType = 1 ;
optional string fileName = 2 ;
optional AttachmentPointer thumbnail = 3 ;
2018-04-06 14:59:26 -07:00
}
2025-02-11 08:20:14 +10:00
optional uint64 id = 1 ;
reserved /*authorE164*/ 2 ;
optional string authorAci = 5 ;
optional string text = 3 ;
2018-04-06 14:59:26 -07:00
repeated QuotedAttachment attachments = 4 ;
2025-02-11 08:20:14 +10:00
repeated BodyRange bodyRanges = 6 ;
optional Type type = 7 ;
2018-04-06 14:59:26 -07:00
}
2018-04-27 09:32:31 -07:00
message Contact {
message Name {
2025-02-11 08:20:14 +10:00
optional string givenName = 1 ;
optional string familyName = 2 ;
optional string prefix = 3 ;
optional string suffix = 4 ;
optional string middleName = 5 ;
reserved /*displayName*/ 6 ;
2024-10-01 14:46:56 -07:00
optional string nickname = 7 ;
2018-04-27 09:32:31 -07:00
}
message Phone {
enum Type {
2025-02-11 08:20:14 +10:00
HOME = 1 ;
2018-04-27 09:32:31 -07:00
MOBILE = 2 ;
2025-02-11 08:20:14 +10:00
WORK = 3 ;
2018-04-27 09:32:31 -07:00
CUSTOM = 4 ;
}
optional string value = 1 ;
2025-02-11 08:20:14 +10:00
optional Type type = 2 ;
2018-04-27 09:32:31 -07:00
optional string label = 3 ;
}
message Email {
enum Type {
2025-02-11 08:20:14 +10:00
HOME = 1 ;
2018-04-27 09:32:31 -07:00
MOBILE = 2 ;
2025-02-11 08:20:14 +10:00
WORK = 3 ;
2018-04-27 09:32:31 -07:00
CUSTOM = 4 ;
}
optional string value = 1 ;
2025-02-11 08:20:14 +10:00
optional Type type = 2 ;
2018-04-27 09:32:31 -07:00
optional string label = 3 ;
}
message PostalAddress {
enum Type {
2025-02-11 08:20:14 +10:00
HOME = 1 ;
WORK = 2 ;
2018-04-27 09:32:31 -07:00
CUSTOM = 3 ;
}
2025-02-11 08:20:14 +10:00
optional Type type = 1 ;
optional string label = 2 ;
optional string street = 3 ;
optional string pobox = 4 ;
2018-04-27 09:32:31 -07:00
optional string neighborhood = 5 ;
2025-02-11 08:20:14 +10:00
optional string city = 6 ;
optional string region = 7 ;
optional string postcode = 8 ;
optional string country = 9 ;
2018-04-27 09:32:31 -07:00
}
message Avatar {
2025-02-11 08:20:14 +10:00
optional AttachmentPointer avatar = 1 ;
optional bool isProfile = 2 ;
2018-04-27 09:32:31 -07:00
}
2025-02-11 08:20:14 +10:00
optional Name name = 1 ;
repeated Phone number = 3 ;
repeated Email email = 4 ;
repeated PostalAddress address = 5 ;
optional Avatar avatar = 6 ;
optional string organization = 7 ;
2019-01-15 19:03:56 -08:00
}
2019-05-16 15:32:11 -07:00
message Sticker {
2025-02-11 08:20:14 +10:00
optional bytes packId = 1 ;
optional bytes packKey = 2 ;
optional uint32 stickerId = 3 ;
optional AttachmentPointer data = 4 ;
optional string emoji = 5 ;
2019-05-16 15:32:11 -07:00
}
2019-12-16 12:45:57 -05:00
message Reaction {
2025-02-11 08:20:14 +10:00
optional string emoji = 1 ;
optional bool remove = 2 ;
reserved /* targetAuthorE164 */ 3 ;
2023-08-10 18:43:33 +02:00
optional string targetAuthorAci = 4 ;
2025-02-11 08:20:14 +10:00
optional uint64 targetSentTimestamp = 5 ;
2019-12-16 12:45:57 -05:00
}
2020-04-29 17:24:12 -04:00
message Delete {
optional uint64 targetSentTimestamp = 1 ;
}
2020-11-16 13:58:54 -06:00
message GroupCallUpdate {
2020-12-01 19:49:08 -06:00
optional string eraId = 1 ;
2020-11-16 13:58:54 -06:00
}
2021-11-15 17:20:09 -08:00
message StoryContext {
2023-08-10 18:43:33 +02:00
optional string authorAci = 1 ;
2021-11-15 17:20:09 -08:00
optional uint64 sentTimestamp = 2 ;
}
2019-06-10 14:40:02 -07:00
enum ProtocolVersion {
option allow_alias = true ;
2021-10-27 15:18:25 -07:00
INITIAL = 0 ;
MESSAGE_TIMERS = 1 ;
VIEW_ONCE = 2 ;
VIEW_ONCE_VIDEO = 3 ;
REACTIONS = 4 ;
2020-04-17 15:51:39 -07:00
CDN_SELECTOR_ATTACHMENTS = 5 ;
2021-10-27 15:18:25 -07:00
MENTIONS = 6 ;
PAYMENTS = 7 ;
CURRENT = 7 ;
2019-06-10 14:40:02 -07:00
}
2022-05-11 13:59:58 -07:00
message GiftBadge {
optional bytes receiptCredentialPresentation = 1 ;
}
2025-02-11 08:20:14 +10:00
optional string body = 1 ;
repeated AttachmentPointer attachments = 2 ;
2023-04-14 20:52:50 -04:00
reserved /*groupV1*/ 3 ;
2025-02-11 08:20:14 +10:00
optional GroupContextV2 groupV2 = 15 ;
optional uint32 flags = 4 ;
optional uint32 expireTimer = 5 ;
optional uint32 expireTimerVersion = 23 ;
optional bytes profileKey = 6 ;
optional uint64 timestamp = 7 ;
optional Quote quote = 8 ;
repeated Contact contact = 9 ;
repeated Preview preview = 10 ;
optional Sticker sticker = 11 ;
optional uint32 requiredProtocolVersion = 12 ;
optional bool isViewOnce = 14 ;
optional Reaction reaction = 16 ;
optional Delete delete = 17 ;
repeated BodyRange bodyRanges = 18 ;
optional GroupCallUpdate groupCallUpdate = 19 ;
optional Payment payment = 20 ;
optional StoryContext storyContext = 21 ;
optional GiftBadge giftBadge = 22 ;
// NEXT ID: 24
2018-02-15 14:59:46 -05:00
}
message NullMessage {
optional bytes padding = 1 ;
}
message ReceiptMessage {
enum Type {
DELIVERY = 0 ;
2025-02-11 08:20:14 +10:00
READ = 1 ;
VIEWED = 2 ;
2018-02-15 14:59:46 -05:00
}
2025-02-11 08:20:14 +10:00
optional Type type = 1 ;
2018-02-15 14:59:46 -05:00
repeated uint64 timestamp = 2 ;
}
2018-11-14 11:10:32 -08:00
message TypingMessage {
2025-02-11 08:20:14 +10:00
enum Action {
STARTED = 0 ;
STOPPED = 1 ;
}
2018-11-14 11:10:32 -08:00
2025-02-11 08:20:14 +10:00
optional uint64 timestamp = 1 ;
optional Action action = 2 ;
optional bytes groupId = 3 ;
2018-11-14 11:10:32 -08:00
}
2021-11-15 17:20:09 -08:00
message StoryMessage {
optional bytes profileKey = 1 ;
optional GroupContextV2 group = 2 ;
2022-03-04 16:14:52 -05:00
oneof attachment {
AttachmentPointer fileAttachment = 3 ;
TextAttachment textAttachment = 4 ;
}
2022-06-30 20:52:03 -04:00
optional bool allowsReplies = 5 ;
2023-04-10 09:31:45 -07:00
repeated BodyRange bodyRanges = 6 ;
2022-03-04 16:14:52 -05:00
}
2025-02-11 08:20:14 +10:00
message Preview {
optional string url = 1 ;
optional string title = 2 ;
optional AttachmentPointer image = 3 ;
optional string description = 4 ;
optional uint64 date = 5 ;
}
2022-03-04 16:14:52 -05:00
message TextAttachment {
enum Style {
DEFAULT = 0 ;
REGULAR = 1 ;
BOLD = 2 ;
SERIF = 3 ;
SCRIPT = 4 ;
CONDENSED = 5 ;
}
message Gradient {
2024-04-09 23:38:27 +02:00
optional uint32 startColor = 1 ; // deprecated: this field will be removed in a future release.
optional uint32 endColor = 2 ; // deprecated: this field will be removed in a future release.
2022-03-04 16:14:52 -05:00
optional uint32 angle = 3 ; // degrees
2024-04-09 23:38:27 +02:00
repeated uint32 colors = 4 ;
repeated float positions = 5 ; // percent from 0 to 1
2022-03-04 16:14:52 -05:00
}
optional string text = 1 ;
optional Style textStyle = 2 ;
optional uint32 textForegroundColor = 3 ; // integer representation of hex color
optional uint32 textBackgroundColor = 4 ;
optional Preview preview = 5 ;
oneof background {
Gradient gradient = 6 ;
uint32 color = 7 ;
}
2021-11-15 17:20:09 -08:00
}
2018-02-15 14:59:46 -05:00
message Verified {
enum State {
2025-02-11 08:20:14 +10:00
DEFAULT = 0 ;
VERIFIED = 1 ;
2018-02-15 14:59:46 -05:00
UNVERIFIED = 2 ;
}
2025-02-11 08:20:14 +10:00
reserved /*destinationE164*/ 1 ;
optional string destinationAci = 5 ;
optional bytes identityKey = 2 ;
optional State state = 3 ;
optional bytes nullMessage = 4 ;
2015-06-01 14:08:21 -07:00
}
message SyncMessage {
message Sent {
2018-10-17 18:01:21 -07:00
message UnidentifiedDeliveryStatus {
2025-02-11 08:20:14 +10:00
reserved /*destinationE164*/ 1 ;
2023-08-10 18:43:33 +02:00
optional string destinationServiceId = 3 ;
2024-03-11 18:08:38 -07:00
optional bool unidentified = 2 ;
2025-02-11 08:20:14 +10:00
reserved /*destinationPni */ 4 ;
2024-03-11 18:08:38 -07:00
optional bytes destinationPniIdentityKey = 5 ; // Only set for PNI destinations
2018-10-17 18:01:21 -07:00
}
2022-06-30 20:52:03 -04:00
message StoryMessageRecipient {
2023-08-10 18:43:33 +02:00
optional string destinationServiceId = 1 ;
2022-06-30 20:52:03 -04:00
repeated string distributionListIds = 2 ;
optional bool isAllowedToReply = 3 ;
2025-02-11 08:20:14 +10:00
reserved /*destinationPni */ 4 ;
2022-06-30 20:52:03 -04:00
}
2025-02-11 08:20:14 +10:00
optional string destinationE164 = 1 ;
optional string destinationServiceId = 7 ;
optional uint64 timestamp = 2 ;
optional DataMessage message = 3 ;
optional uint64 expirationStartTimestamp = 4 ;
repeated UnidentifiedDeliveryStatus unidentifiedStatus = 5 ;
optional bool isRecipientUpdate = 6 [ default = false ] ;
2022-06-30 20:52:03 -04:00
optional StoryMessage storyMessage = 8 ;
repeated StoryMessageRecipient storyMessageRecipients = 9 ;
2023-03-27 19:48:57 -04:00
optional EditMessage editMessage = 10 ;
2025-02-11 08:20:14 +10:00
reserved /*destinationPni */ 11 ;
// Next ID: 12
2015-06-01 14:08:21 -07:00
}
message Contacts {
2025-02-11 08:20:14 +10:00
optional AttachmentPointer blob = 1 ;
optional bool complete = 2 [ default = false ] ;
2015-06-01 14:08:21 -07:00
}
2016-09-06 17:12:45 -07:00
message Blocked {
2025-02-11 08:20:14 +10:00
repeated string numbers = 1 ;
repeated string acis = 3 ;
repeated bytes groupIds = 2 ;
2016-09-06 17:12:45 -07:00
}
2015-06-19 15:34:41 -07:00
message Request {
enum Type {
2025-02-11 08:20:14 +10:00
UNKNOWN = 0 ;
CONTACTS = 1 ;
reserved /*GROUPS*/ 2 ;
BLOCKED = 3 ;
Feature: Blue check marks for read messages if opted in (#1489)
* Refactor delivery receipt event handler
* Rename the delivery receipt event
For less ambiguity with read receipts.
* Rename synced read event
For less ambiguity with read receipts from other Signal users.
* Add support for incoming receipt messages
Handle ReceiptMessages, which may include encrypted delivery receipts or read
receipts from recipients of our sent messages.
// FREEBIE
* Rename ReadReceipts to ReadSyncs
* Render read messages with blue double checks
* Send read receipts to senders of incoming messages
// FREEBIE
* Move ReadSyncs to their own file
// FREEBIE
* Fixup old comments on read receipts (now read syncs)
And some variable renaming for extra clarity.
// FREEBIE
* Add global setting for read receipts
Don't send read receipt messages unless the setting is enabled.
Don't process read receipts if the setting is disabled.
// FREEBIE
* Sync read receipt setting from mobile
Toggling this setting on your mobile device should sync it to Desktop. When
linking, use the setting in the provisioning message.
// FREEBIE
* Send receipt messages silently
Avoid generating phantom messages on ios
// FREEBIE
* Save recipients on the outgoing message models
For accurate tracking and display of sent/delivered/read state, even if group
membership changes later.
// FREEBIE
* Fix conversation type in profile key update handling
// FREEBIE
* Set recipients on synced sent messages
* Render saved recipients in message detail if available
For older messages, where we did not save the intended set of recipients at the
time of sending, fall back to the current group membership.
// FREEBIE
* Record who has been successfully sent to
// FREEBIE
* Record who a message has been delivered to
* Invert the not-clickable class
* Fix readReceipt setting sync when linking
* Render per recipient sent/delivered/read status
In the message detail view for outgoing messages, render each recipient's
individual sent/delivered/read status with respect to this message, as long as
there are no errors associated with the recipient (ie, safety number changes,
user not registered, etc...) since the error icon is displayed in that case.
*Messages sent before this change may not have per-recipient status lists
and will simply show no status icon.
// FREEBIE
* Add configuration sync request
Send these requests in a one-off fashion when:
1. We have just setup from a chrome app import
2. We have just upgraded to read-receipt support
// FREEBIE
* Expose sendRequestConfigurationSyncMessage
// FREEBIE
* Fix handling of incoming delivery receipts - union with array
FREEBIE
2017-10-05 00:28:43 +02:00
CONFIGURATION = 4 ;
2025-02-11 08:20:14 +10:00
KEYS = 5 ;
reserved /*PNI_IDENTITY*/ 6 ;
2015-06-19 15:34:41 -07:00
}
2017-06-08 15:57:25 -07:00
2015-06-19 15:34:41 -07:00
optional Type type = 1 ;
}
2017-06-08 15:57:25 -07:00
2016-02-19 16:28:08 -08:00
message Read {
2025-02-11 08:20:14 +10:00
reserved /*senderE164*/ 1 ;
optional string senderAci = 3 ;
optional uint64 timestamp = 2 ;
2016-02-19 16:28:08 -08:00
}
2015-06-19 15:34:41 -07:00
2021-07-06 13:21:05 -05:00
message Viewed {
2025-02-11 08:20:14 +10:00
reserved /*senderE164*/ 1 ;
2023-08-10 18:43:33 +02:00
optional string senderAci = 3 ;
2021-07-06 13:21:05 -05:00
optional uint64 timestamp = 2 ;
}
2018-02-15 14:59:46 -05:00
message Configuration {
2025-02-11 08:20:14 +10:00
optional bool readReceipts = 1 ;
optional bool unidentifiedDeliveryIndicators = 2 ;
optional bool typingIndicators = 3 ;
reserved /* linkPreviews */ 4 ;
optional uint32 provisioningVersion = 5 ;
optional bool linkPreviews = 6 ;
Feature: Blue check marks for read messages if opted in (#1489)
* Refactor delivery receipt event handler
* Rename the delivery receipt event
For less ambiguity with read receipts.
* Rename synced read event
For less ambiguity with read receipts from other Signal users.
* Add support for incoming receipt messages
Handle ReceiptMessages, which may include encrypted delivery receipts or read
receipts from recipients of our sent messages.
// FREEBIE
* Rename ReadReceipts to ReadSyncs
* Render read messages with blue double checks
* Send read receipts to senders of incoming messages
// FREEBIE
* Move ReadSyncs to their own file
// FREEBIE
* Fixup old comments on read receipts (now read syncs)
And some variable renaming for extra clarity.
// FREEBIE
* Add global setting for read receipts
Don't send read receipt messages unless the setting is enabled.
Don't process read receipts if the setting is disabled.
// FREEBIE
* Sync read receipt setting from mobile
Toggling this setting on your mobile device should sync it to Desktop. When
linking, use the setting in the provisioning message.
// FREEBIE
* Send receipt messages silently
Avoid generating phantom messages on ios
// FREEBIE
* Save recipients on the outgoing message models
For accurate tracking and display of sent/delivered/read state, even if group
membership changes later.
// FREEBIE
* Fix conversation type in profile key update handling
// FREEBIE
* Set recipients on synced sent messages
* Render saved recipients in message detail if available
For older messages, where we did not save the intended set of recipients at the
time of sending, fall back to the current group membership.
// FREEBIE
* Record who has been successfully sent to
// FREEBIE
* Record who a message has been delivered to
* Invert the not-clickable class
* Fix readReceipt setting sync when linking
* Render per recipient sent/delivered/read status
In the message detail view for outgoing messages, render each recipient's
individual sent/delivered/read status with respect to this message, as long as
there are no errors associated with the recipient (ie, safety number changes,
user not registered, etc...) since the error icon is displayed in that case.
*Messages sent before this change may not have per-recipient status lists
and will simply show no status icon.
// FREEBIE
* Add configuration sync request
Send these requests in a one-off fashion when:
1. We have just setup from a chrome app import
2. We have just upgraded to read-receipt support
// FREEBIE
* Expose sendRequestConfigurationSyncMessage
// FREEBIE
* Fix handling of incoming delivery receipts - union with array
FREEBIE
2017-10-05 00:28:43 +02:00
}
2019-05-16 15:32:11 -07:00
message StickerPackOperation {
enum Type {
INSTALL = 0 ;
2025-02-11 08:20:14 +10:00
REMOVE = 1 ;
2019-05-16 15:32:11 -07:00
}
2020-07-06 20:56:56 -04:00
2025-02-11 08:20:14 +10:00
optional bytes packId = 1 ;
2019-05-16 15:32:11 -07:00
optional bytes packKey = 2 ;
2025-02-11 08:20:14 +10:00
optional Type type = 3 ;
2019-05-16 15:32:11 -07:00
}
2019-08-05 13:53:15 -07:00
message ViewOnceOpen {
2025-02-11 08:20:14 +10:00
reserved /*senderE164*/ 1 ;
optional string senderAci = 3 ;
optional uint64 timestamp = 2 ;
2019-06-26 12:33:13 -07:00
}
2025-02-11 08:20:14 +10:00
message FetchLatest {
2020-05-27 17:37:06 -04:00
enum Type {
2025-02-11 08:20:14 +10:00
UNKNOWN = 0 ;
LOCAL_PROFILE = 1 ;
STORAGE_MANIFEST = 2 ;
SUBSCRIPTION_STATUS = 3 ;
2020-05-27 17:37:06 -04:00
}
2025-02-11 08:20:14 +10:00
optional Type type = 1 ;
2020-05-27 17:37:06 -04:00
}
2025-02-11 08:20:14 +10:00
message Keys {
reserved /* storageService */ 1 ;
optional bytes master = 2 ; // deprecated: this field will be removed in a future release.
optional string accountEntropyPool = 3 ;
optional bytes mediaRootBackupKey = 4 ;
}
message PniIdentity {
optional bytes publicKey = 1 ;
optional bytes privateKey = 2 ;
}
message MessageRequestResponse {
2020-07-06 20:56:56 -04:00
enum Type {
2025-02-11 08:20:14 +10:00
UNKNOWN = 0 ;
ACCEPT = 1 ;
DELETE = 2 ;
BLOCK = 3 ;
BLOCK_AND_DELETE = 4 ;
SPAM = 5 ;
BLOCK_AND_SPAM = 6 ;
2020-07-06 20:56:56 -04:00
}
2025-02-11 08:20:14 +10:00
reserved /*threadE164*/ 1 ;
optional string threadAci = 2 ;
optional bytes groupId = 3 ;
optional Type type = 4 ;
2020-07-06 20:56:56 -04:00
}
2022-07-28 09:35:29 -07:00
message PniChangeNumber {
optional bytes identityKeyPair = 1 ; // Serialized libsignal-client IdentityKeyPair
2025-02-11 08:20:14 +10:00
optional bytes signedPreKey = 2 ; // Serialized libsignal-client SignedPreKeyRecord
2023-07-14 09:53:20 -07:00
optional bytes lastResortKyberPreKey = 5 ; // Serialized libsignal-client KyberPreKeyRecord
2022-07-28 09:35:29 -07:00
optional uint32 registrationId = 3 ;
2023-07-14 09:53:20 -07:00
optional string newE164 = 4 ; // The e164 we have changed our number to
// Next ID: 6
2022-07-28 09:35:29 -07:00
}
2023-01-09 16:52:01 -08:00
message CallEvent {
enum Type {
2025-02-11 08:20:14 +10:00
UNKNOWN_TYPE = 0 ;
AUDIO_CALL = 1 ;
VIDEO_CALL = 2 ;
GROUP_CALL = 3 ;
2023-08-08 17:53:06 -07:00
AD_HOC_CALL = 4 ;
2023-01-09 16:52:01 -08:00
}
enum Direction {
2025-02-11 08:20:14 +10:00
UNKNOWN_DIRECTION = 0 ;
2023-01-09 16:52:01 -08:00
INCOMING = 1 ;
OUTGOING = 2 ;
}
enum Event {
2025-02-11 08:20:14 +10:00
UNKNOWN_EVENT = 0 ;
ACCEPTED = 1 ;
2023-01-09 16:52:01 -08:00
NOT_ACCEPTED = 2 ;
2025-02-11 08:20:14 +10:00
DELETE = 3 ;
OBSERVED = 4 ;
2023-01-09 16:52:01 -08:00
}
2024-06-25 17:58:38 -07:00
/ * Data identifying a conversation. The service ID for 1 : 1 , the group ID for
* group , or the room ID for an ad - hoc call. See also
* ` CallLogEvent / peerId ` . * /
2025-02-11 08:20:14 +10:00
optional bytes peerId = 1 ;
2024-06-25 17:58:38 -07:00
/ * An identifier for a call. Generated directly for 1 : 1 , or derived from
* the era ID for group and ad - hoc calls. See also ` CallLogEvent / callId ` . * /
2025-02-11 08:20:14 +10:00
optional uint64 callId = 2 ;
optional uint64 timestamp = 3 ;
optional Type type = 4 ;
2023-01-09 16:52:01 -08:00
optional Direction direction = 5 ;
2025-02-11 08:20:14 +10:00
optional Event event = 6 ;
2023-01-09 16:52:01 -08:00
}
2024-02-22 13:19:50 -08:00
message CallLinkUpdate {
2024-04-25 10:09:05 -07:00
enum Type {
UPDATE = 0 ;
2024-09-04 11:06:06 -07:00
reserved 1 ; // was DELETE, superseded by storage service
2024-04-25 10:09:05 -07:00
}
2025-02-11 08:20:14 +10:00
optional bytes rootKey = 1 ;
2024-02-22 13:19:50 -08:00
optional bytes adminPasskey = 2 ;
2025-02-11 08:20:14 +10:00
optional Type type = 3 ; // defaults to UPDATE
2024-02-22 13:19:50 -08:00
}
2023-08-08 17:53:06 -07:00
message CallLogEvent {
enum Type {
CLEAR = 0 ;
2024-03-11 11:18:55 -07:00
MARKED_AS_READ = 1 ;
2024-06-25 17:58:38 -07:00
MARKED_AS_READ_IN_CONVERSATION = 2 ;
2025-02-11 08:20:14 +10:00
CLEAR_IN_CONVERSATION = 3 ;
2023-08-08 17:53:06 -07:00
}
2025-02-11 08:20:14 +10:00
optional Type type = 1 ;
2023-08-08 17:53:06 -07:00
optional uint64 timestamp = 2 ;
2024-06-25 17:58:38 -07:00
/ * Data identifying a conversation. The service ID for 1 : 1 , the group ID for
* group , or the room ID for an ad - hoc call. See also
* ` CallEvent / peerId ` . * /
2025-02-11 08:20:14 +10:00
optional bytes peerId = 3 ;
/ * An identifier for a call. Generated directly for 1 : 1 , or derived from
* the era ID for group and ad - hoc calls. See also ` CallEvent / callId ` . * /
optional uint64 callId = 4 ;
2023-08-08 17:53:06 -07:00
}
2024-05-29 01:56:00 +10:00
message DeleteForMe {
message ConversationIdentifier {
oneof identifier {
2024-06-17 12:24:39 -07:00
string threadServiceId = 1 ;
2024-05-29 01:56:00 +10:00
bytes threadGroupId = 2 ;
string threadE164 = 3 ;
}
}
2024-06-25 17:58:38 -07:00
2024-05-29 01:56:00 +10:00
message AddressableMessage {
oneof author {
2024-06-17 12:24:39 -07:00
string authorServiceId = 1 ;
2024-05-29 01:56:00 +10:00
string authorE164 = 2 ;
}
optional uint64 sentTimestamp = 3 ;
}
message MessageDeletes {
optional ConversationIdentifier conversation = 1 ;
repeated AddressableMessage messages = 2 ;
}
2024-06-21 15:35:18 -07:00
message AttachmentDelete {
optional ConversationIdentifier conversation = 1 ;
optional AddressableMessage targetMessage = 2 ;
// The `clientUuid` from `AttachmentPointer`.
optional bytes clientUuid = 3 ;
// SHA256 hash of the (encrypted, padded, etc.) attachment blob on the CDN.
optional bytes fallbackDigest = 4 ;
// SHA256 hash of the plaintext content of the attachment.
optional bytes fallbackPlaintextHash = 5 ;
}
2024-05-29 01:56:00 +10:00
message ConversationDelete {
optional ConversationIdentifier conversation = 1 ;
repeated AddressableMessage mostRecentMessages = 2 ;
optional bool isFullDelete = 3 ;
2024-06-24 10:49:36 -07:00
repeated AddressableMessage mostRecentNonExpiringMessages = 4 ;
2024-05-29 01:56:00 +10:00
}
message LocalOnlyConversationDelete {
optional ConversationIdentifier conversation = 1 ;
}
repeated MessageDeletes messageDeletes = 1 ;
repeated ConversationDelete conversationDeletes = 2 ;
repeated LocalOnlyConversationDelete localOnlyConversationDeletes = 3 ;
2024-06-21 15:35:18 -07:00
repeated AttachmentDelete attachmentDeletes = 4 ;
2024-05-29 01:56:00 +10:00
}
2025-02-11 08:20:14 +10:00
2024-12-09 13:22:15 -05:00
message DeviceNameChange {
reserved /*name*/ 1 ;
optional uint32 deviceId = 2 ;
}
2024-06-25 17:58:38 -07:00
2025-02-11 08:20:14 +10:00
optional Sent sent = 1 ;
optional Contacts contacts = 2 ;
reserved /*groups*/ 3 ;
optional Request request = 4 ;
repeated Read read = 5 ;
optional Blocked blocked = 6 ;
optional Verified verified = 7 ;
optional Configuration configuration = 9 ;
optional bytes padding = 8 ;
repeated StickerPackOperation stickerPackOperation = 10 ;
optional ViewOnceOpen viewOnceOpen = 11 ;
optional FetchLatest fetchLatest = 12 ;
optional Keys keys = 13 ;
2020-05-27 17:37:06 -04:00
optional MessageRequestResponse messageRequestResponse = 14 ;
2025-02-11 08:20:14 +10:00
repeated Viewed viewed = 16 ;
reserved /*pniIdentity*/ 17 ;
optional PniChangeNumber pniChangeNumber = 18 ;
optional CallEvent callEvent = 19 ;
optional CallLinkUpdate callLinkUpdate = 20 ;
optional CallLogEvent callLogEvent = 21 ;
optional DeleteForMe deleteForMe = 22 ;
optional DeviceNameChange deviceNameChange = 23 ;
2015-06-01 14:08:21 -07:00
}
message AttachmentPointer {
2025-02-11 08:20:14 +10:00
// Our parser does not handle reserved in enums: DESKTOP-1569
2017-05-10 15:16:19 -07:00
enum Flags {
VOICE_MESSAGE = 1 ;
2024-06-21 15:35:18 -07:00
BORDERLESS = 2 ;
// reserved 4;
GIF = 8 ;
2017-05-10 15:16:19 -07:00
}
2017-06-08 15:57:25 -07:00
2020-04-17 15:51:39 -07:00
oneof attachment_identifier {
2024-06-21 15:35:18 -07:00
fixed64 cdnId = 1 ;
string cdnKey = 15 ;
}
// Cross-client identifier for this attachment among all attachments on the
// owning message.
optional bytes clientUuid = 20 ;
optional string contentType = 2 ;
optional bytes key = 3 ;
optional uint32 size = 4 ;
optional bytes thumbnail = 5 ;
optional bytes digest = 6 ;
reserved /* incrementalMac with implicit chunk sizing */ 16 ;
reserved /* incrementalMac for all attachment types */ 18 ;
optional bytes incrementalMac = 19 ;
optional uint32 chunkSize = 17 ;
optional string fileName = 7 ;
optional uint32 flags = 8 ;
optional uint32 width = 9 ;
optional uint32 height = 10 ;
optional string caption = 11 ;
optional string blurHash = 12 ;
optional uint64 uploadTimestamp = 13 ;
optional uint32 cdnNumber = 14 ;
// Next ID: 21
2015-06-01 14:08:21 -07:00
}
2020-04-14 11:32:11 -07:00
message GroupContextV2 {
2025-02-11 08:20:14 +10:00
optional bytes masterKey = 1 ;
optional uint32 revision = 2 ;
optional bytes groupChange = 3 ;
2020-04-14 11:32:11 -07:00
}
2017-06-09 15:00:54 -07:00
message ContactDetails {
2017-06-09 14:58:55 -07:00
message Avatar {
optional string contentType = 1 ;
2025-02-11 08:20:14 +10:00
optional uint32 length = 2 ;
2017-06-09 14:58:55 -07:00
}
2024-08-21 09:03:28 -07:00
optional string number = 1 ;
optional string aci = 9 ;
optional string name = 2 ;
optional Avatar avatar = 3 ;
2025-02-11 08:20:14 +10:00
reserved /* color */ 4 ;
reserved /* verified */ 5 ;
reserved /* profileKey */ 6 ;
reserved /* blocked */ 7 ;
2024-08-21 09:03:28 -07:00
optional uint32 expireTimer = 8 ;
optional uint32 expireTimerVersion = 12 ;
optional uint32 inboxPosition = 10 ;
2025-02-11 08:20:14 +10:00
reserved /* archived */ 11 ;
// NEXT ID: 13
}
message DecryptionErrorMessage {
optional bytes ratchetKey = 1 ; // set to the public ratchet key from the SignalMessage if a 1-1 payload fails to decrypt
optional uint64 timestamp = 2 ;
optional uint32 deviceId = 3 ;
2015-06-22 14:45:42 -07:00
}
2022-08-15 14:53:33 -07:00
message PniSignatureMessage {
optional bytes pni = 1 ;
// Signature *by* the PNI identity key *of* the ACI identity key
optional bytes signature = 2 ;
}
2023-03-27 19:48:57 -04:00
message EditMessage {
optional uint64 targetSentTimestamp = 1 ;
optional DataMessage dataMessage = 2 ;
}
2025-02-11 08:20:14 +10:00
message BodyRange {
enum Style {
NONE = 0 ;
BOLD = 1 ;
ITALIC = 2 ;
SPOILER = 3 ;
STRIKETHROUGH = 4 ;
MONOSPACE = 5 ;
}
optional uint32 start = 1 ; // Starting index in UTF-16 code units/raw string representation
optional uint32 length = 2 ; // Length of range in UTF-16 code units/raw string representation
oneof associatedValue {
string mentionAci = 3 ;
Style style = 4 ;
}
}