syntax = "proto2"; package signalservice; option java_package = "org.session.libsignal.protos"; option java_outer_classname = "SignalServiceProtos"; message Envelope { enum Type { SESSION_MESSAGE = 6; CLOSED_GROUP_MESSAGE = 7; } // @required required Type type = 1; optional string source = 2; optional uint32 sourceDevice = 7; // @required required uint64 timestamp = 5; optional bytes content = 8; optional uint64 serverTimestamp = 10; } message TypingMessage { enum Action { STARTED = 0; STOPPED = 1; } // @required required uint64 timestamp = 1; // @required required Action action = 2; } message UnsendRequest { // @required required uint64 timestamp = 1; // @required required string author = 2; } message Content { enum ExpirationType { UNKNOWN = 0; DELETE_AFTER_READ = 1; DELETE_AFTER_SEND = 2; } optional DataMessage dataMessage = 1; optional CallMessage callMessage = 3; optional ReceiptMessage receiptMessage = 5; optional TypingMessage typingMessage = 6; optional ConfigurationMessage configurationMessage = 7; optional DataExtractionNotification dataExtractionNotification = 8; optional UnsendRequest unsendRequest = 9; optional MessageRequestResponse messageRequestResponse = 10; optional SharedConfigMessage sharedConfigMessage = 11; optional ExpirationType expirationType = 12; optional uint32 expirationTimer = 13; optional uint64 lastDisappearingMessageChangeTimestamp = 14; } message KeyPair { // @required required bytes publicKey = 1; // @required required bytes privateKey = 2; } message DataExtractionNotification { enum Type { SCREENSHOT = 1; MEDIA_SAVED = 2; // timestamp } // @required required Type type = 1; optional uint64 timestamp = 2; } message DataMessage { enum Flags { EXPIRATION_TIMER_UPDATE = 2; } message Quote { message QuotedAttachment { enum Flags { VOICE_MESSAGE = 1; } optional string contentType = 1; optional string fileName = 2; optional AttachmentPointer thumbnail = 3; optional uint32 flags = 4; } // @required required uint64 id = 1; // @required required string author = 2; optional string text = 3; repeated QuotedAttachment attachments = 4; } message Preview { // @required required string url = 1; optional string title = 2; optional AttachmentPointer image = 3; } message LokiProfile { optional string displayName = 1; optional string profilePicture = 2; } message OpenGroupInvitation { // @required required string url = 1; // @required required string name = 3; } // New closed group update messages message GroupUpdateMessage { optional GroupUpdateInviteMessage inviteMessage = 1; optional GroupUpdateInfoChangeMessage infoChangeMessage = 2; optional GroupUpdateMemberChangeMessage memberChangeMessage = 3; optional GroupUpdatePromoteMessage promoteMessage = 4; optional GroupUpdateMemberLeftMessage memberLeftMessage = 5; optional GroupUpdateInviteResponseMessage inviteResponse = 6; optional GroupUpdateDeleteMemberContentMessage deleteMemberContent = 7; optional GroupUpdateMemberLeftNotificationMessage memberLeftNotificationMessage = 8; } // New closed groups message GroupUpdateInviteMessage { // @required required string groupSessionId = 1; // The `groupIdentityPublicKey` with a `03` prefix // @required required string name = 2; // @required required bytes memberAuthData = 3; // @required required bytes adminSignature = 4; } message GroupUpdateDeleteMessage { repeated string memberSessionIds = 1; // @required // signature of "DELETE" || timestamp || sessionId[0] || ... || sessionId[n] required bytes adminSignature = 2; } message GroupUpdatePromoteMessage { // @required required bytes groupIdentitySeed = 1; // @required required string name = 2; } message GroupUpdateInfoChangeMessage { enum Type { NAME = 1; AVATAR = 2; DISAPPEARING_MESSAGES = 3; } // @required required Type type = 1; optional string updatedName = 2; optional uint32 updatedExpiration = 3; // @required // "INFO_CHANGE" || type || timestamp required bytes adminSignature = 4; } message GroupUpdateMemberChangeMessage { enum Type { ADDED = 1; REMOVED = 2; PROMOTED = 3; } // @required required Type type = 1; repeated string memberSessionIds = 2; optional bool historyShared = 3; // @required // "MEMBER_CHANGE" || type || timestamp required bytes adminSignature = 4; } message GroupUpdateMemberLeftMessage { // the pubkey of the member left is included as part of the closed group encryption logic (senderIdentity on desktop) } message GroupUpdateInviteResponseMessage { // @required required bool isApproved = 1; // Whether the request was approved } message GroupUpdateDeleteMemberContentMessage { repeated string memberSessionIds = 1; repeated string messageHashes = 2; optional bytes adminSignature = 3; } message GroupUpdateMemberLeftNotificationMessage { // the pubkey of the member left is included as part of the closed group encryption logic (senderIdentity on desktop) } message ClosedGroupControlMessage { enum Type { NEW = 1; // publicKey, name, encryptionKeyPair, members, admins, expireTimer ENCRYPTION_KEY_PAIR = 3; // publicKey, wrappers NAME_CHANGE = 4; // name MEMBERS_ADDED = 5; // members MEMBERS_REMOVED = 6; // members MEMBER_LEFT = 7; INVITE = 9; // publicKey, name, memberPrivateKey PROMOTE = 10; // publicKey, privateKey DELETE_GROUP = 11; // publicKey, members DELETE_MESSAGES = 12; // publicKey DELETE_ATTACHMENTS = 13; // publicKey } message KeyPairWrapper { // @required required bytes publicKey = 1; // The public key of the user the key pair is meant for // @required required bytes encryptedKeyPair = 2; // The encrypted key pair } // @required required Type type = 1; optional bytes publicKey = 2; optional string name = 3; optional KeyPair encryptionKeyPair = 4; repeated bytes members = 5; repeated bytes admins = 6; repeated KeyPairWrapper wrappers = 7; optional uint32 expirationTimer = 8; optional bytes memberPrivateKey = 9; optional bytes privateKey = 10; } message Reaction { enum Action { REACT = 0; REMOVE = 1; } // @required required uint64 id = 1; // @required required string author = 2; optional string emoji = 3; // @required required Action action = 4; } optional string body = 1; repeated AttachmentPointer attachments = 2; optional uint32 flags = 4; optional uint32 expireTimer = 5; optional bytes profileKey = 6; optional uint64 timestamp = 7; optional Quote quote = 8; repeated Preview preview = 10; optional Reaction reaction = 11; optional LokiProfile profile = 101; optional OpenGroupInvitation openGroupInvitation = 102; optional ClosedGroupControlMessage closedGroupControlMessage = 104; optional string syncTarget = 105; optional bool blocksCommunityMessageRequests = 106; optional GroupUpdateMessage groupUpdateMessage = 120; } message GroupDeleteMessage { // @required required bytes publicKey = 1; // the identity public key of the group to be deleted // @required required bytes lastEncryptionKey = 2; // used by members to make sure incoming admin action can be trusted } message GroupMemberLeftMessage { // the pubkey of the member left is included as part of the closed group encryption logic (senderIdentity on desktop) } message GroupInviteMessage { // @required required bytes publicKey = 1; // this is the group public key // @required required string name = 2; // @required required bytes memberPrivateKey = 3; } message GroupPromoteMessage { // @required required bytes publicKey = 1; // this is the session id for the user that should be promoted // @required required bytes encryptedPrivateKey = 2; // this is the group admins key } message CallMessage { enum Type { PRE_OFFER = 6; OFFER = 1; ANSWER = 2; PROVISIONAL_ANSWER = 3; ICE_CANDIDATES = 4; END_CALL = 5; } // Multiple ICE candidates may be batched together for performance // @required required Type type = 1; repeated string sdps = 2; repeated uint32 sdpMLineIndexes = 3; repeated string sdpMids = 4; // @required required string uuid = 5; } message ConfigurationMessage { message ClosedGroup { optional bytes publicKey = 1; optional string name = 2; optional KeyPair encryptionKeyPair = 3; repeated bytes members = 4; repeated bytes admins = 5; optional uint32 expirationTimer = 6; } message Contact { // @required required bytes publicKey = 1; // @required required string name = 2; optional string profilePicture = 3; optional bytes profileKey = 4; optional bool isApproved = 5; optional bool isBlocked = 6; optional bool didApproveMe = 7; } repeated ClosedGroup closedGroups = 1; repeated string openGroups = 2; optional string displayName = 3; optional string profilePicture = 4; optional bytes profileKey = 5; repeated Contact contacts = 6; } message MessageRequestResponse { // @required required bool isApproved = 1; optional bytes profileKey = 2; optional DataMessage.LokiProfile profile = 3; } message SharedConfigMessage { enum Kind { USER_PROFILE = 1; CONTACTS = 2; CONVO_INFO_VOLATILE = 3; GROUPS = 4; CLOSED_GROUP_INFO = 5; CLOSED_GROUP_MEMBERS = 6; ENCRYPTION_KEYS = 7; } // @required required Kind kind = 1; // @required required int64 seqno = 2; // @required required bytes data = 3; } message ReceiptMessage { enum Type { DELIVERY = 0; READ = 1; } // @required required Type type = 1; repeated uint64 timestamp = 2; } message AttachmentPointer { enum Flags { VOICE_MESSAGE = 1; } // @required required fixed64 id = 1; optional string contentType = 2; optional bytes key = 3; optional uint32 size = 4; optional bytes thumbnail = 5; optional bytes digest = 6; optional string fileName = 7; optional uint32 flags = 8; optional uint32 width = 9; optional uint32 height = 10; optional string caption = 11; optional string url = 101; }