diff options
| author | Jeff Carr <[email protected]> | 2025-03-27 15:08:52 -0500 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-03-27 15:08:52 -0500 |
| commit | fb881df443918a6c5d271af691759adb7c0afa9e (patch) | |
| tree | cee4a623f1e7fb0ae806007f0dff05098bb3ba53 /example/Signal-Desktop-Backups.proto | |
| parent | 4b7f42004512c83869370c20cc22398b1a4a2ab2 (diff) | |
add reformatting tests
Diffstat (limited to 'example/Signal-Desktop-Backups.proto')
| -rw-r--r-- | example/Signal-Desktop-Backups.proto | 1315 |
1 files changed, 0 insertions, 1315 deletions
diff --git a/example/Signal-Desktop-Backups.proto b/example/Signal-Desktop-Backups.proto deleted file mode 100644 index c939e53..0000000 --- a/example/Signal-Desktop-Backups.proto +++ /dev/null @@ -1,1315 +0,0 @@ -// Copyright 2024 Signal Messenger, LLC -// SPDX-License-Identifier: AGPL-3.0-only -syntax = "proto3"; - -package signalbackups; - -option java_package = "org.thoughtcrime.securesms.backup.v2.proto"; - -message BackupInfo { - uint64 version = 1; - uint64 backupTimeMs = 2; - bytes mediaRootBackupKey = 3; // 32-byte random value generated when the backup is uploaded for the first time. - string currentAppVersion = 4; - string firstAppVersion = 5; -} - -// Frames must follow in the following ordering rules: -// -// 1. There is exactly one AccountData and it is the first frame. -// 2. A frame referenced by ID must come before the referencing frame. -// e.g. a Recipient must come before any Chat referencing it. -// 3. All ChatItems must appear in global Chat rendering order. -// (The order in which they were received by the client.) -// 4. ChatFolders must appear in render order (e.g., left to right for -// LTR locales), but can appear anywhere relative to other frames respecting -// rule 2 (after Recipients and Chats). -// -// Recipients, Chats, StickerPacks, AdHocCalls, and NotificationProfiles -// can be in any order. (But must respect rule 2.) -// -// For example, Chats may all be together at the beginning, -// or may each immediately precede its first ChatItem. -message Frame { - // If unset, importers should skip this frame without throwing an error. - oneof item { - AccountData account = 1; - Recipient recipient = 2; - Chat chat = 3; - ChatItem chatItem = 4; - StickerPack stickerPack = 5; - AdHocCall adHocCall = 6; - NotificationProfile notificationProfile = 7; - ChatFolder chatFolder = 8; - } -} - -message AccountData { - enum PhoneNumberSharingMode { - UNKNOWN = 0; // Interpret as "Nobody" - EVERYBODY = 1; - NOBODY = 2; - } - message UsernameLink { - enum Color { - UNKNOWN = 0; // Interpret as "Blue" - BLUE = 1; - WHITE = 2; - GREY = 3; - OLIVE = 4; - GREEN = 5; - ORANGE = 6; - PINK = 7; - PURPLE = 8; - } - - bytes entropy = 1; // 32 bytes of entropy used for encryption - bytes serverId = 2; // 16 bytes of encoded UUID provided by the server - Color color = 3; - } - - message AccountSettings { - bool readReceipts = 1; - bool sealedSenderIndicators = 2; - bool typingIndicators = 3; - bool linkPreviews = 4; - bool notDiscoverableByPhoneNumber = 5; - bool preferContactAvatars = 6; - uint32 universalExpireTimerSeconds = 7; // 0 means no universal expire timer. - repeated string preferredReactionEmoji = 8; - bool displayBadgesOnProfile = 9; - bool keepMutedChatsArchived = 10; - bool hasSetMyStoriesPrivacy = 11; - bool hasViewedOnboardingStory = 12; - bool storiesDisabled = 13; - optional bool storyViewReceiptsEnabled = 14; - bool hasSeenGroupStoryEducationSheet = 15; - bool hasCompletedUsernameOnboarding = 16; - PhoneNumberSharingMode phoneNumberSharingMode = 17; - ChatStyle defaultChatStyle = 18; - repeated ChatStyle.CustomChatColor customChatColors = 19; - } - - message SubscriberData { - bytes subscriberId = 1; - string currencyCode = 2; - bool manuallyCancelled = 3; - } - - message IAPSubscriberData { - bytes subscriberId = 1; - - // If unset, importers should ignore the subscriber data without throwing an error. - oneof iapSubscriptionId { - // Identifies an Android Play Store IAP subscription. - string purchaseToken = 2; - // Identifies an iOS App Store IAP subscription. - uint64 originalTransactionId = 3; - } - } - - bytes profileKey = 1; - optional string username = 2; - UsernameLink usernameLink = 3; - string givenName = 4; - string familyName = 5; - string avatarUrlPath = 6; - SubscriberData donationSubscriberData = 7; - reserved 8; // A deprecated format // backupsSubscriberData - AccountSettings accountSettings = 9; - IAPSubscriberData backupsSubscriberData = 10; - string svrPin = 11; -} - -message Recipient { - uint64 id = 1; // generated id for reference only within this file - // If unset, importers should skip this frame without throwing an error. - oneof destination { - Contact contact = 2; - Group group = 3; - DistributionListItem distributionList = 4; - Self self = 5; - ReleaseNotes releaseNotes = 6; - CallLink callLink = 7; - } -} - -// If unset - computed as the value of the first byte of SHA-256(msg=CONTACT_ID) -// modulo the count of colors. Once set the avatar color for a recipient is -// never recomputed or changed. -// -// `CONTACT_ID` is the first available identifier from the list: -// - ServiceIdToBinary(ACI) -// - E164 -// - ServiceIdToBinary(PNI) -// - Group Id -enum AvatarColor { - A100 = 0; - A110 = 1; - A120 = 2; - A130 = 3; - A140 = 4; - A150 = 5; - A160 = 6; - A170 = 7; - A180 = 8; - A190 = 9; - A200 = 10; - A210 = 11; -} - -message Contact { - enum IdentityState { - DEFAULT = 0; // A valid value -- indicates unset by the user - VERIFIED = 1; - UNVERIFIED = 2; // Was once verified and is now unverified - } - - message Registered {} - message NotRegistered { - uint64 unregisteredTimestamp = 1; - } - - enum Visibility { - VISIBLE = 0; // A valid value -- the contact is not hidden - HIDDEN = 1; - HIDDEN_MESSAGE_REQUEST = 2; - } - - message Name { - string given = 1; - string family = 2; - } - - optional bytes aci = 1; // should be 16 bytes - optional bytes pni = 2; // should be 16 bytes - optional string username = 3; - optional uint64 e164 = 4; - bool blocked = 5; - Visibility visibility = 6; - - // If unset, consider the user to be registered - oneof registration { - Registered registered = 7; - NotRegistered notRegistered = 8; - } - - optional bytes profileKey = 9; - bool profileSharing = 10; - optional string profileGivenName = 11; - optional string profileFamilyName = 12; - bool hideStory = 13; - optional bytes identityKey = 14; - IdentityState identityState = 15; - Name nickname = 16; // absent iff both `given` and `family` are empty - string note = 17; - string systemGivenName = 18; - string systemFamilyName = 19; - string systemNickname = 20; - optional AvatarColor avatarColor = 21; -} - -message Group { - enum StorySendMode { - DEFAULT = 0; // A valid value -- indicates unset by the user - DISABLED = 1; - ENABLED = 2; - } - - bytes masterKey = 1; - bool whitelisted = 2; - bool hideStory = 3; - StorySendMode storySendMode = 4; - GroupSnapshot snapshot = 5; - bool blocked = 6; - optional AvatarColor avatarColor = 7; - - // These are simply plaintext copies of the groups proto from Groups.proto. - // They should be kept completely in-sync with Groups.proto. - // These exist to allow us to have the latest snapshot of a group during restoration without having to hit the network. - // We would use Groups.proto if we could, but we want a plaintext version to improve export readability. - // For documentation, defer to Groups.proto. The only name change is Group -> GroupSnapshot to avoid the naming conflict. - message GroupSnapshot { - reserved 1; // The field is deprecated in the context of static group state // publicKey - GroupAttributeBlob title = 2; - GroupAttributeBlob description = 11; - string avatarUrl = 3; - GroupAttributeBlob disappearingMessagesTimer = 4; - AccessControl accessControl = 5; - uint32 version = 6; - repeated Member members = 7; - repeated MemberPendingProfileKey membersPendingProfileKey = 8; - repeated MemberPendingAdminApproval membersPendingAdminApproval = 9; - bytes inviteLinkPassword = 10; - bool announcements_only = 12; - repeated MemberBanned members_banned = 13; - } - - message GroupAttributeBlob { - // If unset, consider the field it represents to not be present - oneof content { - string title = 1; - bytes avatar = 2; - uint32 disappearingMessagesDuration = 3; - string descriptionText = 4; - } - } - - message Member { - enum Role { - UNKNOWN = 0; // Intepret as "Default" - DEFAULT = 1; - ADMINISTRATOR = 2; - } - - bytes userId = 1; - Role role = 2; - reserved 3; // This field is ignored in Backups, in favor of Contact frames for members // profileKey - reserved 4; // This field is deprecated in the context of static group state // presentation - uint32 joinedAtVersion = 5; - } - - message MemberPendingProfileKey { - Member member = 1; - bytes addedByUserId = 2; - uint64 timestamp = 3; - } - - message MemberPendingAdminApproval { - bytes userId = 1; - reserved 2; // This field is ignored in Backups, in favor of Contact frames for members // profileKey - reserved 3; // This field is deprecated in the context of static group state // presentation - uint64 timestamp = 4; - } - - message MemberBanned { - bytes userId = 1; - uint64 timestamp = 2; - } - - message AccessControl { - enum AccessRequired { - UNKNOWN = 0; // Intepret as "Unsatisfiable" - ANY = 1; - MEMBER = 2; - ADMINISTRATOR = 3; - UNSATISFIABLE = 4; - } - - AccessRequired attributes = 1; - AccessRequired members = 2; - AccessRequired addFromInviteLink = 3; - } -} - -message Self { - optional AvatarColor avatarColor = 1; -} - -message ReleaseNotes {} - -message Chat { - uint64 id = 1; // generated id for reference only within this file - uint64 recipientId = 2; - bool archived = 3; - optional uint32 pinnedOrder = 4; // will be displayed in ascending order - optional uint64 expirationTimerMs = 5; - optional uint64 muteUntilMs = 6; // INT64_MAX (2^63 - 1) = "always muted". - bool markedUnread = 7; - bool dontNotifyForMentionsIfMuted = 8; - ChatStyle style = 9; - uint32 expireTimerVersion = 10; -} - -/** - * Call Links have some associated data including a call, but unlike other recipients - * are not tied to threads because they do not have messages associated with them. - * - * note: - * - room id can be derived from the root key - * - the presence of an admin key means this user is a call admin - */ -message CallLink { - enum Restrictions { - UNKNOWN = 0; // Interpret as "Admin Approval" - NONE = 1; - ADMIN_APPROVAL = 2; - } - - bytes rootKey = 1; - optional bytes adminKey = 2; // Only present if the user is an admin - string name = 3; - Restrictions restrictions = 4; - uint64 expirationMs = 5; -} - -message AdHocCall { - enum State { - UNKNOWN_STATE = 0; // Interpret as "Generic" - GENERIC = 1; - } - - uint64 callId = 1; - // Refers to a `CallLink` recipient. - uint64 recipientId = 2; - State state = 3; - uint64 callTimestamp = 4; -} - -message DistributionListItem { - // distribution ids are UUIDv4s. "My Story" is represented - // by an all-0 UUID (00000000-0000-0000-0000-000000000000). - bytes distributionId = 1; // distribution list ids are uuids - - // If unset, importers should skip the item entirely without showing an error. - oneof item { - uint64 deletionTimestamp = 2; - DistributionList distributionList = 3; - } -} - -message DistributionList { - enum PrivacyMode { - UNKNOWN = 0; // Interpret as "Only with" - ONLY_WITH = 1; - ALL_EXCEPT = 2; - ALL = 3; - } - - string name = 1; - bool allowReplies = 2; - PrivacyMode privacyMode = 3; - repeated uint64 memberRecipientIds = 4; // generated recipient id -} - -message ChatItem { - message IncomingMessageDetails { - uint64 dateReceived = 1; - optional uint64 dateServerSent = 2; - bool read = 3; - bool sealedSender = 4; - } - - message OutgoingMessageDetails { - repeated SendStatus sendStatus = 1; - } - - message DirectionlessMessageDetails { - } - - uint64 chatId = 1; // conversation id - uint64 authorId = 2; // recipient id - uint64 dateSent = 3; - optional uint64 expireStartDate = 4; // timestamp of when expiration timer started ticking down - optional uint64 expiresInMs = 5; // how long timer of message is (ms) - repeated ChatItem revisions = 6; // ordered from oldest to newest - bool sms = 7; - - // If unset, importers should skip this item without throwing an error. - oneof directionalDetails { - IncomingMessageDetails incoming = 8; - OutgoingMessageDetails outgoing = 9; - DirectionlessMessageDetails directionless = 10; - } - - // If unset, importers should skip this item without throwing an error. - oneof item { - StandardMessage standardMessage = 11; - ContactMessage contactMessage = 12; - StickerMessage stickerMessage = 13; - RemoteDeletedMessage remoteDeletedMessage = 14; - ChatUpdateMessage updateMessage = 15; - PaymentNotification paymentNotification = 16; - GiftBadge giftBadge = 17; - ViewOnceMessage viewOnceMessage = 18; - DirectStoryReplyMessage directStoryReplyMessage = 19; // group story reply messages are not backed up - } -} - -message SendStatus { - message Pending {} - - message Sent { - bool sealedSender = 1; - } - - message Delivered { - bool sealedSender = 1; - } - - message Read { - bool sealedSender = 1; - } - - message Viewed { - bool sealedSender = 1; - } - - // e.g. user in group was blocked, so we skipped sending to them - message Skipped {} - - message Failed { - enum FailureReason { - UNKNOWN = 0; // A valid value -- could indicate a crash or lack of information - NETWORK = 1; - IDENTITY_KEY_MISMATCH = 2; - } - - FailureReason reason = 1; - } - - uint64 recipientId = 1; - uint64 timestamp = 2; // the time the status was last updated -- if from a receipt, it should be the sentTime of the receipt - - // If unset, importers should consider the status to be "pending" - oneof deliveryStatus { - Pending pending = 3; - Sent sent = 4; - Delivered delivered = 5; - Read read = 6; - Viewed viewed = 7; - Skipped skipped = 8; - Failed failed = 9; - } -} - -message Text { - string body = 1; - repeated BodyRange bodyRanges = 2; -} - -message StandardMessage { - optional Quote quote = 1; - optional Text text = 2; - repeated MessageAttachment attachments = 3; - repeated LinkPreview linkPreview = 4; - optional FilePointer longText = 5; - repeated Reaction reactions = 6; -} - -message ContactMessage { - ContactAttachment contact = 1; - repeated Reaction reactions = 2; -} - -message DirectStoryReplyMessage { - message TextReply { - Text text = 1; - FilePointer longText = 2; - } - - // If unset, importers should ignore the message without throwing an error. - oneof reply { - TextReply textReply = 1; - string emoji = 2; - } - - repeated Reaction reactions = 3; - reserved 4; // storySentTimestamp -} - -message PaymentNotification { - message TransactionDetails { - message MobileCoinTxoIdentification { // Used to map to payments on the ledger - repeated bytes publicKey = 1; // for received transactions - repeated bytes keyImages = 2; // for sent transactions - } - - message FailedTransaction { // Failed payments can't be synced from the ledger - enum FailureReason { - GENERIC = 0; // A valid value -- reason unknown - NETWORK = 1; - INSUFFICIENT_FUNDS = 2; - } - FailureReason reason = 1; - } - - message Transaction { - enum Status { - INITIAL = 0; // A valid value -- state unconfirmed - SUBMITTED = 1; - SUCCESSFUL = 2; - } - Status status = 1; - - // This identification is used to map the payment table to the ledger - // and is likely required otherwise we may have issues reconciling with - // the ledger - MobileCoinTxoIdentification mobileCoinIdentification = 2; - optional uint64 timestamp = 3; - optional uint64 blockIndex = 4; - optional uint64 blockTimestamp = 5; - optional bytes transaction = 6; // mobile coin blobs - optional bytes receipt = 7; // mobile coin blobs - } - - // If unset, importers should treat the transaction as successful with no metadata. - oneof payment { - Transaction transaction = 1; - FailedTransaction failedTransaction = 2; - } - } - - optional string amountMob = 1; // stored as a decimal string, e.g. 1.00001 - optional string feeMob = 2; // stored as a decimal string, e.g. 1.00001 - optional string note = 3; - TransactionDetails transactionDetails = 4; -} - -message GiftBadge { - enum State { - UNOPENED = 0; // A valid state - OPENED = 1; - REDEEMED = 2; - FAILED = 3; - } - - bytes receiptCredentialPresentation = 1; - State state = 2; -} - -message ViewOnceMessage { - // Will be null for viewed messages - MessageAttachment attachment = 1; - repeated Reaction reactions = 2; -} - -message ContactAttachment { - message Name { - string givenName = 1; - string familyName = 2; - string prefix = 3; - string suffix = 4; - string middleName = 5; - string nickname = 6; - } - - message Phone { - enum Type { - UNKNOWN = 0; // Interpret as "Home" - HOME = 1; - MOBILE = 2; - WORK = 3; - CUSTOM = 4; - } - - string value = 1; - Type type = 2; - string label = 3; - } - - message Email { - enum Type { - UNKNOWN = 0; // Intepret as "Home" - HOME = 1; - MOBILE = 2; - WORK = 3; - CUSTOM = 4; - } - - string value = 1; - Type type = 2; - string label = 3; - } - - message PostalAddress { - enum Type { - UNKNOWN = 0; // Interpret as "Home" - HOME = 1; - WORK = 2; - CUSTOM = 3; - } - - Type type = 1; - string label = 2; - string street = 3; - string pobox = 4; - string neighborhood = 5; - string city = 6; - string region = 7; - string postcode = 8; - string country = 9; - } - - optional Name name = 1; - repeated Phone number = 3; - repeated Email email = 4; - repeated PostalAddress address = 5; - optional FilePointer avatar = 6; - string organization = 7; -} - -message StickerMessage { - Sticker sticker = 1; - repeated Reaction reactions = 2; -} - -// Tombstone for remote delete -message RemoteDeletedMessage {} - -message Sticker { - bytes packId = 1; - bytes packKey = 2; - uint32 stickerId = 3; - optional string emoji = 4; - // Stickers are uploaded to be sent as attachments; we also - // back them up as normal attachments when they are in messages. - // DO NOT treat this as the definitive source of a sticker in - // an installed StickerPack that shares the same packId. - FilePointer data = 5; -} - -message LinkPreview { - string url = 1; - optional string title = 2; - optional FilePointer image = 3; - optional string description = 4; - optional uint64 date = 5; -} - -// A FilePointer on a message that has additional -// metadata that applies only to message attachments. -message MessageAttachment { - // Similar to SignalService.AttachmentPointer.Flags, - // but explicitly mutually exclusive. Note the different raw values - // (non-zero starting values are not supported in proto3.) - enum Flag { - NONE = 0; // A valid value -- no flag applied - VOICE_MESSAGE = 1; - BORDERLESS = 2; - GIF = 3; - } - - FilePointer pointer = 1; - Flag flag = 2; - bool wasDownloaded = 3; - // Cross-client identifier for this attachment among all attachments on the - // owning message. See: SignalService.AttachmentPointer.clientUuid. - optional bytes clientUuid = 4; -} - -message FilePointer { - // References attachments in the backup (media) storage tier. - message BackupLocator { - string mediaName = 1; - // If present, the cdn number of the succesful upload. - // If empty/0, may still have been uploaded, and clients - // can discover the cdn number via the list endpoint. - optional uint32 cdnNumber = 2; - bytes key = 3; - bytes digest = 4; - uint32 size = 5; - // Fallback in case backup tier upload failed. - optional string transitCdnKey = 6; - optional uint32 transitCdnNumber = 7; - } - - // References attachments in the transit storage tier. - // May be downloaded or not when the backup is generated; - // primarily for free-tier users who cannot copy the - // attachments to the backup (media) storage tier. - message AttachmentLocator { - string cdnKey = 1; - uint32 cdnNumber = 2; - optional uint64 uploadTimestamp = 3; - bytes key = 4; - bytes digest = 5; - uint32 size = 6; - } - - // References attachments that are invalid in such a way where download - // cannot be attempted. Could range from missing digests to missing - // CDN keys or anything else that makes download attempts impossible. - // This serves as a 'tombstone' so that the UX can show that an attachment - // did exist, but for whatever reason it's not retrievable. - message InvalidAttachmentLocator { - } - - // If unset, importers should consider it to be an InvalidAttachmentLocator without throwing an error. - oneof locator { - BackupLocator backupLocator = 1; - AttachmentLocator attachmentLocator = 2; - InvalidAttachmentLocator invalidAttachmentLocator = 3; - } - - optional string contentType = 4; - optional bytes incrementalMac = 5; - optional uint32 incrementalMacChunkSize = 6; - optional string fileName = 7; - optional uint32 width = 8; - optional uint32 height = 9; - optional string caption = 10; - optional string blurHash = 11; -} - -message Quote { - enum Type { - UNKNOWN = 0; // Interpret as "Normal" - NORMAL = 1; - GIFT_BADGE = 2; - VIEW_ONCE = 3; - } - - message QuotedAttachment { - optional string contentType = 1; - optional string fileName = 2; - optional MessageAttachment thumbnail = 3; - } - - optional uint64 targetSentTimestamp = 1; // null if the target message could not be found at time of quote insert - uint64 authorId = 2; - optional Text text = 3; - repeated QuotedAttachment attachments = 4; - Type type = 5; -} - -message BodyRange { - enum Style { - NONE = 0; // Importers should ignore the body range without throwing an error. - BOLD = 1; - ITALIC = 2; - SPOILER = 3; - STRIKETHROUGH = 4; - MONOSPACE = 5; - } - - // 'start' and 'length' are measured in UTF-16 code units. - // They may refer to offsets in a longText attachment. - uint32 start = 1; - uint32 length = 2; - - // If unset, importers should ignore the body range without throwing an error. - oneof associatedValue { - bytes mentionAci = 3; - Style style = 4; - } -} - -message Reaction { - string emoji = 1; - uint64 authorId = 2; - uint64 sentTimestamp = 3; - // A higher sort order means that a reaction is more recent. Some clients may export this as - // incrementing numbers (e.g. 1, 2, 3), others as timestamps. - uint64 sortOrder = 4; -} - -message ChatUpdateMessage { - // If unset, importers should ignore the update message without throwing an error. - oneof update { - SimpleChatUpdate simpleUpdate = 1; - GroupChangeChatUpdate groupChange = 2; - ExpirationTimerChatUpdate expirationTimerChange = 3; - ProfileChangeChatUpdate profileChange = 4; - ThreadMergeChatUpdate threadMerge = 5; - SessionSwitchoverChatUpdate sessionSwitchover = 6; - IndividualCall individualCall = 7; - GroupCall groupCall = 8; - LearnedProfileChatUpdate learnedProfileChange = 9; - } -} - -message IndividualCall { - enum Type { - UNKNOWN_TYPE = 0; // Interpret as "Audio call" - AUDIO_CALL = 1; - VIDEO_CALL = 2; - } - - enum Direction { - UNKNOWN_DIRECTION = 0; // Interpret as "Incoming" - INCOMING = 1; - OUTGOING = 2; - } - - enum State { - UNKNOWN_STATE = 0; // Interpret as "Accepted" - ACCEPTED = 1; - NOT_ACCEPTED = 2; - // An incoming call that is no longer ongoing, which we neither accepted - // not actively declined. For example, it expired, was canceled by the - // sender, or was rejected due to being in another call. - MISSED = 3; - // We auto-declined an incoming call due to a notification profile. - MISSED_NOTIFICATION_PROFILE = 4; - } - - optional uint64 callId = 1; - Type type = 2; - Direction direction = 3; - State state = 4; - uint64 startedCallTimestamp = 5; - bool read = 6; -} - -message GroupCall { - enum State { - UNKNOWN_STATE = 0; // Interpret as "Generic" - // A group call was started without ringing. - GENERIC = 1; - // We joined a group call that was started without ringing. - JOINED = 2; - // An incoming group call is actively ringing. - RINGING = 3; - // We accepted an incoming group ring. - ACCEPTED = 4; - // We declined an incoming group ring. - DECLINED = 5; - // We missed an incoming group ring, for example because it expired. - MISSED = 6; - // We auto-declined an incoming group ring due to a notification profile. - MISSED_NOTIFICATION_PROFILE = 7; - // An outgoing ring was started. We don't track any state for outgoing rings - // beyond that they started. - OUTGOING_RING = 8; - } - - optional uint64 callId = 1; - State state = 2; - optional uint64 ringerRecipientId = 3; - optional uint64 startedCallRecipientId = 4; - uint64 startedCallTimestamp = 5; - optional uint64 endedCallTimestamp = 6; // The time the call ended. - bool read = 7; -} - -message SimpleChatUpdate { - enum Type { - UNKNOWN = 0; // Importers should skip the update without throwing an error. - JOINED_SIGNAL = 1; - IDENTITY_UPDATE = 2; - IDENTITY_VERIFIED = 3; - IDENTITY_DEFAULT = 4; // marking as unverified - CHANGE_NUMBER = 5; - RELEASE_CHANNEL_DONATION_REQUEST = 6; - END_SESSION = 7; - CHAT_SESSION_REFRESH = 8; - BAD_DECRYPT = 9; - PAYMENTS_ACTIVATED = 10; - PAYMENT_ACTIVATION_REQUEST = 11; - UNSUPPORTED_PROTOCOL_MESSAGE = 12; - REPORTED_SPAM = 13; - BLOCKED = 14; - UNBLOCKED = 15; - MESSAGE_REQUEST_ACCEPTED = 16; - } - - Type type = 1; -} - -// For 1:1 chat updates only. -// For group thread updates use GroupExpirationTimerUpdate. -message ExpirationTimerChatUpdate { - uint64 expiresInMs = 1; // 0 means the expiration timer was disabled -} - -message ProfileChangeChatUpdate { - string previousName = 1; - string newName = 2; -} - -message LearnedProfileChatUpdate { - // If unset, importers should consider the previous name to be an empty string. - oneof previousName { - uint64 e164 = 1; - string username = 2; - } -} - -message ThreadMergeChatUpdate { - uint64 previousE164 = 1; -} - -message SessionSwitchoverChatUpdate { - uint64 e164 = 1; -} - -message GroupChangeChatUpdate { - message Update { - // If unset, importers should consider it to be a GenericGroupUpdate with unset updaterAci - oneof update { - GenericGroupUpdate genericGroupUpdate = 1; - GroupCreationUpdate groupCreationUpdate = 2; - GroupNameUpdate groupNameUpdate = 3; - GroupAvatarUpdate groupAvatarUpdate = 4; - GroupDescriptionUpdate groupDescriptionUpdate = 5; - GroupMembershipAccessLevelChangeUpdate groupMembershipAccessLevelChangeUpdate = 6; - GroupAttributesAccessLevelChangeUpdate groupAttributesAccessLevelChangeUpdate = 7; - GroupAnnouncementOnlyChangeUpdate groupAnnouncementOnlyChangeUpdate = 8; - GroupAdminStatusUpdate groupAdminStatusUpdate = 9; - GroupMemberLeftUpdate groupMemberLeftUpdate = 10; - GroupMemberRemovedUpdate groupMemberRemovedUpdate = 11; - SelfInvitedToGroupUpdate selfInvitedToGroupUpdate = 12; - SelfInvitedOtherUserToGroupUpdate selfInvitedOtherUserToGroupUpdate = 13; - GroupUnknownInviteeUpdate groupUnknownInviteeUpdate = 14; - GroupInvitationAcceptedUpdate groupInvitationAcceptedUpdate = 15; - GroupInvitationDeclinedUpdate groupInvitationDeclinedUpdate = 16; - GroupMemberJoinedUpdate groupMemberJoinedUpdate = 17; - GroupMemberAddedUpdate groupMemberAddedUpdate = 18; - GroupSelfInvitationRevokedUpdate groupSelfInvitationRevokedUpdate = 19; - GroupInvitationRevokedUpdate groupInvitationRevokedUpdate = 20; - GroupJoinRequestUpdate groupJoinRequestUpdate = 21; - GroupJoinRequestApprovalUpdate groupJoinRequestApprovalUpdate = 22; - GroupJoinRequestCanceledUpdate groupJoinRequestCanceledUpdate = 23; - GroupInviteLinkResetUpdate groupInviteLinkResetUpdate = 24; - GroupInviteLinkEnabledUpdate groupInviteLinkEnabledUpdate = 25; - GroupInviteLinkAdminApprovalUpdate groupInviteLinkAdminApprovalUpdate = 26; - GroupInviteLinkDisabledUpdate groupInviteLinkDisabledUpdate = 27; - GroupMemberJoinedByLinkUpdate groupMemberJoinedByLinkUpdate = 28; - GroupV2MigrationUpdate groupV2MigrationUpdate = 29; - GroupV2MigrationSelfInvitedUpdate groupV2MigrationSelfInvitedUpdate = 30; - GroupV2MigrationInvitedMembersUpdate groupV2MigrationInvitedMembersUpdate = 31; - GroupV2MigrationDroppedMembersUpdate groupV2MigrationDroppedMembersUpdate = 32; - GroupSequenceOfRequestsAndCancelsUpdate groupSequenceOfRequestsAndCancelsUpdate = 33; - GroupExpirationTimerUpdate groupExpirationTimerUpdate = 34; - } - } - - // Must be one or more; all updates batched together came from - // a single batched group state update. - repeated Update updates = 1; -} - -message GenericGroupUpdate { - optional bytes updaterAci = 1; -} - -message GroupCreationUpdate { - optional bytes updaterAci = 1; -} - -message GroupNameUpdate { - optional bytes updaterAci = 1; - // Null value means the group name was removed. - optional string newGroupName = 2; -} - -message GroupAvatarUpdate { - optional bytes updaterAci = 1; - bool wasRemoved = 2; -} - -message GroupDescriptionUpdate { - optional bytes updaterAci = 1; - // Null value means the group description was removed. - optional string newDescription = 2; -} - -enum GroupV2AccessLevel { - UNKNOWN = 0; // Interpret as "Unsatisfiable" - ANY = 1; - MEMBER = 2; - ADMINISTRATOR = 3; - UNSATISFIABLE = 4; -} - -message GroupMembershipAccessLevelChangeUpdate { - optional bytes updaterAci = 1; - GroupV2AccessLevel accessLevel = 2; -} - -message GroupAttributesAccessLevelChangeUpdate { - optional bytes updaterAci = 1; - GroupV2AccessLevel accessLevel = 2; -} - -message GroupAnnouncementOnlyChangeUpdate { - optional bytes updaterAci = 1; - bool isAnnouncementOnly = 2; -} - -message GroupAdminStatusUpdate { - optional bytes updaterAci = 1; - // The aci who had admin status granted or revoked. - bytes memberAci = 2; - bool wasAdminStatusGranted = 3; -} - -message GroupMemberLeftUpdate { - bytes aci = 1; -} - -message GroupMemberRemovedUpdate { - optional bytes removerAci = 1; - bytes removedAci = 2; -} - -message SelfInvitedToGroupUpdate { - optional bytes inviterAci = 1; -} - -message SelfInvitedOtherUserToGroupUpdate { - // If no invitee id available, use GroupUnknownInviteeUpdate - bytes inviteeServiceId = 1; -} - -message GroupUnknownInviteeUpdate { - // Can be the self user. - optional bytes inviterAci = 1; - uint32 inviteeCount = 2; -} - -message GroupInvitationAcceptedUpdate { - optional bytes inviterAci = 1; - bytes newMemberAci = 2; -} - -message GroupInvitationDeclinedUpdate { - optional bytes inviterAci = 1; - // Note: if invited by pni, just set inviteeAci to nil. - optional bytes inviteeAci = 2; -} - -message GroupMemberJoinedUpdate { - bytes newMemberAci = 1; -} - -message GroupMemberAddedUpdate { - optional bytes updaterAci = 1; - bytes newMemberAci = 2; - bool hadOpenInvitation = 3; - // If hadOpenInvitation is true, optionally include aci of the inviter. - optional bytes inviterAci = 4; -} - -// An invitation to self was revoked. -message GroupSelfInvitationRevokedUpdate { - optional bytes revokerAci = 1; -} - -// These invitees should never be the local user. -// Use GroupSelfInvitationRevokedUpdate in those cases. -// The inviter or updater can be the local user. -message GroupInvitationRevokedUpdate { - message Invitee { - optional bytes inviterAci = 1; - // Prefer to use aci over pni. No need to set - // pni if aci is set. Both can be missing. - optional bytes inviteeAci = 2; - optional bytes inviteePni = 3; - } - - // The member that revoked the invite(s), not the inviter! - // Assumed to be an admin (at the time, may no longer be an - // admin or even a member). - optional bytes updaterAci = 1; - repeated Invitee invitees = 2; -} - -message GroupJoinRequestUpdate { - bytes requestorAci = 1; -} - -message GroupJoinRequestApprovalUpdate { - bytes requestorAci = 1; - // The aci that approved or rejected the request. - optional bytes updaterAci = 2; - bool wasApproved = 3; -} - -message GroupJoinRequestCanceledUpdate { - bytes requestorAci = 1; -} - -// A single requestor has requested to join and cancelled -// their request repeatedly with no other updates in between. -// The last action encompassed by this update is always a -// cancellation; if there was another open request immediately -// after, it will be a separate GroupJoinRequestUpdate, either -// in the same frame or in a subsequent frame. -message GroupSequenceOfRequestsAndCancelsUpdate { - bytes requestorAci = 1; - uint32 count = 2; -} - -message GroupInviteLinkResetUpdate { - optional bytes updaterAci = 1; -} - -message GroupInviteLinkEnabledUpdate { - optional bytes updaterAci = 1; - bool linkRequiresAdminApproval = 2; -} - -message GroupInviteLinkAdminApprovalUpdate { - optional bytes updaterAci = 1; - bool linkRequiresAdminApproval = 2; -} - -message GroupInviteLinkDisabledUpdate { - optional bytes updaterAci = 1; -} - -message GroupMemberJoinedByLinkUpdate { - bytes newMemberAci = 1; -} - -// A gv1->gv2 migration occurred. -message GroupV2MigrationUpdate {} - -// Another user migrated gv1->gv2 but was unable to add -// the local user and invited them instead. -message GroupV2MigrationSelfInvitedUpdate {} - -// The local user migrated gv1->gv2 but was unable to -// add some members and invited them instead. -// (Happens if we don't have the invitee's profile key) -message GroupV2MigrationInvitedMembersUpdate { - uint32 invitedMembersCount = 1; -} - -// The local user migrated gv1->gv2 but was unable to -// add or invite some members and dropped them instead. -// (Happens for e164 members where we don't have an aci). -message GroupV2MigrationDroppedMembersUpdate { - uint32 droppedMembersCount = 1; -} - -// For 1:1 timer updates, use ExpirationTimerChatUpdate. -message GroupExpirationTimerUpdate { - uint64 expiresInMs = 1; // 0 means the expiration timer was disabled - optional bytes updaterAci = 2; -} - -message StickerPack { - bytes packId = 1; - bytes packKey = 2; -} - -message ChatStyle { - message Gradient { - uint32 angle = 1; // degrees - repeated fixed32 colors = 2; // 0xAARRGGBB - repeated float positions = 3; // percent from 0 to 1 - } - - message CustomChatColor { - uint64 id = 1; - - // If unset, use the default chat color - oneof color { - fixed32 solid = 2; // 0xAARRGGBB - Gradient gradient = 3; - } - } - - message AutomaticBubbleColor { - } - - enum WallpaperPreset { - UNKNOWN_WALLPAPER_PRESET = 0; // Interpret as the wallpaper being unset - SOLID_BLUSH = 1; - SOLID_COPPER = 2; - SOLID_DUST = 3; - SOLID_CELADON = 4; - SOLID_RAINFOREST = 5; - SOLID_PACIFIC = 6; - SOLID_FROST = 7; - SOLID_NAVY = 8; - SOLID_LILAC = 9; - SOLID_PINK = 10; - SOLID_EGGPLANT = 11; - SOLID_SILVER = 12; - GRADIENT_SUNSET = 13; - GRADIENT_NOIR = 14; - GRADIENT_HEATMAP = 15; - GRADIENT_AQUA = 16; - GRADIENT_IRIDESCENT = 17; - GRADIENT_MONSTERA = 18; - GRADIENT_BLISS = 19; - GRADIENT_SKY = 20; - GRADIENT_PEACH = 21; - } - - enum BubbleColorPreset { - UNKNOWN_BUBBLE_COLOR_PRESET = 0; // Interpret as the user's default chat bubble color - SOLID_ULTRAMARINE = 1; - SOLID_CRIMSON = 2; - SOLID_VERMILION = 3; - SOLID_BURLAP = 4; - SOLID_FOREST = 5; - SOLID_WINTERGREEN = 6; - SOLID_TEAL = 7; - SOLID_BLUE = 8; - SOLID_INDIGO = 9; - SOLID_VIOLET = 10; - SOLID_PLUM = 11; - SOLID_TAUPE = 12; - SOLID_STEEL = 13; - GRADIENT_EMBER = 14; - GRADIENT_MIDNIGHT = 15; - GRADIENT_INFRARED = 16; - GRADIENT_LAGOON = 17; - GRADIENT_FLUORESCENT = 18; - GRADIENT_BASIL = 19; - GRADIENT_SUBLIME = 20; - GRADIENT_SEA = 21; - GRADIENT_TANGERINE = 22; - } - - // If unset, importers should consider there to be no wallpaper. - oneof wallpaper { - WallpaperPreset wallpaperPreset = 1; - // This `FilePointer` is expected not to contain a `fileName`, `width`, - // `height`, or `caption`. - FilePointer wallpaperPhoto = 2; - } - - // If unset, importers should consider it to be AutomaticBubbleColor - oneof bubbleColor { - // Bubble setting is automatically determined based on the wallpaper setting, - // or `SOLID_ULTRAMARINE` for `noWallpaper` - AutomaticBubbleColor autoBubbleColor = 3; - BubbleColorPreset bubbleColorPreset = 4; - - // See AccountSettings.customChatColors - uint64 customColorId = 5; - } - - bool dimWallpaperInDarkMode = 7; -} - -message NotificationProfile { - enum DayOfWeek { - UNKNOWN = 0; // Interpret as "Monday" - MONDAY = 1; - TUESDAY = 2; - WEDNESDAY = 3; - THURSDAY = 4; - FRIDAY = 5; - SATURDAY = 6; - SUNDAY = 7; - } - - string name = 1; - optional string emoji = 2; - fixed32 color = 3; // 0xAARRGGBB - uint64 createdAtMs = 4; - bool allowAllCalls = 5; - bool allowAllMentions = 6; - repeated uint64 allowedMembers = 7; // generated recipient id for allowed groups and contacts - bool scheduleEnabled = 8; - uint32 scheduleStartTime = 9; // 24-hour clock int, 0000-2359 (e.g., 15, 900, 1130, 2345) - uint32 scheduleEndTime = 10; // 24-hour clock int, 0000-2359 (e.g., 15, 900, 1130, 2345) - repeated DayOfWeek scheduleDaysEnabled = 11; -} - -message ChatFolder { - // Represents the default "All chats" folder record vs all other custom folders - enum FolderType { - UNKNOWN = 0; // Interpret as "Custom" - ALL = 1; - CUSTOM = 2; - } - - string name = 1; - bool showOnlyUnread = 2; - bool showMutedChats = 3; - // Folder includes all 1:1 chats, unless excluded - bool includeAllIndividualChats = 4; - // Folder includes all group chats, unless excluded - bool includeAllGroupChats = 5; - FolderType folderType = 6; - repeated uint64 includedRecipientIds = 7; // generated recipient id of groups, contacts, and/or note to self - repeated uint64 excludedRecipientIds = 8; // generated recipient id of groups, contacts, and/or note to self -} |
