From 01d1472750150a53440551f0c0503dfbf31b323a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 30 Sep 2025 15:36:25 +0300 Subject: [PATCH 001/170] libsignal: update to v0.82.0 --- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 2 +- pkg/libsignalgo/version.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index 43a23ef..42ff946 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit 43a23efa1118ac32a1434ab317025adfa2b91e4a +Subproject commit 42ff946228be177c33c147359178455b411d3628 diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index ead3cb4..0111718 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -866,7 +866,7 @@ typedef struct { typedef int (*SignalStoreKyberPreKey)(void *store_ctx, uint32_t id, SignalConstPointerKyberPreKeyRecord record); -typedef int (*SignalMarkKyberPreKeyUsed)(void *store_ctx, uint32_t id); +typedef int (*SignalMarkKyberPreKeyUsed)(void *store_ctx, uint32_t id, uint32_t signed_prekey_id, SignalConstPointerPublicKey base_key); typedef struct { void *ctx; diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index 334f82a..b137e61 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.80.3" +const Version = "v0.82.0" From 527cd4ec0be42dd2d57a0af50556dc1573da3583 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 30 Sep 2025 16:14:13 +0300 Subject: [PATCH 002/170] signalmeow/groups: update to v2 api --- pkg/signalmeow/groups.go | 83 ++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index 865de3f..de6e054 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -192,7 +192,7 @@ type GroupChange struct { ModifyInviteLinkPassword *types.SerializedInviteLinkPassword } -func (groupChange *GroupChange) isEmptpy() bool { +func (groupChange *GroupChange) isEmpty() bool { return len(groupChange.AddMembers) == 0 && len(groupChange.DeleteMembers) == 0 && len(groupChange.ModifyMemberRoles) == 0 && @@ -638,6 +638,7 @@ func (cli *Client) fetchGroupByID(ctx context.Context, gid types.GroupIdentifier } return cli.fetchGroupWithMasterKey(ctx, groupMasterKey) } + func (cli *Client) fetchGroupWithMasterKey(ctx context.Context, groupMasterKey types.SerializedGroupMasterKey) (*Group, error) { masterKeyBytes := masterKeyToBytes(groupMasterKey) groupAuth, err := cli.GetAuthorizationForToday(ctx, masterKeyBytes) @@ -650,24 +651,28 @@ func (cli *Client) fetchGroupWithMasterKey(ctx context.Context, groupMasterKey t ContentType: web.ContentTypeProtobuf, Host: web.StorageHostname, } - response, err := web.SendHTTPRequest(ctx, http.MethodGet, "/v1/groups", opts) + response, err := web.SendHTTPRequest(ctx, http.MethodGet, "/v2/groups", opts) if err != nil { return nil, err } if response.StatusCode != 200 { return nil, fmt.Errorf("fetchGroupByID SendHTTPRequest bad status: %d", response.StatusCode) } - var encryptedGroup signalpb.Group + return cli.parseGroupResponse(ctx, response, groupMasterKey) +} + +func (cli *Client) parseGroupResponse(ctx context.Context, response *http.Response, masterKey types.SerializedGroupMasterKey) (*Group, error) { + var groupResponse signalpb.GroupResponse groupBytes, err := io.ReadAll(response.Body) if err != nil { return nil, err } - err = proto.Unmarshal(groupBytes, &encryptedGroup) + err = proto.Unmarshal(groupBytes, &groupResponse) if err != nil { return nil, fmt.Errorf("failed to unmarshal group: %w", err) } - group, err := decryptGroup(ctx, &encryptedGroup, groupMasterKey) + group, err := decryptGroup(ctx, groupResponse.Group, masterKey) if err != nil { return nil, fmt.Errorf("failed to decrypt group: %w", err) } @@ -1196,7 +1201,7 @@ func decryptRequestingMember(ctx context.Context, requestingMember *signalpb.Req }, nil } -func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroupChange *GroupChange, gid types.GroupIdentifier) (*signalpb.GroupChange, error) { +func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroupChange *GroupChange) (*signalpb.GroupChangeResponse, error) { log := zerolog.Ctx(ctx).With().Str("action", "EncryptGroupChange").Logger() groupMasterKey := decryptedGroupChange.GroupMasterKey masterKeyBytes := masterKeyToBytes(groupMasterKey) @@ -1479,7 +1484,7 @@ func (e RespError) Error() string { return e.Err } -func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupChange_Actions, groupMasterKey types.SerializedGroupMasterKey, groupLinkPassword []byte) (*signalpb.GroupChange, error) { +func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupChange_Actions, groupMasterKey types.SerializedGroupMasterKey, groupLinkPassword []byte) (*signalpb.GroupChangeResponse, error) { log := zerolog.Ctx(ctx).With().Str("action", "patchGroup").Logger() groupAuth, err := cli.GetAuthorizationForToday(ctx, masterKeyToBytes(groupMasterKey)) if err != nil { @@ -1488,9 +1493,9 @@ func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupCh } var path string if groupLinkPassword == nil { - path = "/v1/groups/" + path = "/v2/groups/" } else { - path = fmt.Sprintf("/v1/groups/?inviteLinkPassword=%s", base64.StdEncoding.EncodeToString(groupLinkPassword)) + path = fmt.Sprintf("/v2/groups/?inviteLinkPassword=%s", base64.StdEncoding.EncodeToString(groupLinkPassword)) } requestBody, err := proto.Marshal(groupChange) if err != nil { @@ -1535,70 +1540,78 @@ func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupCh if err != nil { return nil, fmt.Errorf("failed to read storage manifest response: %w", err) } - signedGroupChange := signalpb.GroupChange{} - err = proto.Unmarshal(body, &signedGroupChange) + var changeResp signalpb.GroupChangeResponse + err = proto.Unmarshal(body, &changeResp) if err != nil { return nil, fmt.Errorf("failed to unmarshal signed groupChange: %w", err) } - return &signedGroupChange, nil + return &changeResp, nil } func (cli *Client) UpdateGroup(ctx context.Context, groupChange *GroupChange, gid types.GroupIdentifier) (uint32, error) { log := zerolog.Ctx(ctx).With().Str("action", "UpdateGroup").Logger() groupMasterKey, err := cli.Store.GroupStore.MasterKeyFromGroupIdentifier(ctx, gid) if err != nil { - log.Err(err).Msg("Could not get master key from group id") - return 0, err + return 0, fmt.Errorf("failed to get master key for group: %w", err) } groupChange.GroupMasterKey = groupMasterKey masterKeyBytes := masterKeyToBytes(groupMasterKey) var refetchedAddMemberCredentials bool - var signedGroupChange *signalpb.GroupChange + var signedGroupChange *signalpb.GroupChangeResponse group, err := cli.RetrieveGroupByID(ctx, gid, 0) if err != nil { - log.Err(err).Msg("Failed to retrieve Group") + return 0, fmt.Errorf("failed to fetch group info to update: %w", err) } if group.InviteLinkPassword == nil && groupChange.ModifyAddFromInviteLinkAccess != nil && groupChange.ModifyInviteLinkPassword != nil { groupChange.ModifyInviteLinkPassword = ptr.Ptr(GenerateInviteLinkPassword()) } groupChange.Revision = group.Revision + 1 - for attempt := 0; attempt < 5; attempt++ { - signedGroupChange, err = cli.EncryptAndSignGroupChange(ctx, groupChange, gid) - if errors.Is(err, GroupPatchNotAcceptedError) { - log.Warn().Str("Error applying GroupChange, retrying...", err.Error()) + for attempt := 0; ; attempt++ { + signedGroupChange, err = cli.EncryptAndSignGroupChange(ctx, groupChange) + if err == nil { + break + } else if attempt >= 5 { + return 0, fmt.Errorf("failed to encrypt and sign group change after multiple retries: %w", err) + } else if errors.Is(err, GroupPatchNotAcceptedError) { + log.Err(err).Msg("Failed to apply group change, retrying...") if len(groupChange.AddMembers) > 0 && !refetchedAddMemberCredentials { refetchedAddMemberCredentials = true // change = refetchAddMemberCredentials(change); TODO } else { - return 0, fmt.Errorf("Group Change Failed: %w", err) + return 0, fmt.Errorf("failed to update group: %w", err) } } else if errors.Is(err, ConflictError) { delete(cli.GroupCache.groups, gid) delete(cli.GroupCache.lastFetched, gid) delete(cli.GroupCache.activeCalls, gid) group, err = cli.RetrieveGroupByID(ctx, gid, 0) + if err != nil { + return 0, fmt.Errorf("failed to fetch group after conflict: %w", err) + } groupChange.resolveConflict(group) - if groupChange.isEmptpy() { + if groupChange.isEmpty() { log.Debug().Msg("Change is empty after conflict resolution") } groupChange.Revision = group.Revision + 1 } else { - break + return 0, fmt.Errorf("unknown error encrypting and signing group change: %w", err) } } delete(cli.GroupCache.groups, gid) delete(cli.GroupCache.lastFetched, gid) delete(cli.GroupCache.activeCalls, gid) - if err != nil { - log.Err(err).Msg("couldn't patch group on server") - return 0, err + if signedGroupChange == nil { + return 0, fmt.Errorf("no signed group change returned: %w", err) } - groupChangeBytes, err := proto.Marshal(signedGroupChange) + groupChangeBytes, err := proto.Marshal(signedGroupChange.GroupChange) if err != nil { - log.Err(err).Msg("Error marshalling signed GroupChange") - return 0, err + return 0, fmt.Errorf("failed to marshal signed group change: %w", err) + } + groupContext := &signalpb.GroupContextV2{ + Revision: &groupChange.Revision, + GroupChange: groupChangeBytes, + MasterKey: masterKeyBytes[:], } - groupContext := &signalpb.GroupContextV2{Revision: &groupChange.Revision, GroupChange: groupChangeBytes, MasterKey: masterKeyBytes[:]} _, err = cli.SendGroupUpdate(ctx, group, groupContext, groupChange) if err != nil { log.Err(err).Msg("Error sending GroupChange to group members") @@ -1718,7 +1731,7 @@ func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Grou log.Err(err).Msg("Failed to get Authorization for today") return nil, err } - path := "/v1/groups/" + path := "/v2/groups/" requestBody, err := proto.Marshal(encryptedGroup) if err != nil { log.Err(err).Msg("Failed to marshal request") @@ -1751,11 +1764,7 @@ func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Grou case http.StatusBadRequest: return nil, fmt.Errorf("failed to put new group: bad request") } - group, err := cli.fetchGroupWithMasterKey(ctx, decryptedGroup.GroupMasterKey) - if err != nil { - return nil, fmt.Errorf("failed to get new group: %w", err) - } - return group, nil + return cli.parseGroupResponse(ctx, resp, decryptedGroup.GroupMasterKey) } func GenerateInviteLinkPassword() types.SerializedInviteLinkPassword { @@ -1801,7 +1810,7 @@ func (cli *Client) GetGroupHistoryPage(ctx context.Context, gid types.GroupIdent Host: web.StorageHostname, } // highest known epoch seems to always be 5, but that may change in the future. includeLastState is always false - path := fmt.Sprintf("/v1/groups/logs/%d?maxSupportedChangeEpoch=%d&includeFirstState=%t&includeLastState=false", fromRevision, 5, includeFirstState) + path := fmt.Sprintf("/v2/groups/logs/%d?maxSupportedChangeEpoch=%d&includeFirstState=%t&includeLastState=false", fromRevision, 5, includeFirstState) response, err := web.SendHTTPRequest(ctx, http.MethodGet, path, opts) if err != nil { return nil, err From 4843285488d5b2c6b422dd3eec2da068e9b092ff Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 30 Sep 2025 16:56:37 +0300 Subject: [PATCH 003/170] dependencies: update mautrix-go --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 9ead914..3366ff4 100644 --- a/go.mod +++ b/go.mod @@ -12,13 +12,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.1 + go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899 golang.org/x/crypto v0.42.0 golang.org/x/exp v0.0.0-20250911091902-df9299821621 golang.org/x/net v0.44.0 google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.2-0.20250924172949-cf29b07f32ce + maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba ) require ( diff --git a/go.sum b/go.sum index 1e05243..6e3dcca 100644 --- a/go.sum +++ b/go.sum @@ -65,8 +65,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.1 h1:A+XKHRsjKkFi2qOm4RriR1HqY2hoOXNS3WFHaC89r2Y= -go.mau.fi/util v0.9.1/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= +go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899 h1:GoPWdX45WrJG/NC+/6u4km9X9UvrzqGGG78z4VlXI7o= +go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.2-0.20250924172949-cf29b07f32ce h1:sRBScG2xa66ERjgrX+7D//HorAhmNHwxB2Kzltg+aUg= -maunium.net/go/mautrix v0.25.2-0.20250924172949-cf29b07f32ce/go.mod h1:iSueLJ/2fBaNrsTObGqi1j0cl/loxrtAjmjay1scYD8= +maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba h1:IDm8LrL7PJCPqcKeGgBRTCMotz9DCRA1Ru6RWRVAfCQ= +maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba/go.mod h1:nDkJOInK+FbqroUE7j0M1W0PAmAV+03YZYJKWqpx1/0= From 031ef4d2ddc824b73bf3665959b3cbf4968e7c6b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 1 Oct 2025 13:12:51 +0300 Subject: [PATCH 004/170] libsignalgo: add zlib to ldflags --- pkg/libsignalgo/cflags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/libsignalgo/cflags.go b/pkg/libsignalgo/cflags.go index b86e973..12c1e0c 100644 --- a/pkg/libsignalgo/cflags.go +++ b/pkg/libsignalgo/cflags.go @@ -1,6 +1,6 @@ package libsignalgo /* -#cgo LDFLAGS: -lsignal_ffi -ldl -lm +#cgo LDFLAGS: -lsignal_ffi -ldl -lm -lz */ import "C" From a0e596496ceee20282aefa2fcec2fd35d58b2c7b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 1 Oct 2025 14:49:22 +0300 Subject: [PATCH 005/170] groupinfo: add exclude from timeline flag for group resyncs --- go.mod | 4 ++-- go.sum | 8 ++++---- pkg/connector/groupinfo.go | 3 +++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3366ff4..bfd23cc 100644 --- a/go.mod +++ b/go.mod @@ -12,13 +12,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899 + go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10 golang.org/x/crypto v0.42.0 golang.org/x/exp v0.0.0-20250911091902-df9299821621 golang.org/x/net v0.44.0 google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba + maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf ) require ( diff --git a/go.sum b/go.sum index 6e3dcca..7cc4a8a 100644 --- a/go.sum +++ b/go.sum @@ -65,8 +65,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899 h1:GoPWdX45WrJG/NC+/6u4km9X9UvrzqGGG78z4VlXI7o= -go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= +go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10 h1:EvX/di02gOriKN0xGDJuQ5mgiNdAF4LJc8moffI7Svo= +go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba h1:IDm8LrL7PJCPqcKeGgBRTCMotz9DCRA1Ru6RWRVAfCQ= -maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba/go.mod h1:nDkJOInK+FbqroUE7j0M1W0PAmAV+03YZYJKWqpx1/0= +maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf h1:prmIYgiziW4A8H2v/TliQ7fis8uTWblabxyPIeLFlNg= +maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf/go.mod h1:eWXuX2UAGye4AU7i/8Fv2L2Nh7L9kZtuv3R0O0n1KaM= diff --git a/pkg/connector/groupinfo.go b/pkg/connector/groupinfo.go index 6baa3d6..56256c5 100644 --- a/pkg/connector/groupinfo.go +++ b/pkg/connector/groupinfo.go @@ -114,6 +114,7 @@ func (s *SignalClient) wrapGroupInfo(ctx context.Context, groupInfo *signalmeow. event.StatePowerLevels: moderatorPL, }, }, + ExcludeChangesFromTimeline: true, } applyAnnouncementsOnly(members.PowerLevels, groupInfo.AnnouncementsOnly) joinRule := event.JoinRuleInvite @@ -185,6 +186,8 @@ func (s *SignalClient) wrapGroupInfo(ctx context.Context, groupInfo *signalmeow. JoinRule: &event.JoinRulesEventContent{JoinRule: joinRule}, ExtraUpdates: bridgev2.MergeExtraUpdaters(makeRevisionUpdater(groupInfo.Revision), updatePortalSyncMeta), CanBackfill: backupChat != nil, + + ExcludeChangesFromTimeline: true, }, nil } From c795cea7a183d07a7953c713103cd4125e4a2642 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 30 Sep 2025 16:14:13 +0300 Subject: [PATCH 006/170] signalmeow/groups: update to v2 api --- pkg/signalmeow/groups.go | 83 ++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index 865de3f..de6e054 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -192,7 +192,7 @@ type GroupChange struct { ModifyInviteLinkPassword *types.SerializedInviteLinkPassword } -func (groupChange *GroupChange) isEmptpy() bool { +func (groupChange *GroupChange) isEmpty() bool { return len(groupChange.AddMembers) == 0 && len(groupChange.DeleteMembers) == 0 && len(groupChange.ModifyMemberRoles) == 0 && @@ -638,6 +638,7 @@ func (cli *Client) fetchGroupByID(ctx context.Context, gid types.GroupIdentifier } return cli.fetchGroupWithMasterKey(ctx, groupMasterKey) } + func (cli *Client) fetchGroupWithMasterKey(ctx context.Context, groupMasterKey types.SerializedGroupMasterKey) (*Group, error) { masterKeyBytes := masterKeyToBytes(groupMasterKey) groupAuth, err := cli.GetAuthorizationForToday(ctx, masterKeyBytes) @@ -650,24 +651,28 @@ func (cli *Client) fetchGroupWithMasterKey(ctx context.Context, groupMasterKey t ContentType: web.ContentTypeProtobuf, Host: web.StorageHostname, } - response, err := web.SendHTTPRequest(ctx, http.MethodGet, "/v1/groups", opts) + response, err := web.SendHTTPRequest(ctx, http.MethodGet, "/v2/groups", opts) if err != nil { return nil, err } if response.StatusCode != 200 { return nil, fmt.Errorf("fetchGroupByID SendHTTPRequest bad status: %d", response.StatusCode) } - var encryptedGroup signalpb.Group + return cli.parseGroupResponse(ctx, response, groupMasterKey) +} + +func (cli *Client) parseGroupResponse(ctx context.Context, response *http.Response, masterKey types.SerializedGroupMasterKey) (*Group, error) { + var groupResponse signalpb.GroupResponse groupBytes, err := io.ReadAll(response.Body) if err != nil { return nil, err } - err = proto.Unmarshal(groupBytes, &encryptedGroup) + err = proto.Unmarshal(groupBytes, &groupResponse) if err != nil { return nil, fmt.Errorf("failed to unmarshal group: %w", err) } - group, err := decryptGroup(ctx, &encryptedGroup, groupMasterKey) + group, err := decryptGroup(ctx, groupResponse.Group, masterKey) if err != nil { return nil, fmt.Errorf("failed to decrypt group: %w", err) } @@ -1196,7 +1201,7 @@ func decryptRequestingMember(ctx context.Context, requestingMember *signalpb.Req }, nil } -func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroupChange *GroupChange, gid types.GroupIdentifier) (*signalpb.GroupChange, error) { +func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroupChange *GroupChange) (*signalpb.GroupChangeResponse, error) { log := zerolog.Ctx(ctx).With().Str("action", "EncryptGroupChange").Logger() groupMasterKey := decryptedGroupChange.GroupMasterKey masterKeyBytes := masterKeyToBytes(groupMasterKey) @@ -1479,7 +1484,7 @@ func (e RespError) Error() string { return e.Err } -func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupChange_Actions, groupMasterKey types.SerializedGroupMasterKey, groupLinkPassword []byte) (*signalpb.GroupChange, error) { +func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupChange_Actions, groupMasterKey types.SerializedGroupMasterKey, groupLinkPassword []byte) (*signalpb.GroupChangeResponse, error) { log := zerolog.Ctx(ctx).With().Str("action", "patchGroup").Logger() groupAuth, err := cli.GetAuthorizationForToday(ctx, masterKeyToBytes(groupMasterKey)) if err != nil { @@ -1488,9 +1493,9 @@ func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupCh } var path string if groupLinkPassword == nil { - path = "/v1/groups/" + path = "/v2/groups/" } else { - path = fmt.Sprintf("/v1/groups/?inviteLinkPassword=%s", base64.StdEncoding.EncodeToString(groupLinkPassword)) + path = fmt.Sprintf("/v2/groups/?inviteLinkPassword=%s", base64.StdEncoding.EncodeToString(groupLinkPassword)) } requestBody, err := proto.Marshal(groupChange) if err != nil { @@ -1535,70 +1540,78 @@ func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupCh if err != nil { return nil, fmt.Errorf("failed to read storage manifest response: %w", err) } - signedGroupChange := signalpb.GroupChange{} - err = proto.Unmarshal(body, &signedGroupChange) + var changeResp signalpb.GroupChangeResponse + err = proto.Unmarshal(body, &changeResp) if err != nil { return nil, fmt.Errorf("failed to unmarshal signed groupChange: %w", err) } - return &signedGroupChange, nil + return &changeResp, nil } func (cli *Client) UpdateGroup(ctx context.Context, groupChange *GroupChange, gid types.GroupIdentifier) (uint32, error) { log := zerolog.Ctx(ctx).With().Str("action", "UpdateGroup").Logger() groupMasterKey, err := cli.Store.GroupStore.MasterKeyFromGroupIdentifier(ctx, gid) if err != nil { - log.Err(err).Msg("Could not get master key from group id") - return 0, err + return 0, fmt.Errorf("failed to get master key for group: %w", err) } groupChange.GroupMasterKey = groupMasterKey masterKeyBytes := masterKeyToBytes(groupMasterKey) var refetchedAddMemberCredentials bool - var signedGroupChange *signalpb.GroupChange + var signedGroupChange *signalpb.GroupChangeResponse group, err := cli.RetrieveGroupByID(ctx, gid, 0) if err != nil { - log.Err(err).Msg("Failed to retrieve Group") + return 0, fmt.Errorf("failed to fetch group info to update: %w", err) } if group.InviteLinkPassword == nil && groupChange.ModifyAddFromInviteLinkAccess != nil && groupChange.ModifyInviteLinkPassword != nil { groupChange.ModifyInviteLinkPassword = ptr.Ptr(GenerateInviteLinkPassword()) } groupChange.Revision = group.Revision + 1 - for attempt := 0; attempt < 5; attempt++ { - signedGroupChange, err = cli.EncryptAndSignGroupChange(ctx, groupChange, gid) - if errors.Is(err, GroupPatchNotAcceptedError) { - log.Warn().Str("Error applying GroupChange, retrying...", err.Error()) + for attempt := 0; ; attempt++ { + signedGroupChange, err = cli.EncryptAndSignGroupChange(ctx, groupChange) + if err == nil { + break + } else if attempt >= 5 { + return 0, fmt.Errorf("failed to encrypt and sign group change after multiple retries: %w", err) + } else if errors.Is(err, GroupPatchNotAcceptedError) { + log.Err(err).Msg("Failed to apply group change, retrying...") if len(groupChange.AddMembers) > 0 && !refetchedAddMemberCredentials { refetchedAddMemberCredentials = true // change = refetchAddMemberCredentials(change); TODO } else { - return 0, fmt.Errorf("Group Change Failed: %w", err) + return 0, fmt.Errorf("failed to update group: %w", err) } } else if errors.Is(err, ConflictError) { delete(cli.GroupCache.groups, gid) delete(cli.GroupCache.lastFetched, gid) delete(cli.GroupCache.activeCalls, gid) group, err = cli.RetrieveGroupByID(ctx, gid, 0) + if err != nil { + return 0, fmt.Errorf("failed to fetch group after conflict: %w", err) + } groupChange.resolveConflict(group) - if groupChange.isEmptpy() { + if groupChange.isEmpty() { log.Debug().Msg("Change is empty after conflict resolution") } groupChange.Revision = group.Revision + 1 } else { - break + return 0, fmt.Errorf("unknown error encrypting and signing group change: %w", err) } } delete(cli.GroupCache.groups, gid) delete(cli.GroupCache.lastFetched, gid) delete(cli.GroupCache.activeCalls, gid) - if err != nil { - log.Err(err).Msg("couldn't patch group on server") - return 0, err + if signedGroupChange == nil { + return 0, fmt.Errorf("no signed group change returned: %w", err) } - groupChangeBytes, err := proto.Marshal(signedGroupChange) + groupChangeBytes, err := proto.Marshal(signedGroupChange.GroupChange) if err != nil { - log.Err(err).Msg("Error marshalling signed GroupChange") - return 0, err + return 0, fmt.Errorf("failed to marshal signed group change: %w", err) + } + groupContext := &signalpb.GroupContextV2{ + Revision: &groupChange.Revision, + GroupChange: groupChangeBytes, + MasterKey: masterKeyBytes[:], } - groupContext := &signalpb.GroupContextV2{Revision: &groupChange.Revision, GroupChange: groupChangeBytes, MasterKey: masterKeyBytes[:]} _, err = cli.SendGroupUpdate(ctx, group, groupContext, groupChange) if err != nil { log.Err(err).Msg("Error sending GroupChange to group members") @@ -1718,7 +1731,7 @@ func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Grou log.Err(err).Msg("Failed to get Authorization for today") return nil, err } - path := "/v1/groups/" + path := "/v2/groups/" requestBody, err := proto.Marshal(encryptedGroup) if err != nil { log.Err(err).Msg("Failed to marshal request") @@ -1751,11 +1764,7 @@ func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Grou case http.StatusBadRequest: return nil, fmt.Errorf("failed to put new group: bad request") } - group, err := cli.fetchGroupWithMasterKey(ctx, decryptedGroup.GroupMasterKey) - if err != nil { - return nil, fmt.Errorf("failed to get new group: %w", err) - } - return group, nil + return cli.parseGroupResponse(ctx, resp, decryptedGroup.GroupMasterKey) } func GenerateInviteLinkPassword() types.SerializedInviteLinkPassword { @@ -1801,7 +1810,7 @@ func (cli *Client) GetGroupHistoryPage(ctx context.Context, gid types.GroupIdent Host: web.StorageHostname, } // highest known epoch seems to always be 5, but that may change in the future. includeLastState is always false - path := fmt.Sprintf("/v1/groups/logs/%d?maxSupportedChangeEpoch=%d&includeFirstState=%t&includeLastState=false", fromRevision, 5, includeFirstState) + path := fmt.Sprintf("/v2/groups/logs/%d?maxSupportedChangeEpoch=%d&includeFirstState=%t&includeLastState=false", fromRevision, 5, includeFirstState) response, err := web.SendHTTPRequest(ctx, http.MethodGet, path, opts) if err != nil { return nil, err From 606d904cac80e6c02ecae1f431ed0c7f8c0614aa Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 30 Sep 2025 16:56:37 +0300 Subject: [PATCH 007/170] dependencies: update mautrix-go --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 9ead914..3366ff4 100644 --- a/go.mod +++ b/go.mod @@ -12,13 +12,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.1 + go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899 golang.org/x/crypto v0.42.0 golang.org/x/exp v0.0.0-20250911091902-df9299821621 golang.org/x/net v0.44.0 google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.2-0.20250924172949-cf29b07f32ce + maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba ) require ( diff --git a/go.sum b/go.sum index 1e05243..6e3dcca 100644 --- a/go.sum +++ b/go.sum @@ -65,8 +65,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.1 h1:A+XKHRsjKkFi2qOm4RriR1HqY2hoOXNS3WFHaC89r2Y= -go.mau.fi/util v0.9.1/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= +go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899 h1:GoPWdX45WrJG/NC+/6u4km9X9UvrzqGGG78z4VlXI7o= +go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.2-0.20250924172949-cf29b07f32ce h1:sRBScG2xa66ERjgrX+7D//HorAhmNHwxB2Kzltg+aUg= -maunium.net/go/mautrix v0.25.2-0.20250924172949-cf29b07f32ce/go.mod h1:iSueLJ/2fBaNrsTObGqi1j0cl/loxrtAjmjay1scYD8= +maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba h1:IDm8LrL7PJCPqcKeGgBRTCMotz9DCRA1Ru6RWRVAfCQ= +maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba/go.mod h1:nDkJOInK+FbqroUE7j0M1W0PAmAV+03YZYJKWqpx1/0= From 7ffa38469f198aff84c7a8d0d86c0e355fbf8931 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 1 Oct 2025 14:49:22 +0300 Subject: [PATCH 008/170] groupinfo: add exclude from timeline flag for group resyncs --- go.mod | 4 ++-- go.sum | 8 ++++---- pkg/connector/groupinfo.go | 3 +++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3366ff4..bfd23cc 100644 --- a/go.mod +++ b/go.mod @@ -12,13 +12,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899 + go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10 golang.org/x/crypto v0.42.0 golang.org/x/exp v0.0.0-20250911091902-df9299821621 golang.org/x/net v0.44.0 google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba + maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf ) require ( diff --git a/go.sum b/go.sum index 6e3dcca..7cc4a8a 100644 --- a/go.sum +++ b/go.sum @@ -65,8 +65,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899 h1:GoPWdX45WrJG/NC+/6u4km9X9UvrzqGGG78z4VlXI7o= -go.mau.fi/util v0.9.2-0.20250928173307-c0b5f4ee5899/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= +go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10 h1:EvX/di02gOriKN0xGDJuQ5mgiNdAF4LJc8moffI7Svo= +go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba h1:IDm8LrL7PJCPqcKeGgBRTCMotz9DCRA1Ru6RWRVAfCQ= -maunium.net/go/mautrix v0.25.2-0.20250930123525-329da10584ba/go.mod h1:nDkJOInK+FbqroUE7j0M1W0PAmAV+03YZYJKWqpx1/0= +maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf h1:prmIYgiziW4A8H2v/TliQ7fis8uTWblabxyPIeLFlNg= +maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf/go.mod h1:eWXuX2UAGye4AU7i/8Fv2L2Nh7L9kZtuv3R0O0n1KaM= diff --git a/pkg/connector/groupinfo.go b/pkg/connector/groupinfo.go index 6baa3d6..56256c5 100644 --- a/pkg/connector/groupinfo.go +++ b/pkg/connector/groupinfo.go @@ -114,6 +114,7 @@ func (s *SignalClient) wrapGroupInfo(ctx context.Context, groupInfo *signalmeow. event.StatePowerLevels: moderatorPL, }, }, + ExcludeChangesFromTimeline: true, } applyAnnouncementsOnly(members.PowerLevels, groupInfo.AnnouncementsOnly) joinRule := event.JoinRuleInvite @@ -185,6 +186,8 @@ func (s *SignalClient) wrapGroupInfo(ctx context.Context, groupInfo *signalmeow. JoinRule: &event.JoinRulesEventContent{JoinRule: joinRule}, ExtraUpdates: bridgev2.MergeExtraUpdaters(makeRevisionUpdater(groupInfo.Revision), updatePortalSyncMeta), CanBackfill: backupChat != nil, + + ExcludeChangesFromTimeline: true, }, nil } From 89638a95ab355f3fe5f91fbf2358965f3f8a4cb9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 5 Oct 2025 00:28:12 +0300 Subject: [PATCH 009/170] signalmeow/provisioning: fix typo in capability name --- pkg/signalmeow/provisioning.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/provisioning.go b/pkg/signalmeow/provisioning.go index 8957018..d0aeb59 100644 --- a/pkg/signalmeow/provisioning.go +++ b/pkg/signalmeow/provisioning.go @@ -360,7 +360,7 @@ func continueProvisioning(ctx context.Context, ws *websocket.Conn, provisioningC var signalCapabilities = map[string]any{ "attachmentBackfill": true, - "sqpr": true, + "spqr": true, } var signalCapabilitiesBody = exerrors.Must(json.Marshal(signalCapabilities)) From 40a0d8525c3282e608fa3d1f92f13817aa101de8 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 5 Oct 2025 00:47:57 +0300 Subject: [PATCH 010/170] libsignal: update to v0.83.0 --- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 24 ++++-------------------- pkg/libsignalgo/prekey.go | 1 - pkg/libsignalgo/prekeybundle.go | 1 - pkg/libsignalgo/version.go | 2 +- 5 files changed, 6 insertions(+), 24 deletions(-) diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index 42ff946..eb7e0e7 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit 42ff946228be177c33c147359178455b411d3628 +Subproject commit eb7e0e7d18c76b29a0de706ed8932730f68b677e diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index 0111718..5f503ad 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -1606,7 +1606,7 @@ SignalFfiError *signal_connection_manager_clear_proxy(SignalConstPointerConnecti SignalFfiError *signal_connection_manager_destroy(SignalMutPointerConnectionManager p); -SignalFfiError *signal_connection_manager_new(SignalMutPointerConnectionManager *out, uint8_t environment, const char *user_agent, SignalMutPointerBridgedStringMap remote_config); +SignalFfiError *signal_connection_manager_new(SignalMutPointerConnectionManager *out, uint8_t environment, const char *user_agent, SignalMutPointerBridgedStringMap remote_config, uint8_t build_variant); SignalFfiError *signal_connection_manager_on_network_change(SignalConstPointerConnectionManager connection_manager); @@ -1616,7 +1616,7 @@ SignalFfiError *signal_connection_manager_set_invalid_proxy(SignalConstPointerCo SignalFfiError *signal_connection_manager_set_proxy(SignalConstPointerConnectionManager connection_manager, SignalConstPointerConnectionProxyConfig proxy); -SignalFfiError *signal_connection_manager_set_remote_config(SignalConstPointerConnectionManager connection_manager, SignalMutPointerBridgedStringMap remote_config); +SignalFfiError *signal_connection_manager_set_remote_config(SignalConstPointerConnectionManager connection_manager, SignalMutPointerBridgedStringMap remote_config, uint8_t build_variant); SignalFfiError *signal_connection_proxy_config_clone(SignalMutPointerConnectionProxyConfig *new_obj, SignalConstPointerConnectionProxyConfig obj); @@ -1648,7 +1648,7 @@ SignalFfiError *signal_create_call_link_credential_response_check_valid_contents SignalFfiError *signal_decrypt_message(SignalOwnedBuffer *out, SignalConstPointerSignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store); -SignalFfiError *signal_decrypt_pre_key_message(SignalOwnedBuffer *out, SignalConstPointerPreKeySignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, SignalConstPointerFfiPreKeyStoreStruct prekey_store, SignalConstPointerFfiSignedPreKeyStoreStruct signed_prekey_store, SignalConstPointerFfiKyberPreKeyStoreStruct kyber_prekey_store, bool use_pq_ratchet); +SignalFfiError *signal_decrypt_pre_key_message(SignalOwnedBuffer *out, SignalConstPointerPreKeySignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, SignalConstPointerFfiPreKeyStoreStruct prekey_store, SignalConstPointerFfiSignedPreKeyStoreStruct signed_prekey_store, SignalConstPointerFfiKyberPreKeyStoreStruct kyber_prekey_store); SignalFfiError *signal_decryption_error_message_clone(SignalMutPointerDecryptionErrorMessage *new_obj, SignalConstPointerDecryptionErrorMessage obj); @@ -1966,9 +1966,7 @@ SignalFfiError *signal_message_new(SignalMutPointerSignalMessage *out, uint8_t m SignalFfiError *signal_message_verify_mac(bool *out, SignalConstPointerSignalMessage msg, SignalConstPointerPublicKey sender_identity_key, SignalConstPointerPublicKey receiver_identity_key, SignalBorrowedBuffer mac_key); -#if defined(SIGNAL_MEDIA_SUPPORTED) SignalFfiError *signal_mp4_sanitizer_sanitize(SignalMutPointerSanitizedMetadata *out, SignalConstPointerFfiInputStreamStruct input, uint64_t len); -#endif SignalFfiError *signal_online_backup_validator_add_frame(SignalMutPointerOnlineBackupValidator backup, SignalBorrowedBuffer frame); @@ -2094,7 +2092,7 @@ SignalFfiError *signal_privatekey_serialize(SignalOwnedBuffer *out, SignalConstP SignalFfiError *signal_privatekey_sign(SignalOwnedBuffer *out, SignalConstPointerPrivateKey key, SignalBorrowedBuffer message); -SignalFfiError *signal_process_prekey_bundle(SignalConstPointerPreKeyBundle bundle, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, uint64_t now, bool use_pq_ratchet); +SignalFfiError *signal_process_prekey_bundle(SignalConstPointerPreKeyBundle bundle, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, uint64_t now); SignalFfiError *signal_process_sender_key_distribution_message(SignalConstPointerProtocolAddress sender, SignalConstPointerSenderKeyDistributionMessage sender_key_distribution_message, SignalConstPointerFfiSenderKeyStoreStruct store); @@ -2242,25 +2240,15 @@ SignalFfiError *signal_registration_session_get_requested_information(SignalOwne SignalFfiError *signal_registration_session_get_verified(bool *out, SignalConstPointerRegistrationSession session); -#if defined(SIGNAL_MEDIA_SUPPORTED) SignalFfiError *signal_sanitized_metadata_clone(SignalMutPointerSanitizedMetadata *new_obj, SignalConstPointerSanitizedMetadata obj); -#endif -#if defined(SIGNAL_MEDIA_SUPPORTED) SignalFfiError *signal_sanitized_metadata_destroy(SignalMutPointerSanitizedMetadata p); -#endif -#if defined(SIGNAL_MEDIA_SUPPORTED) SignalFfiError *signal_sanitized_metadata_get_data_len(uint64_t *out, SignalConstPointerSanitizedMetadata sanitized); -#endif -#if defined(SIGNAL_MEDIA_SUPPORTED) SignalFfiError *signal_sanitized_metadata_get_data_offset(uint64_t *out, SignalConstPointerSanitizedMetadata sanitized); -#endif -#if defined(SIGNAL_MEDIA_SUPPORTED) SignalFfiError *signal_sanitized_metadata_get_metadata(SignalOwnedBuffer *out, SignalConstPointerSanitizedMetadata sanitized); -#endif SignalFfiError *signal_sealed_sender_multi_recipient_encrypt(SignalOwnedBuffer *out, SignalBorrowedSliceOfConstPointerProtocolAddress recipients, SignalBorrowedSliceOfConstPointerSessionRecord recipient_sessions, SignalBorrowedBuffer excluded_recipients, SignalConstPointerUnidentifiedSenderMessageContent content, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store); @@ -2466,9 +2454,7 @@ SignalFfiError *signal_sgx_client_state_established_send(SignalOwnedBuffer *out, SignalFfiError *signal_sgx_client_state_initial_request(SignalOwnedBuffer *out, SignalConstPointerSgxClientState obj); -#if defined(SIGNAL_MEDIA_SUPPORTED) SignalFfiError *signal_signal_media_check_available(void); -#endif SignalFfiError *signal_signed_pre_key_record_clone(SignalMutPointerSignedPreKeyRecord *new_obj, SignalConstPointerSignedPreKeyRecord obj); @@ -2556,8 +2542,6 @@ SignalFfiError *signal_validating_mac_initialize(SignalMutPointerValidatingMac * SignalFfiError *signal_validating_mac_update(int32_t *out, SignalMutPointerValidatingMac mac, SignalBorrowedBuffer bytes, uint32_t offset, uint32_t length); -#if defined(SIGNAL_MEDIA_SUPPORTED) SignalFfiError *signal_webp_sanitizer_sanitize(SignalConstPointerFfiSyncInputStreamStruct input); -#endif #endif /* SIGNAL_FFI_H_ */ diff --git a/pkg/libsignalgo/prekey.go b/pkg/libsignalgo/prekey.go index 7713c76..4d01f89 100644 --- a/pkg/libsignalgo/prekey.go +++ b/pkg/libsignalgo/prekey.go @@ -39,7 +39,6 @@ func DecryptPreKey(ctx context.Context, preKeyMessage *PreKeyMessage, fromAddres callbackCtx.wrapPreKeyStore(preKeyStore), callbackCtx.wrapSignedPreKeyStore(signedPreKeyStore), callbackCtx.wrapKyberPreKeyStore(kyberPreKeyStore), - false, // no pq ratchets yet ) runtime.KeepAlive(preKeyMessage) runtime.KeepAlive(fromAddress) diff --git a/pkg/libsignalgo/prekeybundle.go b/pkg/libsignalgo/prekeybundle.go index 7d8536e..4cd5547 100644 --- a/pkg/libsignalgo/prekeybundle.go +++ b/pkg/libsignalgo/prekeybundle.go @@ -37,7 +37,6 @@ func ProcessPreKeyBundle(ctx context.Context, bundle *PreKeyBundle, forAddress * callbackCtx.wrapSessionStore(sessionStore), callbackCtx.wrapIdentityKeyStore(identityStore), now, - false, // no pq ratchets yet ) runtime.KeepAlive(bundle) runtime.KeepAlive(forAddress) diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index b137e61..82b7589 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.82.0" +const Version = "v0.83.0" From 58203bf921e2d7866880e3946a62065b27e230ce Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Oct 2025 17:15:51 +0300 Subject: [PATCH 011/170] signalmeow/provisioning: update link capabilities --- pkg/signalmeow/provisioning.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/provisioning.go b/pkg/signalmeow/provisioning.go index d0aeb59..8e87738 100644 --- a/pkg/signalmeow/provisioning.go +++ b/pkg/signalmeow/provisioning.go @@ -299,7 +299,7 @@ func startProvisioning(ctx context.Context, ws *websocket.Conn, provisioningCiph return "", fmt.Errorf("failed to unmarshal provisioning UUID: %w", err) } - linkCapabilities := []string{"backup4"} + linkCapabilities := []string{"backup4", "backup5"} if !allowBackup { linkCapabilities = []string{} } From aaa4f1f00fecc8150e961ca2536077a65f2f1503 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Oct 2025 18:41:37 +0300 Subject: [PATCH 012/170] libsignal: update to v0.84.0 --- pkg/libsignalgo/identitykey.go | 7 +++---- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 28 ++++++++++++++++++++++++---- pkg/libsignalgo/version.go | 2 +- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/pkg/libsignalgo/identitykey.go b/pkg/libsignalgo/identitykey.go index 7877d22..f35d116 100644 --- a/pkg/libsignalgo/identitykey.go +++ b/pkg/libsignalgo/identitykey.go @@ -114,14 +114,13 @@ func GenerateIdentityKeyPair() (*IdentityKeyPair, error) { } func DeserializeIdentityKeyPair(bytes []byte) (*IdentityKeyPair, error) { - var privateKey C.SignalMutPointerPrivateKey - var publicKey C.SignalMutPointerPublicKey - signalFfiError := C.signal_identitykeypair_deserialize(&privateKey, &publicKey, BytesToBuffer(bytes)) + var keys C.SignalPairOfMutPointerPublicKeyMutPointerPrivateKey + signalFfiError := C.signal_identitykeypair_deserialize(&keys, BytesToBuffer(bytes)) runtime.KeepAlive(bytes) if signalFfiError != nil { return nil, wrapError(signalFfiError) } - return &IdentityKeyPair{publicKey: wrapPublicKey(publicKey.raw), privateKey: wrapPrivateKey(privateKey.raw)}, nil + return &IdentityKeyPair{publicKey: wrapPublicKey(keys.first.raw), privateKey: wrapPrivateKey(keys.second.raw)}, nil } func NewIdentityKeyPair(publicKey *PublicKey, privateKey *PrivateKey) (*IdentityKeyPair, error) { diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index eb7e0e7..c02859f 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit eb7e0e7d18c76b29a0de706ed8932730f68b677e +Subproject commit c02859f57552477680fb7928c3c3426193040313 diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index 5f503ad..a516a23 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -892,6 +892,21 @@ typedef struct { */ typedef const SignalFfiError *SignalUnwindSafeArgSignalFfiError; +typedef struct { + const char *first; + uint32_t second; +} SignalPairOfc_charu32; + +typedef struct { + const char *first; + SignalOwnedBuffer second; +} SignalPairOfc_charOwnedBufferOfc_uchar; + +typedef struct { + const char *first; + bool second; +} SignalPairOfc_charbool; + typedef struct { SignalFingerprint *raw; } SignalMutPointerFingerprint; @@ -973,6 +988,11 @@ typedef struct { SignalHttpRequest *raw; } SignalMutPointerHttpRequest; +typedef struct { + SignalMutPointerPublicKey first; + SignalMutPointerPrivateKey second; +} SignalPairOfMutPointerPublicKeyMutPointerPrivateKey; + typedef struct { const SignalPrivateKey *raw; } SignalConstPointerPrivateKey; @@ -1680,15 +1700,15 @@ void signal_error_free(SignalFfiError *err); SignalFfiError *signal_error_get_address(SignalMutPointerProtocolAddress *out, SignalUnwindSafeArgSignalFfiError err); -SignalFfiError *signal_error_get_invalid_protocol_address(const char **name_out, uint32_t *device_id_out, const SignalFfiError *err); +SignalFfiError *signal_error_get_invalid_protocol_address(SignalPairOfc_charu32 *out, SignalUnwindSafeArgSignalFfiError err); SignalFfiError *signal_error_get_message(const char **out, SignalUnwindSafeArgSignalFfiError err); SignalFfiError *signal_error_get_our_fingerprint_version(uint32_t *out, SignalUnwindSafeArgSignalFfiError err); -SignalFfiError *signal_error_get_rate_limit_challenge(const char **out_token, SignalOwnedBuffer *out_options, const SignalFfiError *err); +SignalFfiError *signal_error_get_rate_limit_challenge(SignalPairOfc_charOwnedBufferOfc_uchar *out, SignalUnwindSafeArgSignalFfiError err); -SignalFfiError *signal_error_get_registration_error_not_deliverable(const char **out_reason, bool *out_permanent, const SignalFfiError *err); +SignalFfiError *signal_error_get_registration_error_not_deliverable(SignalPairOfc_charbool *out, SignalUnwindSafeArgSignalFfiError err); SignalFfiError *signal_error_get_registration_lock(uint64_t *out_time_remaining_seconds, const char **out_svr2_username, const char **out_svr2_password, const SignalFfiError *err); @@ -1834,7 +1854,7 @@ SignalFfiError *signal_http_request_new_without_body(SignalMutPointerHttpRequest SignalFfiError *signal_identitykey_verify_alternate_identity(bool *out, SignalConstPointerPublicKey public_key, SignalConstPointerPublicKey other_identity, SignalBorrowedBuffer signature); -SignalFfiError *signal_identitykeypair_deserialize(SignalMutPointerPrivateKey *private_key, SignalMutPointerPublicKey *public_key, SignalBorrowedBuffer input); +SignalFfiError *signal_identitykeypair_deserialize(SignalPairOfMutPointerPublicKeyMutPointerPrivateKey *out, SignalBorrowedBuffer input); SignalFfiError *signal_identitykeypair_serialize(SignalOwnedBuffer *out, SignalConstPointerPublicKey public_key, SignalConstPointerPrivateKey private_key); diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index 82b7589..b859d49 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.83.0" +const Version = "v0.84.0" From 7e0f1601d2841aaf945352d1ef9883030731ad56 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Oct 2025 18:46:50 +0300 Subject: [PATCH 013/170] changelog: update --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b548abd..23bab3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v25.10 (unreleased) + +* Switched to calendar versioning. +* Updated libsignal to v0.84.0. +* Fixed backfill creating incorrect disappearing timer change notices. + # v0.8.7 (2025-09-16) * Removed legacy provisioning API and database legacy migration. From 4889eae088d3f74031b23c8f69d67b566c2eb690 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 14 Oct 2025 00:20:43 +0300 Subject: [PATCH 014/170] chatinfo: add support for PNIs in group creation --- go.mod | 2 +- go.sum | 4 ++-- pkg/connector/chatinfo.go | 23 +++++++++++++++++------ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index bfd23cc..1dcea92 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.44.0 google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf + maunium.net/go/mautrix v0.25.2-0.20251013212004-097813c9b29b ) require ( diff --git a/go.sum b/go.sum index 7cc4a8a..eaf756c 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf h1:prmIYgiziW4A8H2v/TliQ7fis8uTWblabxyPIeLFlNg= -maunium.net/go/mautrix v0.25.2-0.20251001115535-dd778ae0cdaf/go.mod h1:eWXuX2UAGye4AU7i/8Fv2L2Nh7L9kZtuv3R0O0n1KaM= +maunium.net/go/mautrix v0.25.2-0.20251013212004-097813c9b29b h1:cRR925ki45mwOA5lb6tjWYxV8YAG00/anpTRH2SJfvA= +maunium.net/go/mautrix v0.25.2-0.20251013212004-097813c9b29b/go.mod h1:eWXuX2UAGye4AU7i/8Fv2L2Nh7L9kZtuv3R0O0n1KaM= diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 18ffb36..55dcf9e 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -240,7 +240,7 @@ func (s *SignalClient) ResolveIdentifier(ctx context.Context, number string, cre func (s *SignalClient) CreateGroup(ctx context.Context, params *bridgev2.GroupCreateParams) (*bridgev2.CreateChatResponse, error) { group := &signalmeow.Group{ Title: ptr.Val(params.Name).Name, - Members: make([]*signalmeow.GroupMember, len(params.Participants)+1), + Members: make([]*signalmeow.GroupMember, 1, len(params.Participants)+1), Description: ptr.Val(params.Topic).Topic, AnnouncementsOnly: false, DisappearingMessagesDuration: uint32(ptr.Val(params.Disappear).Timer.Seconds()), @@ -267,14 +267,25 @@ func (s *SignalClient) CreateGroup(ctx context.Context, params *bridgev2.GroupCr ACI: s.Client.Store.ACI, Role: signalmeow.GroupMember_ADMINISTRATOR, } - for i, member := range params.Participants { - userID, err := signalid.ParseUserID(member) + currentTS := uint64(time.Now().UnixMilli()) + for _, member := range params.Participants { + userID, err := signalid.ParseUserIDAsServiceID(member) if err != nil { return nil, fmt.Errorf("invalid user ID %q: %w", member, err) } - group.Members[i+1] = &signalmeow.GroupMember{ - ACI: userID, - Role: signalmeow.GroupMember_DEFAULT, // TODO set proper role from power levels + if userID.Type == libsignalgo.ServiceIDTypeACI { + group.Members = append(group.Members, &signalmeow.GroupMember{ + ACI: userID.UUID, + Role: signalmeow.GroupMember_DEFAULT, // TODO set proper role from power levels + }) + } else if userID.Type == libsignalgo.ServiceIDTypePNI { + // TODO check if this is correct + group.PendingMembers = append(group.PendingMembers, &signalmeow.PendingMember{ + ServiceID: userID, + Role: signalmeow.GroupMember_DEFAULT, + AddedByUserID: s.Client.Store.ACI, + Timestamp: currentTS, + }) } } _, err := signalmeow.PrepareGroupCreation(group) From 422291c80452ddbbf6760db66977220797b078e5 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 16 Oct 2025 12:05:32 +0200 Subject: [PATCH 015/170] Bump version to v25.10 --- CHANGELOG.md | 2 +- cmd/mautrix-signal/main.go | 3 ++- go.mod | 18 +++++++++--------- go.sum | 36 ++++++++++++++++++------------------ 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23bab3b..9135702 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# v25.10 (unreleased) +# v25.10 * Switched to calendar versioning. * Updated libsignal to v0.84.0. diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index 01e3793..73a2921 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -34,7 +34,8 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "0.8.7", + Version: "25.10", + SemCalVer: true, Connector: &connector.SignalConnector{}, } diff --git a/go.mod b/go.mod index 1dcea92..d57b356 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-signal go 1.24.0 -toolchain go1.25.1 +toolchain go1.25.3 require ( github.com/coder/websocket v1.8.14 @@ -12,13 +12,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10 - golang.org/x/crypto v0.42.0 - golang.org/x/exp v0.0.0-20250911091902-df9299821621 - golang.org/x/net v0.44.0 - google.golang.org/protobuf v1.36.9 + go.mau.fi/util v0.9.2 + golang.org/x/crypto v0.43.0 + golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b + golang.org/x/net v0.46.0 + google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.2-0.20251013212004-097813c9b29b + maunium.net/go/mautrix v0.25.2 ) require ( @@ -41,8 +41,8 @@ require ( github.com/yuin/goldmark v1.7.13 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/text v0.29.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index eaf756c..da6cc5e 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff h1:4N8wnS3f1hNHSmFD5zgFkWCyA4L1kCDkImPAtK7D6tg= github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -65,27 +65,27 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10 h1:EvX/di02gOriKN0xGDJuQ5mgiNdAF4LJc8moffI7Svo= -go.mau.fi/util v0.9.2-0.20251001114608-d99877b9cc10/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= +go.mau.fi/util v0.9.2 h1:+S4Z03iCsGqU2WY8X2gySFsFjaLlUHFRDVCYvVwynKM= +go.mau.fi/util v0.9.2/go.mod h1:055elBBCJSdhRsmub7ci9hXZPgGr1U6dYg44cSgRgoU= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= -golang.org/x/exp v0.0.0-20250911091902-df9299821621 h1:2id6c1/gto0kaHYyrixvknJ8tUK/Qs5IsmBtrc+FtgU= -golang.org/x/exp v0.0.0-20250911091902-df9299821621/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b h1:18qgiDvlvH7kk8Ioa8Ov+K6xCi0GMvmGfGW0sgd/SYA= +golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.2-0.20251013212004-097813c9b29b h1:cRR925ki45mwOA5lb6tjWYxV8YAG00/anpTRH2SJfvA= -maunium.net/go/mautrix v0.25.2-0.20251013212004-097813c9b29b/go.mod h1:eWXuX2UAGye4AU7i/8Fv2L2Nh7L9kZtuv3R0O0n1KaM= +maunium.net/go/mautrix v0.25.2 h1:CUG23zp754yGOTMh9Q4mVSENS9FyweE/G+6ZsPDMCUU= +maunium.net/go/mautrix v0.25.2/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= From 11e0e970675a5ead29047518f1fa038365476bfc Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 20 Oct 2025 11:22:33 +0300 Subject: [PATCH 016/170] client: use transient disconnect for all network errors --- go.mod | 2 +- go.sum | 4 ++-- pkg/connector/client.go | 17 ++++++++--------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index d57b356..0613f9b 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.46.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.2 + maunium.net/go/mautrix v0.25.3-0.20251020084845-56b182f85d04 ) require ( diff --git a/go.sum b/go.sum index da6cc5e..560e1b9 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.2 h1:CUG23zp754yGOTMh9Q4mVSENS9FyweE/G+6ZsPDMCUU= -maunium.net/go/mautrix v0.25.2/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= +maunium.net/go/mautrix v0.25.3-0.20251020084845-56b182f85d04 h1:OPcp3Bh6PyF282Siq7/d84XZHaNSm74N9VINAeYEQys= +maunium.net/go/mautrix v0.25.3-0.20251020084845-56b182f85d04/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 27cea14..8da1723 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -189,7 +189,7 @@ func (s *SignalClient) bridgeStateLoop(statusChan <-chan signalmeow.SignalConnec case signalmeow.SignalConnectionEventError: s.UserLogin.Log.Debug().Msg("Sending UnknownError BridgeState") - s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateUnknownError, Error: "unknown-websocket-error", Message: err.Error()}) + s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "unknown-websocket-error", Message: err.Error()}) case signalmeow.SignalConnectionCleanShutdown: if s.Client.IsLoggedIn() { @@ -303,15 +303,14 @@ func (s *SignalClient) tryConnect(ctx context.Context, retryCount int, doSync bo ch, err := s.Client.StartReceiveLoops(ctx) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to start receive loops") - if retryCount < 6 { - s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "unknown-websocket-error", Message: err.Error()}) - retryInSeconds := 2 << retryCount - zerolog.Ctx(ctx).Debug().Int("retry_in_seconds", retryInSeconds).Msg("Sleeping and retrying connection") - time.Sleep(time.Duration(retryInSeconds) * time.Second) - s.tryConnect(ctx, retryCount+1, doSync) - } else { - s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateUnknownError, Error: "unknown-websocket-error", Message: err.Error()}) + s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "unknown-websocket-error", Message: err.Error()}) + retryInSeconds := 2 << retryCount + if retryInSeconds > 150 { + retryInSeconds = 150 } + zerolog.Ctx(ctx).Debug().Int("retry_in_seconds", retryInSeconds).Msg("Sleeping and retrying connection") + time.Sleep(time.Duration(retryInSeconds) * time.Second) + s.tryConnect(ctx, retryCount+1, doSync) } else { go s.bridgeStateLoop(ch) if doSync { From 08d70602e195719e6a5d9c8943d13d56c4d3c21b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 20 Oct 2025 11:52:14 +0300 Subject: [PATCH 017/170] signalmeow/web: split non-retrying errors into different type --- pkg/connector/client.go | 10 +++++++--- pkg/signalmeow/receiving.go | 11 +++++++++++ pkg/signalmeow/web/signalwebsocket.go | 4 +++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 8da1723..0ff578f 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -188,9 +188,13 @@ func (s *SignalClient) bridgeStateLoop(statusChan <-chan signalmeow.SignalConnec } case signalmeow.SignalConnectionEventError: - s.UserLogin.Log.Debug().Msg("Sending UnknownError BridgeState") + s.UserLogin.Log.Debug().Msg("Sending TransientDisconnect BridgeState") s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "unknown-websocket-error", Message: err.Error()}) + case signalmeow.SignalConnectionEventFatalError: + s.UserLogin.Log.Debug().Msg("Sending UnknownError BridgeState") + s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateUnknownError, Error: "unknown-websocket-error", Message: err.Error()}) + case signalmeow.SignalConnectionCleanShutdown: if s.Client.IsLoggedIn() { s.UserLogin.Log.Debug().Msg("Clean Shutdown - sending no BridgeState") @@ -233,7 +237,7 @@ func (s *SignalClient) ConnectBackground(ctx context.Context, _ *bridgev2.Connec case web.SignalWebsocketConnectionEventLoggedOut: log.Err(status.Err).Msg("Authed websocket logged out") return fmt.Errorf("authed websocket logged out: %w", status.Err) - case web.SignalWebsocketConnectionEventError: + case web.SignalWebsocketConnectionEventError, web.SignalWebsocketConnectionEventFatalError: log.Err(status.Err).Msg("Authed websocket error") return fmt.Errorf("authed websocket errored: %w", status.Err) case web.SignalWebsocketConnectionEventCleanShutdown: @@ -247,7 +251,7 @@ func (s *SignalClient) ConnectBackground(ctx context.Context, _ *bridgev2.Connec log.Err(status.Err).Msg("Unauthed websocket disconnected") case web.SignalWebsocketConnectionEventLoggedOut: log.Err(status.Err).Msg("Unauthed websocket logged out") - case web.SignalWebsocketConnectionEventError: + case web.SignalWebsocketConnectionEventError, web.SignalWebsocketConnectionEventFatalError: log.Err(status.Err).Msg("Unauthed websocket error") case web.SignalWebsocketConnectionEventCleanShutdown: log.Info().Msg("Unauthed websocket clean shutdown") diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 6c97a69..d630386 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -46,6 +46,7 @@ const ( SignalConnectionEventDisconnected SignalConnectionEventLoggedOut SignalConnectionEventError + SignalConnectionEventFatalError SignalConnectionCleanShutdown ) @@ -56,6 +57,7 @@ var signalConnectionEventNames = map[SignalConnectionEvent]string{ SignalConnectionEventDisconnected: "SignalConnectionEventDisconnected", SignalConnectionEventLoggedOut: "SignalConnectionEventLoggedOut", SignalConnectionEventError: "SignalConnectionEventError", + SignalConnectionEventFatalError: "SignalConnectionEventFatalError", SignalConnectionCleanShutdown: "SignalConnectionCleanShutdown", } @@ -164,6 +166,8 @@ func (cli *Client) StartReceiveLoops(ctx context.Context) (chan SignalConnection //StopReceiveLoops(d) case web.SignalWebsocketConnectionEventError: log.Err(status.Err).Msg("Authed websocket error") + case web.SignalWebsocketConnectionEventFatalError: + log.Err(status.Err).Msg("Authed websocket fatal error") case web.SignalWebsocketConnectionEventCleanShutdown: log.Info().Msg("Authed websocket clean shutdown") } @@ -192,6 +196,8 @@ func (cli *Client) StartReceiveLoops(ctx context.Context) (chan SignalConnection log.Err(status.Err).Msg("Unauthed websocket logged out ** THIS SHOULD BE IMPOSSIBLE **") case web.SignalWebsocketConnectionEventError: log.Err(status.Err).Msg("Unauthed websocket error") + case web.SignalWebsocketConnectionEventFatalError: + log.Err(status.Err).Msg("Unauthed websocket fatal error") case web.SignalWebsocketConnectionEventCleanShutdown: log.Info().Msg("Unauthed websocket clean shutdown") } @@ -221,6 +227,11 @@ func (cli *Client) StartReceiveLoops(ctx context.Context) (chan SignalConnection Event: SignalConnectionEventError, Err: currentStatus.Err, } + } else if currentStatus.Event == web.SignalWebsocketConnectionEventFatalError { + statusToSend = SignalConnectionStatus{ + Event: SignalConnectionEventFatalError, + Err: currentStatus.Err, + } } else if currentStatus.Event == web.SignalWebsocketConnectionEventCleanShutdown { statusToSend = SignalConnectionStatus{ Event: SignalConnectionCleanShutdown, diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index c4572d6..ca09208 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -73,6 +73,7 @@ const ( SignalWebsocketConnectionEventDisconnected SignalWebsocketConnectionEventLoggedOut SignalWebsocketConnectionEventError + SignalWebsocketConnectionEventFatalError SignalWebsocketConnectionEventCleanShutdown ) @@ -83,6 +84,7 @@ var signalWebsocketConnectionEventNames = map[SignalWebsocketConnectionEvent]str SignalWebsocketConnectionEventDisconnected: "SignalWebsocketConnectionEventDisconnected", SignalWebsocketConnectionEventLoggedOut: "SignalWebsocketConnectionEventLoggedOut", SignalWebsocketConnectionEventError: "SignalWebsocketConnectionEventError", + SignalWebsocketConnectionEventFatalError: "SignalWebsocketConnectionEventFatalError", SignalWebsocketConnectionEventCleanShutdown: "SignalWebsocketConnectionEventCleanShutdown", } @@ -275,7 +277,7 @@ func (s *SignalWebsocket) connectLoop( return // NOT RETRYING, KILLING THE CONNECTION LOOP } else if resp.StatusCode > 0 && resp.StatusCode < 500 { // Unexpected status code - s.pushStatus(ctx, SignalWebsocketConnectionEventError, fmt.Errorf("unexpected status opening websocket: %v", resp.Status)) + s.pushStatus(ctx, SignalWebsocketConnectionEventFatalError, fmt.Errorf("unexpected status opening websocket: %v", resp.Status)) return // NOT RETRYING, KILLING THE CONNECTION LOOP } else { // Something is very wrong From 865642be07e1c987a7e2e7ce608c5e0d7179ac11 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 20 Oct 2025 12:36:42 +0300 Subject: [PATCH 018/170] docker: use gitlab dependency proxy for CI builds --- Dockerfile.ci | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile.ci b/Dockerfile.ci index dc554ab..7d34502 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -1,4 +1,6 @@ -FROM alpine:3.22 +ARG DOCKER_HUB="docker.io" + +FROM ${DOCKER_HUB}/alpine:3.22 ENV UID=1337 \ GID=1337 From d63cf0106bc47a9ff2a6202b782481a14dce3999 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 22 Oct 2025 21:49:59 +0300 Subject: [PATCH 019/170] all: add support for PNI ghosts to bridge invites/bans (#612) --- go.mod | 2 +- go.sum | 4 +- pkg/connector/chatinfo.go | 75 ++++++++---- pkg/connector/groupinfo.go | 219 ++++++++++++++++------------------ pkg/connector/handlematrix.go | 75 ++++++++---- pkg/connector/id.go | 19 +++ pkg/signalid/ids.go | 33 ++++- pkg/signalmeow/groups.go | 15 +-- 8 files changed, 261 insertions(+), 181 deletions(-) diff --git a/go.mod b/go.mod index 0613f9b..2fabdcc 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.46.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.3-0.20251020084845-56b182f85d04 + maunium.net/go/mautrix v0.25.3-0.20251022182546-33d8d658fe98 ) require ( diff --git a/go.sum b/go.sum index 560e1b9..b7850bf 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.3-0.20251020084845-56b182f85d04 h1:OPcp3Bh6PyF282Siq7/d84XZHaNSm74N9VINAeYEQys= -maunium.net/go/mautrix v0.25.3-0.20251020084845-56b182f85d04/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= +maunium.net/go/mautrix v0.25.3-0.20251022182546-33d8d658fe98 h1:0cTTVYsfTyXaoqFYz4MoHfMv+zps+Gh3dbQtDn4mtHo= +maunium.net/go/mautrix v0.25.3-0.20251022182546-33d8d658fe98/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 55dcf9e..88cf3e2 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -45,13 +45,16 @@ var ( _ bridgev2.IdentifierResolvingNetworkAPI = (*SignalClient)(nil) _ bridgev2.GroupCreatingNetworkAPI = (*SignalClient)(nil) _ bridgev2.ContactListingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.GhostDMCreatingNetworkAPI = (*SignalClient)(nil) ) +var _ bridgev2.IdentifierValidatingNetwork = (*SignalConnector)(nil) + const PrivateChatTopic = "Signal private chat" const NoteToSelfName = "Signal Note to Self" func (s *SignalClient) GetUserInfoWithRefreshAfter(ctx context.Context, ghost *bridgev2.Ghost, refreshAfter time.Duration) (*bridgev2.UserInfo, error) { - userID, err := signalid.ParseUserID(ghost.ID) + userID, err := signalid.ParseUserIDAsServiceID(ghost.ID) if err != nil { return nil, err } @@ -59,12 +62,17 @@ func (s *SignalClient) GetUserInfoWithRefreshAfter(ctx context.Context, ghost *b // Don't do unnecessary fetches in background mode return nil, nil } - contact, err := s.Client.ContactByACIWithRefreshAfter(ctx, userID, refreshAfter) + var contact *types.Recipient + if userID.Type == libsignalgo.ServiceIDTypePNI { + contact, err = s.Client.Store.RecipientStore.LoadAndUpdateRecipient(ctx, uuid.Nil, userID.UUID, nil) + } else { + contact, err = s.Client.ContactByACIWithRefreshAfter(ctx, userID.UUID, refreshAfter) + } if err != nil { return nil, err } meta := ghost.Metadata.(*signalid.GhostMetadata) - if !s.Main.Config.UseOutdatedProfiles && meta.ProfileFetchedAt.After(contact.Profile.FetchedAt) { + if userID.Type != libsignalgo.ServiceIDTypePNI && (!s.Main.Config.UseOutdatedProfiles && meta.ProfileFetchedAt.After(contact.Profile.FetchedAt)) { return nil, nil } return s.contactToUserInfo(ctx, contact) @@ -157,18 +165,41 @@ func (s *SignalClient) contactToUserInfo(ctx context.Context, contact *types.Rec return ui, nil } -var _ bridgev2.IdentifierValidatingNetwork = (*SignalConnector)(nil) - func (s *SignalConnector) ValidateUserID(id networkid.UserID) bool { _, err := signalid.ParseUserIDAsServiceID(id) return err == nil } -func (s *SignalClient) ResolveIdentifier(ctx context.Context, number string, createChat bool) (*bridgev2.ResolveIdentifierResponse, error) { +func (s *SignalClient) CreateChatWithGhost(ctx context.Context, ghost *bridgev2.Ghost) (*bridgev2.CreateChatResponse, error) { + parsedID, err := signalid.ParseUserIDAsServiceID(ghost.ID) + if err != nil { + return nil, err + } + resp, err := s.ResolveIdentifier(ctx, parsedID.String(), true) + if err != nil { + return nil, err + } else if resp == nil { + return nil, nil + } + resultID, err := signalid.ParseUserIDAsServiceID(resp.UserID) + if err != nil { + return nil, fmt.Errorf("failed to parse result user ID: %w", err) + } + if parsedID.Type == libsignalgo.ServiceIDTypePNI { + if resultID.Type == libsignalgo.ServiceIDTypeACI && !resultID.IsEmpty() { + resp.Chat.DMRedirectedTo = resp.UserID + } else { + resp.Chat.DMRedirectedTo = bridgev2.SpecialValueDMRedirectedToBot + } + } + return resp.Chat, nil +} + +func (s *SignalClient) ResolveIdentifier(ctx context.Context, number string, _ bool) (*bridgev2.ResolveIdentifierResponse, error) { var aci, pni uuid.UUID var e164Number uint64 var recipient *types.Recipient - serviceID, err := libsignalgo.ServiceIDFromString(number) + serviceID, err := signalid.ParseUserIDAsServiceID(networkid.UserID(number)) if err != nil { number, err = bridgev2.CleanPhoneNumber(number) if err != nil { @@ -216,25 +247,23 @@ func (s *SignalClient) ResolveIdentifier(ctx context.Context, number string, cre return nil, fmt.Errorf("failed to convert contact: %w", err) } - // createChat is a no-op: chats don't need to be created, and we always return chat info + var userID networkid.UserID if aci != uuid.Nil { - ghost, err := s.Main.Bridge.GetGhostByID(ctx, signalid.MakeUserID(aci)) - if err != nil { - return nil, fmt.Errorf("failed to get ghost: %w", err) - } - return &bridgev2.ResolveIdentifierResponse{ - UserID: signalid.MakeUserID(aci), - UserInfo: userInfo, - Ghost: ghost, - Chat: s.makeCreateDMResponse(ctx, recipient, nil), - }, nil + userID = signalid.MakeUserID(aci) } else { - return &bridgev2.ResolveIdentifierResponse{ - UserID: signalid.MakeUserIDFromServiceID(libsignalgo.NewPNIServiceID(pni)), - UserInfo: userInfo, - Chat: s.makeCreateDMResponse(ctx, recipient, nil), - }, nil + userID = signalid.MakeUserIDFromServiceID(libsignalgo.NewPNIServiceID(pni)) } + // createChat is a no-op: chats don't need to be created, and we always return chat info + resp := &bridgev2.ResolveIdentifierResponse{ + UserID: userID, + UserInfo: userInfo, + Chat: s.makeCreateDMResponse(ctx, recipient, nil), + } + resp.Ghost, err = s.Main.Bridge.GetGhostByID(ctx, resp.UserID) + if err != nil { + return nil, fmt.Errorf("failed to get ghost: %w", err) + } + return resp, nil } func (s *SignalClient) CreateGroup(ctx context.Context, params *bridgev2.GroupCreateParams) (*bridgev2.CreateChatResponse, error) { diff --git a/pkg/connector/groupinfo.go b/pkg/connector/groupinfo.go index 56256c5..a025fa4 100644 --- a/pkg/connector/groupinfo.go +++ b/pkg/connector/groupinfo.go @@ -123,43 +123,30 @@ func (s *SignalClient) wrapGroupInfo(ctx context.Context, groupInfo *signalmeow. applyMembersAccess(members.PowerLevels, groupInfo.AccessControl.Members) joinRule = inviteLinkToJoinRule(groupInfo.AccessControl.AddFromInviteLink) } - for _, member := range groupInfo.Members { - evtSender := s.makeEventSender(member.ACI) - members.MemberMap[evtSender.Sender] = bridgev2.ChatMember{ - EventSender: evtSender, - PowerLevel: roleToPL(member.Role), - Membership: event.MembershipJoin, - } + for _, member := range groupInfo.RequestingMembers { + members.MemberMap.Set(bridgev2.ChatMember{ + EventSender: s.makeEventSender(member.ACI), + Membership: event.MembershipKnock, + }) } for _, member := range groupInfo.PendingMembers { - aci := s.maybeResolvePNItoACI(ctx, &member.ServiceID) - if aci == nil { - continue - } - evtSender := s.makeEventSender(*aci) - members.MemberMap[evtSender.Sender] = bridgev2.ChatMember{ - EventSender: evtSender, - PowerLevel: roleToPL(member.Role), - Membership: event.MembershipInvite, - } + s.addChatMemberWithACIQuery(ctx, members.MemberMap, member.ServiceID, bridgev2.ChatMember{ + PowerLevel: roleToPL(member.Role), + Membership: event.MembershipInvite, + MemberSender: s.makeEventSender(member.AddedByUserID), + }) } - for _, member := range groupInfo.RequestingMembers { - evtSender := s.makeEventSender(member.ACI) - members.MemberMap[evtSender.Sender] = bridgev2.ChatMember{ - EventSender: evtSender, - Membership: event.MembershipKnock, - } + for _, member := range groupInfo.Members { + members.MemberMap.Set(bridgev2.ChatMember{ + EventSender: s.makeEventSender(member.ACI), + PowerLevel: roleToPL(member.Role), + Membership: event.MembershipJoin, + }) } for _, member := range groupInfo.BannedMembers { - aci := s.maybeResolvePNItoACI(ctx, &member.ServiceID) - if aci == nil { - continue - } - evtSender := s.makeEventSender(*aci) - members.MemberMap[evtSender.Sender] = bridgev2.ChatMember{ - EventSender: evtSender, - Membership: event.MembershipBan, - } + s.addChatMemberWithACIQuery(ctx, members.MemberMap, member.ServiceID, bridgev2.ChatMember{ + Membership: event.MembershipBan, + }) } if backupChat == nil { var err error @@ -191,6 +178,10 @@ func (s *SignalClient) wrapGroupInfo(ctx context.Context, groupInfo *signalmeow. }, nil } +func addMemberToMap(mc map[networkid.UserID]bridgev2.ChatMember, member bridgev2.ChatMember) { + mc[member.EventSender.Sender] = member +} + func updatePortalSyncMeta(ctx context.Context, portal *bridgev2.Portal) bool { meta := portal.Metadata.(*signalid.PortalMetadata) meta.LastSync = jsontime.UnixNow() @@ -286,131 +277,127 @@ func (s *SignalClient) groupChangeToChatInfoChange(ctx context.Context, groupID JoinRule: inviteLinkToJoinRule(*groupChange.ModifyAddFromInviteLinkAccess), } } - var mc []bridgev2.ChatMember - for _, member := range groupChange.AddMembers { - mc = append(mc, bridgev2.ChatMember{ - EventSender: s.makeEventSender(member.ACI), - PowerLevel: roleToPL(member.Role), - Membership: event.MembershipJoin, - }) - } - for _, member := range groupChange.ModifyMemberRoles { - mc = append(mc, bridgev2.ChatMember{ - EventSender: s.makeEventSender(member.ACI), - PowerLevel: roleToPL(member.Role), - Membership: event.MembershipJoin, - }) - } - bannedMembers := make(map[libsignalgo.ServiceID]bool) - for _, member := range groupChange.AddBannedMembers { - aci := s.maybeResolvePNItoACI(ctx, &member.ServiceID) - if aci == nil { - continue - } - bannedMembers[member.ServiceID] = true - mc = append(mc, bridgev2.ChatMember{ - EventSender: s.makeEventSender(*aci), - Membership: event.MembershipBan, - }) - } - for _, memberACI := range groupChange.DeleteMembers { - if bannedMembers[libsignalgo.NewACIServiceID(*memberACI)] { - continue - } - mc = append(mc, bridgev2.ChatMember{ - EventSender: s.makeEventSender(*memberACI), - Membership: event.MembershipLeave, - PrevMembership: event.MembershipJoin, - }) - } + mc := make(bridgev2.ChatMemberMap) for _, member := range groupChange.AddPendingMembers { - aci := s.maybeResolvePNItoACI(ctx, &member.ServiceID) - if aci == nil { - continue - } - mc = append(mc, bridgev2.ChatMember{ - EventSender: s.makeEventSender(*aci), - PowerLevel: roleToPL(member.Role), - Membership: event.MembershipInvite, - }) - } - for _, memberServiceID := range groupChange.DeletePendingMembers { - if bannedMembers[*memberServiceID] { - continue - } - aci := s.maybeResolvePNItoACI(ctx, memberServiceID) - if aci == nil { - continue - } - mc = append(mc, bridgev2.ChatMember{ - EventSender: s.makeEventSender(*aci), - Membership: event.MembershipLeave, - PrevMembership: event.MembershipInvite, + s.addChatMemberWithACIQuery(ctx, mc, member.ServiceID, bridgev2.ChatMember{ + PowerLevel: roleToPL(member.Role), + Membership: event.MembershipInvite, + PrevMembership: event.MembershipLeave, + MemberSender: s.makeEventSender(member.AddedByUserID), }) } for _, member := range groupChange.AddRequestingMembers { - mc = append(mc, bridgev2.ChatMember{ + mc.Set(bridgev2.ChatMember{ EventSender: s.makeEventSender(member.ACI), Membership: event.MembershipKnock, }) } + for _, memberServiceID := range groupChange.DeletePendingMembers { + s.addChatMemberWithACIQuery(ctx, mc, *memberServiceID, bridgev2.ChatMember{ + Membership: event.MembershipLeave, + PrevMembership: event.MembershipInvite, + }) + } for _, memberACI := range groupChange.DeleteRequestingMembers { - if bannedMembers[libsignalgo.NewACIServiceID(*memberACI)] { - continue - } - mc = append(mc, bridgev2.ChatMember{ + mc.Set(bridgev2.ChatMember{ EventSender: s.makeEventSender(*memberACI), Membership: event.MembershipLeave, PrevMembership: event.MembershipKnock, }) } + for _, memberACI := range groupChange.DeleteMembers { + mc.Set(bridgev2.ChatMember{ + EventSender: s.makeEventSender(*memberACI), + Membership: event.MembershipLeave, + PrevMembership: event.MembershipJoin, + }) + } for _, memberServiceID := range groupChange.DeleteBannedMembers { - aci := s.maybeResolvePNItoACI(ctx, memberServiceID) - if aci == nil { - continue - } - mc = append(mc, bridgev2.ChatMember{ - EventSender: s.makeEventSender(*aci), + s.addChatMemberWithACIQuery(ctx, mc, *memberServiceID, bridgev2.ChatMember{ Membership: event.MembershipLeave, PrevMembership: event.MembershipBan, }) } + for _, member := range groupChange.AddBannedMembers { + s.addChatMemberWithACIQuery(ctx, mc, member.ServiceID, bridgev2.ChatMember{ + Membership: event.MembershipBan, + }) + } for _, member := range groupChange.PromotePendingMembers { - mc = append(mc, bridgev2.ChatMember{ + mc.Set(bridgev2.ChatMember{ EventSender: s.makeEventSender(member.ACI), Membership: event.MembershipJoin, PrevMembership: event.MembershipInvite, }) } for _, member := range groupChange.PromotePendingPniAciMembers { - mc = append(mc, bridgev2.ChatMember{ - EventSender: s.makeEventSender(member.ACI), - Membership: event.MembershipJoin, + mc.Set(bridgev2.ChatMember{ + EventSender: s.makeEventSender(member.ACI), + Membership: event.MembershipJoin, + }) + mc.Set(bridgev2.ChatMember{ + EventSender: s.makePNIEventSender(member.PNI), + Membership: event.MembershipLeave, PrevMembership: event.MembershipInvite, + MemberEventExtra: map[string]any{ + "com.beeper.exclude_from_timeline": true, + }, }) } for _, member := range groupChange.PromoteRequestingMembers { - mc = append(mc, bridgev2.ChatMember{ + mc.Set(bridgev2.ChatMember{ EventSender: s.makeEventSender(member.ACI), Membership: event.MembershipJoin, PrevMembership: event.MembershipKnock, }) } + for _, member := range groupChange.AddMembers { + mc.Set(bridgev2.ChatMember{ + EventSender: s.makeEventSender(member.ACI), + PowerLevel: roleToPL(member.Role), + Membership: event.MembershipJoin, + }) + } + for _, member := range groupChange.ModifyMemberRoles { + mc.Set(bridgev2.ChatMember{ + EventSender: s.makeEventSender(member.ACI), + PowerLevel: roleToPL(member.Role), + Membership: event.MembershipJoin, + }) + } if len(mc) > 0 || pls != nil { - ic.MemberChanges = &bridgev2.ChatMemberList{Members: mc, PowerLevels: pls} + ic.MemberChanges = &bridgev2.ChatMemberList{MemberMap: mc, PowerLevels: pls} } return ic, nil } -func (s *SignalClient) maybeResolvePNItoACI(ctx context.Context, serviceID *libsignalgo.ServiceID) *uuid.UUID { - if serviceID.Type == libsignalgo.ServiceIDTypeACI { - return &serviceID.UUID +func (s *SignalClient) addChatMemberWithACIQuery( + ctx context.Context, mc bridgev2.ChatMemberMap, serviceID libsignalgo.ServiceID, member bridgev2.ChatMember, +) { + member.EventSender = s.makeEventSenderFromServiceID(serviceID) + mc.Set(member) + if aci := s.tryResolvePNItoLoggedInACI(ctx, serviceID); aci != nil { + member.EventSender = s.makeEventSender(*aci) + mc.Add(member) } - device, err := s.Client.Store.DeviceStore.DeviceByPNI(ctx, serviceID.UUID) - if err != nil || device == nil { +} + +func (s *SignalClient) tryResolvePNItoLoggedInACI(ctx context.Context, serviceID libsignalgo.ServiceID) *uuid.UUID { + if serviceID.Type != libsignalgo.ServiceIDTypePNI { return nil + } else if serviceID.UUID == s.Client.Store.PNI { + return &s.Client.Store.ACI + } else if s.Main.Bridge.Config.SplitPortals { + // When split portals is enabled, we don't care about anyone else's logins + return nil + } else if device, err := s.Client.Store.DeviceStore.DeviceByPNI(ctx, serviceID.UUID); err != nil { + zerolog.Ctx(ctx).Err(err).Msg("Failed to get ACI for PNI") + return nil + } else if device == nil { + return nil + } else { + return &device.ACI } - return &device.ACI } func (s *SignalClient) catchUpGroup(ctx context.Context, portal *bridgev2.Portal, fromRevision, toRevision uint32, ts uint64) { @@ -443,8 +430,8 @@ func (s *SignalClient) catchUpGroup(ctx context.Context, portal *bridgev2.Portal chatInfoChange, err := s.groupChangeToChatInfoChange(ctx, types.GroupIdentifier(portal.ID), gc.GroupChange.Revision, gc.GroupChange) if err != nil { log.Err(err).Msg("Failed to convert group info") - } else if gc.GroupChange.SourceServiceID.Type == libsignalgo.ServiceIDTypeACI { - portal.ProcessChatInfoChange(ctx, s.makeEventSender(gc.GroupChange.SourceServiceID.UUID), s.UserLogin, chatInfoChange, time.UnixMilli(int64(ts))) + } else { + portal.ProcessChatInfoChange(ctx, s.makeEventSenderFromServiceID(gc.GroupChange.SourceServiceID), s.UserLogin, chatInfoChange, time.UnixMilli(int64(ts))) } if gc.GroupChange.Revision == toRevision { break diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 1a10773..dec5341 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -387,7 +387,7 @@ func (s *SignalClient) HandleMatrixRoomTopic(ctx context.Context, msg *bridgev2. func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2.MatrixMembershipChange) (bool, error) { var targetIntent bridgev2.MatrixAPI - var targetSignalID uuid.UUID + var targetSignalID libsignalgo.ServiceID var err error if msg.Portal.RoomType == database.RoomTypeDM { //TODO: this probably needs to revert some changes and clean up the portal on leaves @@ -434,21 +434,35 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 } switch msg.Type { case bridgev2.AcceptInvite: + if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { + return false, fmt.Errorf("can't accept invite for non-ACI service ID") + } gc.PromotePendingMembers = []*signalmeow.PromotePendingMember{{ - ACI: targetSignalID, + ACI: targetSignalID.UUID, }} case bridgev2.RevokeInvite, bridgev2.RejectInvite: - deletePendingMember := libsignalgo.NewACIServiceID(targetSignalID) - gc.DeletePendingMembers = []*libsignalgo.ServiceID{&deletePendingMember} + gc.DeletePendingMembers = []*libsignalgo.ServiceID{&targetSignalID} case bridgev2.Leave, bridgev2.Kick: - gc.DeleteMembers = []*uuid.UUID{&targetSignalID} + if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { + return false, fmt.Errorf("can't kick non-ACI service ID") + } + gc.DeleteMembers = []*uuid.UUID{&targetSignalID.UUID} case bridgev2.Invite: - gc.AddMembers = []*signalmeow.AddMember{{ - GroupMember: signalmeow.GroupMember{ - ACI: targetSignalID, - Role: role, - }, - }} + if targetSignalID.Type == libsignalgo.ServiceIDTypeACI { + gc.AddMembers = []*signalmeow.AddMember{{ + GroupMember: signalmeow.GroupMember{ + ACI: targetSignalID.UUID, + Role: role, + }, + }} + } else { + gc.AddPendingMembers = []*signalmeow.PendingMember{{ + ServiceID: targetSignalID, + Role: role, + AddedByUserID: s.Client.Store.ACI, + Timestamp: uint64(msg.Event.Timestamp), + }} + } // TODO: joining and knocking requires a way to obtain the invite link // because the joining/knocking member doesn't have the GroupMasterKey yet // case bridgev2.Join: @@ -465,29 +479,39 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 // Timestamp: uint64(time.Now().UnixMilli()), // }} case bridgev2.AcceptKnock: + if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { + return false, fmt.Errorf("can't accept knock from non-ACI service ID") + } gc.PromoteRequestingMembers = []*signalmeow.RoleMember{{ - ACI: targetSignalID, + ACI: targetSignalID.UUID, Role: role, }} case bridgev2.RetractKnock, bridgev2.RejectKnock: - gc.DeleteRequestingMembers = []*uuid.UUID{&targetSignalID} + if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { + return false, fmt.Errorf("can't reject knock from non-ACI service ID") + } + gc.DeleteRequestingMembers = []*uuid.UUID{&targetSignalID.UUID} case bridgev2.BanKnocked, bridgev2.BanInvited, bridgev2.BanJoined, bridgev2.BanLeft: gc.AddBannedMembers = []*signalmeow.BannedMember{{ - ServiceID: libsignalgo.NewACIServiceID(targetSignalID), + ServiceID: targetSignalID, Timestamp: uint64(time.Now().UnixMilli()), }} switch msg.Type { case bridgev2.BanJoined: - gc.DeleteMembers = []*uuid.UUID{&targetSignalID} + if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { + return false, fmt.Errorf("can't ban joined non-ACI service ID") + } + gc.DeleteMembers = []*uuid.UUID{&targetSignalID.UUID} case bridgev2.BanInvited: - deletePendingMember := libsignalgo.NewACIServiceID(targetSignalID) - gc.DeletePendingMembers = []*libsignalgo.ServiceID{&deletePendingMember} + gc.DeletePendingMembers = []*libsignalgo.ServiceID{&targetSignalID} case bridgev2.BanKnocked: - gc.DeleteRequestingMembers = []*uuid.UUID{&targetSignalID} + if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { + return false, fmt.Errorf("can't ban knocked non-ACI service ID") + } + gc.DeleteRequestingMembers = []*uuid.UUID{&targetSignalID.UUID} } case bridgev2.Unban: - unbanUser := libsignalgo.NewACIServiceID(targetSignalID) - gc.DeleteBannedMembers = []*libsignalgo.ServiceID{&unbanUser} + gc.DeleteBannedMembers = []*libsignalgo.ServiceID{&targetSignalID} default: log.Debug().Msg("unsupported membership change") return false, nil @@ -501,7 +525,7 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 if err != nil { return false, err } - if msg.Type == bridgev2.Invite { + if msg.Type == bridgev2.Invite && targetSignalID.Type != libsignalgo.ServiceIDTypePNI { err = targetIntent.EnsureJoined(ctx, msg.Portal.MXID) if err != nil { return false, err @@ -540,18 +564,17 @@ func (s *SignalClient) HandleMatrixPowerLevels(ctx context.Context, msg *bridgev if msg.Portal.RoomType == database.RoomTypeDM { return false, nil } - log := zerolog.Ctx(ctx) gc := &signalmeow.GroupChange{} for _, plc := range msg.Users { if !hasAdminChanged(&plc.SinglePowerLevelChange) { continue } - aci, err := signalid.ParseGhostOrUserLoginID(plc.Target) - if err != nil { - log.Err(err).Msg("Couldn't parse user id") + serviceID, err := signalid.ParseGhostOrUserLoginID(plc.Target) + if err != nil || serviceID.Type != libsignalgo.ServiceIDTypeACI { + continue } gc.ModifyMemberRoles = append(gc.ModifyMemberRoles, &signalmeow.RoleMember{ - ACI: aci, + ACI: serviceID.UUID, Role: plToRole(plc.NewLevel), }) } diff --git a/pkg/connector/id.go b/pkg/connector/id.go index 16cb7dc..4c3f123 100644 --- a/pkg/connector/id.go +++ b/pkg/connector/id.go @@ -17,6 +17,8 @@ package connector import ( + "fmt" + "github.com/google/uuid" "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/networkid" @@ -48,3 +50,20 @@ func (s *SignalClient) makeEventSender(sender uuid.UUID) bridgev2.EventSender { Sender: signalid.MakeUserID(sender), } } + +func (s *SignalClient) makePNIEventSender(sender uuid.UUID) bridgev2.EventSender { + return bridgev2.EventSender{ + Sender: signalid.MakeUserIDFromServiceID(libsignalgo.NewPNIServiceID(sender)), + } +} + +func (s *SignalClient) makeEventSenderFromServiceID(serviceID libsignalgo.ServiceID) bridgev2.EventSender { + switch serviceID.Type { + case libsignalgo.ServiceIDTypeACI: + return s.makeEventSender(serviceID.UUID) + case libsignalgo.ServiceIDTypePNI: + return s.makePNIEventSender(serviceID.UUID) + default: + panic(fmt.Errorf("invalid service ID type %d", serviceID.Type)) + } +} diff --git a/pkg/signalid/ids.go b/pkg/signalid/ids.go index 79ba90f..daa9200 100644 --- a/pkg/signalid/ids.go +++ b/pkg/signalid/ids.go @@ -48,19 +48,33 @@ func ParseUserLoginID(userLoginID networkid.UserLoginID) (uuid.UUID, error) { return userID, nil } -func ParseGhostOrUserLoginID(ghostOrUserLogin bridgev2.GhostOrUserLogin) (uuid.UUID, error) { +func toServiceID(id uuid.UUID, err error) (libsignalgo.ServiceID, error) { + if err != nil { + return libsignalgo.ServiceID{}, err + } + return libsignalgo.NewACIServiceID(id), nil +} + +func ParseGhostOrUserLoginID(ghostOrUserLogin bridgev2.GhostOrUserLogin) (libsignalgo.ServiceID, error) { switch ghostOrUserLogin := ghostOrUserLogin.(type) { case *bridgev2.UserLogin: - return ParseUserLoginID(ghostOrUserLogin.ID) + return toServiceID(ParseUserLoginID(ghostOrUserLogin.ID)) case *bridgev2.Ghost: - return ParseUserID(ghostOrUserLogin.ID) + return ParseUserIDAsServiceID(ghostOrUserLogin.ID) default: - return uuid.Nil, fmt.Errorf("cannot parse ID: unknown type: %T", ghostOrUserLogin) + return libsignalgo.ServiceID{}, fmt.Errorf("cannot parse ID: unknown type: %T", ghostOrUserLogin) } } +const pniUserIDPrefix = "pni_" +const pniServiceIDPrefix = "PNI:" + func ParseUserIDAsServiceID(userID networkid.UserID) (libsignalgo.ServiceID, error) { - return libsignalgo.ServiceIDFromString(string(userID)) + userIDStr := string(userID) + if strings.HasPrefix(userIDStr, pniUserIDPrefix) { + userIDStr = pniServiceIDPrefix + userIDStr[len(pniUserIDPrefix):] + } + return libsignalgo.ServiceIDFromString(userIDStr) } func ParsePortalID(portalID networkid.PortalID) (userID libsignalgo.ServiceID, groupID types.GroupIdentifier, err error) { @@ -103,7 +117,14 @@ func MakeUserID(user uuid.UUID) networkid.UserID { } func MakeUserIDFromServiceID(user libsignalgo.ServiceID) networkid.UserID { - return networkid.UserID(user.String()) + switch user.Type { + case libsignalgo.ServiceIDTypeACI: + return MakeUserID(user.UUID) + case libsignalgo.ServiceIDTypePNI: + return networkid.UserID(pniUserIDPrefix + user.UUID.String()) + default: + panic(fmt.Errorf("invalid service ID type %d", user.Type)) + } } func MakeUserLoginID(user uuid.UUID) networkid.UserLoginID { diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index de6e054..d938e10 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -831,9 +831,6 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange log.Err(err).Msg("Couldn't decrypt source serviceID") return nil, err } - if sourceServiceID.Type != libsignalgo.ServiceIDTypeACI { - return nil, fmt.Errorf("wrong serviceid kind: expected aci, got pni") - } decryptedGroupChange := &GroupChange{ GroupMasterKey: groupMasterKey, Revision: encryptedActions.Revision, @@ -891,7 +888,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange return nil, err } if serviceID.Type != libsignalgo.ServiceIDTypeACI { - return nil, fmt.Errorf("Wrong ServiceID kind: expected ACI, got PNI") + return nil, fmt.Errorf("wrong ServiceID kind for delete member: expected ACI, got PNI") } decryptedGroupChange.DeleteMembers = append(decryptedGroupChange.DeleteMembers, &serviceID.UUID) } @@ -904,7 +901,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange return nil, err } if serviceID.Type != libsignalgo.ServiceIDTypeACI { - return nil, fmt.Errorf("Wrong ServiceID kind: expected ACI, got PNI") + return nil, fmt.Errorf("wrong ServiceID kind for modify member: expected ACI, got PNI") } decryptedGroupChange.ModifyMemberRoles = append(decryptedGroupChange.ModifyMemberRoles, &RoleMember{ ACI: serviceID.UUID, @@ -992,7 +989,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange return nil, err } if pniServiceID.Type != libsignalgo.ServiceIDTypePNI { - return nil, fmt.Errorf("Wrong ServiceID kind: expected PNI, got ACI") + return nil, fmt.Errorf("wrong ServiceID kind for promote pending pni->aci: expected PNI, got ACI") } decryptedGroupChange.PromotePendingPniAciMembers = append(decryptedGroupChange.PromotePendingPniAciMembers, &PromotePendingPniAciMember{ ACI: *aci, @@ -1147,7 +1144,7 @@ func decryptPKeyAndIDorPresentation(ctx context.Context, userID []byte, profileK return nil, nil, err } if serviceID.Type == libsignalgo.ServiceIDTypePNI { - return nil, nil, fmt.Errorf("wrong serviceid kind, expected ACI, got PNI") + return nil, nil, fmt.Errorf("wrong serviceid kind for profile key: expected ACI, got PNI") } return &serviceID.UUID, profileKey, nil @@ -1808,6 +1805,10 @@ func (cli *Client) GetGroupHistoryPage(ctx context.Context, gid types.GroupIdent Password: &groupAuth.Password, ContentType: web.ContentTypeProtobuf, Host: web.StorageHostname, + Headers: map[string]string{ + // TODO actually cache the data and provide real expiry timestamp + "Cached-Send-Endorsements": "0", + }, } // highest known epoch seems to always be 5, but that may change in the future. includeLastState is always false path := fmt.Sprintf("/v2/groups/logs/%d?maxSupportedChangeEpoch=%d&includeFirstState=%t&includeLastState=false", fromRevision, 5, includeFirstState) From 41311f917cd2a6ea0d606ada4318eae310b4808a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 22 Oct 2025 21:50:24 +0300 Subject: [PATCH 020/170] signalmeow/sending: don't clear needs PNI signature flag for typing/receipts --- pkg/signalmeow/sending.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 5c3612e..d5f7076 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -690,8 +690,9 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv } else if recipientID.Type == libsignalgo.ServiceIDTypePNI { pni = recipientID.UUID } + isTypingOrReceipt := content.TypingMessage != nil || content.ReceiptMessage != nil recipientData, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aci, pni, func(recipientData *types.Recipient) (changed bool, err error) { - if recipientID.Type == libsignalgo.ServiceIDTypeACI && recipientData.NeedsPNISignature { + if recipientID.Type == libsignalgo.ServiceIDTypeACI && recipientData.NeedsPNISignature && !isTypingOrReceipt { needsPNISignature = true zerolog.Ctx(ctx).Debug(). Stringer("recipient", recipientID). @@ -713,7 +714,7 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv zerolog.Ctx(ctx).Err(err).Msg("Failed to get message recipient data") } // Treat needs PNI signature as "this is a message request" and don't send receipts/typing - if needsPNISignature && (content.TypingMessage != nil || content.ReceiptMessage != nil) { + if needsPNISignature && isTypingOrReceipt { zerolog.Ctx(ctx).Debug().Msg("Not sending typing/receipt message to recipient as needs PNI signature flag is set") res := SuccessfulSendResult{Recipient: recipientID} if content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_READ { From 9beafc1c2f83e7bc4b763c9a35a7cb9942c1a6a6 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 22 Oct 2025 22:00:54 +0300 Subject: [PATCH 021/170] signalmeow/sending: fix typing/receipts being sent to PNI --- pkg/signalmeow/sending.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index d5f7076..c1b2016 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -692,8 +692,8 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv } isTypingOrReceipt := content.TypingMessage != nil || content.ReceiptMessage != nil recipientData, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aci, pni, func(recipientData *types.Recipient) (changed bool, err error) { - if recipientID.Type == libsignalgo.ServiceIDTypeACI && recipientData.NeedsPNISignature && !isTypingOrReceipt { - needsPNISignature = true + needsPNISignature = recipientID.Type == libsignalgo.ServiceIDTypeACI && recipientData.NeedsPNISignature + if needsPNISignature && !isTypingOrReceipt { zerolog.Ctx(ctx).Debug(). Stringer("recipient", recipientID). Msg("Including PNI identity in message") From 69208e85683b6e680428b00aca4527fd93fe6231 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 23 Oct 2025 15:14:38 +0300 Subject: [PATCH 022/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2fabdcc..5fc3a9a 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.46.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.3-0.20251022182546-33d8d658fe98 + maunium.net/go/mautrix v0.25.3-0.20251023124911-1be49d53e4f3 ) require ( diff --git a/go.sum b/go.sum index b7850bf..f48dcac 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.3-0.20251022182546-33d8d658fe98 h1:0cTTVYsfTyXaoqFYz4MoHfMv+zps+Gh3dbQtDn4mtHo= -maunium.net/go/mautrix v0.25.3-0.20251022182546-33d8d658fe98/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= +maunium.net/go/mautrix v0.25.3-0.20251023124911-1be49d53e4f3 h1:C+inXVPJspCtjiLIP64npDR01o5Fs9bE9lg3jr0PzS4= +maunium.net/go/mautrix v0.25.3-0.20251023124911-1be49d53e4f3/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= From 5f3e2527025ea7707b1994ebbb72359978b57b60 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 23 Oct 2025 15:20:59 +0300 Subject: [PATCH 023/170] changelog: update --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9135702..4e38aa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v25.11 (unreleased) + +* Added support for bridging invite state in groups for phone number invites. +* Fixed PNI signature not being sent when replying to message requests. +* Fixed unnecessary repeating error notices when Signal is down. + # v25.10 * Switched to calendar versioning. From 0ededf479433f708cb7a60f4f072cc3552b7ad7b Mon Sep 17 00:00:00 2001 From: Radon Rosborough Date: Fri, 24 Oct 2025 08:51:17 -0700 Subject: [PATCH 024/170] build.sh: fail if prior steps fail (#609) --- build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sh b/build.sh index 2b51084..3ec20a6 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,5 @@ #!/bin/sh +set -e ./build-rust.sh cp -f pkg/libsignalgo/libsignal/target/release/libsignal_ffi.a . LIBRARY_PATH=.:$LIBRARY_PATH ./build-go.sh From afa38f4f9fc373f40ca8965e2ebc0a44880fe0ff Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 27 Oct 2025 18:07:14 +0200 Subject: [PATCH 025/170] msgconv/from-signal: match sticker size with native desktop --- pkg/msgconv/from-signal.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/msgconv/from-signal.go b/pkg/msgconv/from-signal.go index 277e2a5..ac3fe65 100644 --- a/pkg/msgconv/from-signal.go +++ b/pkg/msgconv/from-signal.go @@ -441,10 +441,11 @@ func (mc *MessageConverter) convertStickerToMatrix(ctx context.Context, sticker }, } } - // Signal stickers are 512x512, so tell Matrix clients to render them as 256x256 + // Signal stickers are 512x512, so tell Matrix clients to render them as 200x200 to match Signal + // https://github.com/signalapp/Signal-Desktop/blob/v7.77.0-beta.1/ts/components/conversation/Message.dom.tsx#L135 if converted.Content.Info.Width == 512 && converted.Content.Info.Height == 512 { - converted.Content.Info.Width = 256 - converted.Content.Info.Height = 256 + converted.Content.Info.Width = 200 + converted.Content.Info.Height = 200 } converted.Content.Body = sticker.GetEmoji() converted.Type = event.EventSticker From b3973632e5e27b6fa0cb083e9772663b084155ba Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 27 Oct 2025 19:03:38 +0200 Subject: [PATCH 026/170] capabilities: advertise supported state events and member actions Closes #614 Closes #613 --- go.mod | 2 +- go.sum | 4 ++-- pkg/connector/capabilities.go | 29 ++++++++++++++++++++++++++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 5fc3a9a..313f1ed 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.46.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.3-0.20251023124911-1be49d53e4f3 + maunium.net/go/mautrix v0.25.3-0.20251027163910-adc035b6a555 ) require ( diff --git a/go.sum b/go.sum index f48dcac..95c60ff 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.3-0.20251023124911-1be49d53e4f3 h1:C+inXVPJspCtjiLIP64npDR01o5Fs9bE9lg3jr0PzS4= -maunium.net/go/mautrix v0.25.3-0.20251023124911-1be49d53e4f3/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= +maunium.net/go/mautrix v0.25.3-0.20251027163910-adc035b6a555 h1:6D/kRJyT+5+RRnJErNNglVwDMYU6EwQN0bRYqcdkfZw= +maunium.net/go/mautrix v0.25.3-0.20251027163910-adc035b6a555/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= diff --git a/pkg/connector/capabilities.go b/pkg/connector/capabilities.go index 329a81d..b9cb632 100644 --- a/pkg/connector/capabilities.go +++ b/pkg/connector/capabilities.go @@ -25,6 +25,7 @@ import ( "go.mau.fi/util/ptr" "maunium.net/go/mautrix/bridgev2" + "maunium.net/go/mautrix/bridgev2/database" "maunium.net/go/mautrix/bridgev2/networkid" "maunium.net/go/mautrix/event" ) @@ -37,7 +38,7 @@ func supportedIfFFmpeg() event.CapabilitySupportLevel { } func capID() string { - base := "fi.mau.signal.capabilities.2025_08_25" + base := "fi.mau.signal.capabilities.2025_10_27" if ffmpeg.Supported() { return base + "+ffmpeg" } @@ -136,6 +137,19 @@ var signalCaps = &event.RoomFeatures{ MaxSize: MaxFileSize, }, }, + State: event.StateFeatureMap{ + event.StateRoomName.Type: {Level: event.CapLevelFullySupported}, + event.StateRoomAvatar.Type: {Level: event.CapLevelFullySupported}, + event.StateTopic.Type: {Level: event.CapLevelFullySupported}, + event.StateBeeperDisappearingTimer.Type: {Level: event.CapLevelFullySupported}, + }, + MemberActions: event.MemberFeatureMap{ + event.MemberActionInvite: event.CapLevelFullySupported, + event.MemberActionRevokeInvite: event.CapLevelFullySupported, + event.MemberActionLeave: event.CapLevelFullySupported, + event.MemberActionBan: event.CapLevelFullySupported, + event.MemberActionKick: event.CapLevelFullySupported, + }, MaxTextLength: MaxTextLength, // TODO support arbitrary sized text messages with files LocationMessage: event.CapLevelPartialSupport, Poll: event.CapLevelRejected, @@ -162,9 +176,16 @@ var signalDisappearingCap = &event.DisappearingTimerCapability{ } var signalCapsNoteToSelf *event.RoomFeatures +var signalCapsDM *event.RoomFeatures func init() { - signalCapsNoteToSelf = ptr.Clone(signalCaps) + signalCapsDM = ptr.Clone(signalCaps) + signalCapsDM.ID = capID() + "+dm" + signalCapsDM.MemberActions = nil + signalCapsDM.State = event.StateFeatureMap{ + event.StateBeeperDisappearingTimer.Type: {Level: event.CapLevelFullySupported}, + } + signalCapsNoteToSelf = ptr.Clone(signalCapsDM) signalCapsNoteToSelf.EditMaxAge = nil signalCapsNoteToSelf.DeleteMaxAge = nil signalCapsNoteToSelf.ID = capID() + "+note_to_self" @@ -173,6 +194,8 @@ func init() { func (s *SignalClient) GetCapabilities(ctx context.Context, portal *bridgev2.Portal) *event.RoomFeatures { if portal.Receiver == s.UserLogin.ID && portal.ID == networkid.PortalID(s.UserLogin.ID) { return signalCapsNoteToSelf + } else if portal.RoomType == database.RoomTypeDM { + return signalCapsDM } return signalCaps } @@ -206,5 +229,5 @@ func (s *SignalConnector) GetCapabilities() *bridgev2.NetworkGeneralCapabilities } func (s *SignalConnector) GetBridgeInfoVersion() (info, capabilities int) { - return 1, 5 + return 1, 6 } From dab89843b0ca14c0851f0b5032d38c3b29252755 Mon Sep 17 00:00:00 2001 From: Nick Mills-Barrett Date: Tue, 28 Oct 2025 12:40:17 +0000 Subject: [PATCH 027/170] handlematrix: return error when handling unsupported membership changes --- pkg/connector/handlematrix.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index dec5341..65e7b7c 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -513,8 +513,7 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 case bridgev2.Unban: gc.DeleteBannedMembers = []*libsignalgo.ServiceID{&targetSignalID} default: - log.Debug().Msg("unsupported membership change") - return false, nil + return false, fmt.Errorf("unsupported membership change: %s -> %s", msg.Type.From, msg.Type.To) } _, groupID, err := signalid.ParsePortalID(msg.Portal.ID) if err != nil || groupID == "" { From 6e49c340768e8f8521cf9ab4ea2e94e6fed3e1f3 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 28 Oct 2025 15:08:34 +0200 Subject: [PATCH 028/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 313f1ed..f61bdd1 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.46.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.3-0.20251027163910-adc035b6a555 + maunium.net/go/mautrix v0.25.3-0.20251028130646-bea28c1381cd ) require ( diff --git a/go.sum b/go.sum index 95c60ff..fa344cc 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.3-0.20251027163910-adc035b6a555 h1:6D/kRJyT+5+RRnJErNNglVwDMYU6EwQN0bRYqcdkfZw= -maunium.net/go/mautrix v0.25.3-0.20251027163910-adc035b6a555/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= +maunium.net/go/mautrix v0.25.3-0.20251028130646-bea28c1381cd h1:4OfgnwTd71vgHGc+kBwhWsb92ePZVvsDbyTLJiy+PKU= +maunium.net/go/mautrix v0.25.3-0.20251028130646-bea28c1381cd/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= From 6f840544e180794d5aa8e4d57cce0cdcaaca5fad Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 29 Oct 2025 14:10:25 +0200 Subject: [PATCH 029/170] signalmeow: update protobufs --- .../protobuf/ContactDiscovery.pb.go | 2 +- pkg/signalmeow/protobuf/DeviceName.pb.go | 2 +- pkg/signalmeow/protobuf/Groups.pb.go | 2 +- pkg/signalmeow/protobuf/Provisioning.pb.go | 2 +- pkg/signalmeow/protobuf/SignalService.pb.go | 735 ++++++---- pkg/signalmeow/protobuf/SignalService.proto | 24 +- .../protobuf/StickerResources.pb.go | 2 +- pkg/signalmeow/protobuf/StorageService.pb.go | 2 +- .../protobuf/UnidentifiedDelivery.pb.go | 2 +- .../protobuf/WebSocketResources.pb.go | 2 +- pkg/signalmeow/protobuf/backuppb/Backup.pb.go | 1304 ++++++++++------- pkg/signalmeow/protobuf/backuppb/Backup.proto | 27 + pkg/signalmeow/protobuf/update-protos.sh | 7 +- 13 files changed, 1339 insertions(+), 774 deletions(-) diff --git a/pkg/signalmeow/protobuf/ContactDiscovery.pb.go b/pkg/signalmeow/protobuf/ContactDiscovery.pb.go index 97ac6b4..5523a0e 100644 --- a/pkg/signalmeow/protobuf/ContactDiscovery.pb.go +++ b/pkg/signalmeow/protobuf/ContactDiscovery.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: ContactDiscovery.proto diff --git a/pkg/signalmeow/protobuf/DeviceName.pb.go b/pkg/signalmeow/protobuf/DeviceName.pb.go index e83e374..144428d 100644 --- a/pkg/signalmeow/protobuf/DeviceName.pb.go +++ b/pkg/signalmeow/protobuf/DeviceName.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: DeviceName.proto diff --git a/pkg/signalmeow/protobuf/Groups.pb.go b/pkg/signalmeow/protobuf/Groups.pb.go index 7178760..3e5cc7a 100644 --- a/pkg/signalmeow/protobuf/Groups.pb.go +++ b/pkg/signalmeow/protobuf/Groups.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: Groups.proto diff --git a/pkg/signalmeow/protobuf/Provisioning.pb.go b/pkg/signalmeow/protobuf/Provisioning.pb.go index 9e75ec2..d2f0a4d 100644 --- a/pkg/signalmeow/protobuf/Provisioning.pb.go +++ b/pkg/signalmeow/protobuf/Provisioning.pb.go @@ -4,7 +4,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: Provisioning.proto diff --git a/pkg/signalmeow/protobuf/SignalService.pb.go b/pkg/signalmeow/protobuf/SignalService.pb.go index fd875ac..ae5bd18 100644 --- a/pkg/signalmeow/protobuf/SignalService.pb.go +++ b/pkg/signalmeow/protobuf/SignalService.pb.go @@ -4,7 +4,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: SignalService.proto @@ -346,6 +346,7 @@ const ( DataMessage_CDN_SELECTOR_ATTACHMENTS DataMessage_ProtocolVersion = 5 DataMessage_MENTIONS DataMessage_ProtocolVersion = 6 DataMessage_PAYMENTS DataMessage_ProtocolVersion = 7 + DataMessage_POLLS DataMessage_ProtocolVersion = 8 DataMessage_CURRENT DataMessage_ProtocolVersion = 7 ) @@ -360,6 +361,7 @@ var ( 5: "CDN_SELECTOR_ATTACHMENTS", 6: "MENTIONS", 7: "PAYMENTS", + 8: "POLLS", // Duplicate value: 7: "CURRENT", } DataMessage_ProtocolVersion_value = map[string]int32{ @@ -371,6 +373,7 @@ var ( "CDN_SELECTOR_ATTACHMENTS": 5, "MENTIONS": 6, "PAYMENTS": 7, + "POLLS": 8, "CURRENT": 7, } ) @@ -473,6 +476,7 @@ type DataMessage_Quote_Type int32 const ( DataMessage_Quote_NORMAL DataMessage_Quote_Type = 0 DataMessage_Quote_GIFT_BADGE DataMessage_Quote_Type = 1 + DataMessage_Quote_POLL DataMessage_Quote_Type = 2 ) // Enum value maps for DataMessage_Quote_Type. @@ -480,10 +484,12 @@ var ( DataMessage_Quote_Type_name = map[int32]string{ 0: "NORMAL", 1: "GIFT_BADGE", + 2: "POLL", } DataMessage_Quote_Type_value = map[string]int32{ "NORMAL": 0, "GIFT_BADGE": 1, + "POLL": 2, } ) @@ -2126,7 +2132,10 @@ type DataMessage struct { GroupCallUpdate *DataMessage_GroupCallUpdate `protobuf:"bytes,19,opt,name=groupCallUpdate" json:"groupCallUpdate,omitempty"` Payment *DataMessage_Payment `protobuf:"bytes,20,opt,name=payment" json:"payment,omitempty"` StoryContext *DataMessage_StoryContext `protobuf:"bytes,21,opt,name=storyContext" json:"storyContext,omitempty"` - GiftBadge *DataMessage_GiftBadge `protobuf:"bytes,22,opt,name=giftBadge" json:"giftBadge,omitempty"` // NEXT ID: 24 + GiftBadge *DataMessage_GiftBadge `protobuf:"bytes,22,opt,name=giftBadge" json:"giftBadge,omitempty"` + PollCreate *DataMessage_PollCreate `protobuf:"bytes,24,opt,name=pollCreate" json:"pollCreate,omitempty"` + PollTerminate *DataMessage_PollTerminate `protobuf:"bytes,25,opt,name=pollTerminate" json:"pollTerminate,omitempty"` + PollVote *DataMessage_PollVote `protobuf:"bytes,26,opt,name=pollVote" json:"pollVote,omitempty"` // NEXT ID: 27 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2308,6 +2317,27 @@ func (x *DataMessage) GetGiftBadge() *DataMessage_GiftBadge { return nil } +func (x *DataMessage) GetPollCreate() *DataMessage_PollCreate { + if x != nil { + return x.PollCreate + } + return nil +} + +func (x *DataMessage) GetPollTerminate() *DataMessage_PollTerminate { + if x != nil { + return x.PollTerminate + } + return nil +} + +func (x *DataMessage) GetPollVote() *DataMessage_PollVote { + if x != nil { + return x.PollVote + } + return nil +} + type NullMessage struct { state protoimpl.MessageState `protogen:"open.v1"` Padding []byte `protobuf:"bytes,1,opt,name=padding" json:"padding,omitempty"` @@ -4843,6 +4873,178 @@ func (x *DataMessage_GiftBadge) GetReceiptCredentialPresentation() []byte { return nil } +type DataMessage_PollCreate struct { + state protoimpl.MessageState `protogen:"open.v1"` + Question *string `protobuf:"bytes,1,opt,name=question" json:"question,omitempty"` + AllowMultiple *bool `protobuf:"varint,2,opt,name=allowMultiple" json:"allowMultiple,omitempty"` + Options []string `protobuf:"bytes,3,rep,name=options" json:"options,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DataMessage_PollCreate) Reset() { + *x = DataMessage_PollCreate{} + mi := &file_SignalService_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DataMessage_PollCreate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataMessage_PollCreate) ProtoMessage() {} + +func (x *DataMessage_PollCreate) ProtoReflect() protoreflect.Message { + mi := &file_SignalService_proto_msgTypes[37] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataMessage_PollCreate.ProtoReflect.Descriptor instead. +func (*DataMessage_PollCreate) Descriptor() ([]byte, []int) { + return file_SignalService_proto_rawDescGZIP(), []int{3, 9} +} + +func (x *DataMessage_PollCreate) GetQuestion() string { + if x != nil && x.Question != nil { + return *x.Question + } + return "" +} + +func (x *DataMessage_PollCreate) GetAllowMultiple() bool { + if x != nil && x.AllowMultiple != nil { + return *x.AllowMultiple + } + return false +} + +func (x *DataMessage_PollCreate) GetOptions() []string { + if x != nil { + return x.Options + } + return nil +} + +type DataMessage_PollTerminate struct { + state protoimpl.MessageState `protogen:"open.v1"` + TargetSentTimestamp *uint64 `protobuf:"varint,1,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DataMessage_PollTerminate) Reset() { + *x = DataMessage_PollTerminate{} + mi := &file_SignalService_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DataMessage_PollTerminate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataMessage_PollTerminate) ProtoMessage() {} + +func (x *DataMessage_PollTerminate) ProtoReflect() protoreflect.Message { + mi := &file_SignalService_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataMessage_PollTerminate.ProtoReflect.Descriptor instead. +func (*DataMessage_PollTerminate) Descriptor() ([]byte, []int) { + return file_SignalService_proto_rawDescGZIP(), []int{3, 10} +} + +func (x *DataMessage_PollTerminate) GetTargetSentTimestamp() uint64 { + if x != nil && x.TargetSentTimestamp != nil { + return *x.TargetSentTimestamp + } + return 0 +} + +type DataMessage_PollVote struct { + state protoimpl.MessageState `protogen:"open.v1"` + TargetAuthorAciBinary []byte `protobuf:"bytes,1,opt,name=targetAuthorAciBinary" json:"targetAuthorAciBinary,omitempty"` + TargetSentTimestamp *uint64 `protobuf:"varint,2,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` + OptionIndexes []uint32 `protobuf:"varint,3,rep,name=optionIndexes" json:"optionIndexes,omitempty"` // must be in the range [0, options.length) from the PollCreate + VoteCount *uint32 `protobuf:"varint,4,opt,name=voteCount" json:"voteCount,omitempty"` // increment this by 1 each time you vote on a given poll + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DataMessage_PollVote) Reset() { + *x = DataMessage_PollVote{} + mi := &file_SignalService_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DataMessage_PollVote) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataMessage_PollVote) ProtoMessage() {} + +func (x *DataMessage_PollVote) ProtoReflect() protoreflect.Message { + mi := &file_SignalService_proto_msgTypes[39] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataMessage_PollVote.ProtoReflect.Descriptor instead. +func (*DataMessage_PollVote) Descriptor() ([]byte, []int) { + return file_SignalService_proto_rawDescGZIP(), []int{3, 11} +} + +func (x *DataMessage_PollVote) GetTargetAuthorAciBinary() []byte { + if x != nil { + return x.TargetAuthorAciBinary + } + return nil +} + +func (x *DataMessage_PollVote) GetTargetSentTimestamp() uint64 { + if x != nil && x.TargetSentTimestamp != nil { + return *x.TargetSentTimestamp + } + return 0 +} + +func (x *DataMessage_PollVote) GetOptionIndexes() []uint32 { + if x != nil { + return x.OptionIndexes + } + return nil +} + +func (x *DataMessage_PollVote) GetVoteCount() uint32 { + if x != nil && x.VoteCount != nil { + return *x.VoteCount + } + return 0 +} + type DataMessage_Payment_Amount struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Amount: @@ -4855,7 +5057,7 @@ type DataMessage_Payment_Amount struct { func (x *DataMessage_Payment_Amount) Reset() { *x = DataMessage_Payment_Amount{} - mi := &file_SignalService_proto_msgTypes[37] + mi := &file_SignalService_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4867,7 +5069,7 @@ func (x *DataMessage_Payment_Amount) String() string { func (*DataMessage_Payment_Amount) ProtoMessage() {} func (x *DataMessage_Payment_Amount) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[37] + mi := &file_SignalService_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4923,7 +5125,7 @@ type DataMessage_Payment_Notification struct { func (x *DataMessage_Payment_Notification) Reset() { *x = DataMessage_Payment_Notification{} - mi := &file_SignalService_proto_msgTypes[38] + mi := &file_SignalService_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4935,7 +5137,7 @@ func (x *DataMessage_Payment_Notification) String() string { func (*DataMessage_Payment_Notification) ProtoMessage() {} func (x *DataMessage_Payment_Notification) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[38] + mi := &file_SignalService_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4994,7 +5196,7 @@ type DataMessage_Payment_Activation struct { func (x *DataMessage_Payment_Activation) Reset() { *x = DataMessage_Payment_Activation{} - mi := &file_SignalService_proto_msgTypes[39] + mi := &file_SignalService_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5006,7 +5208,7 @@ func (x *DataMessage_Payment_Activation) String() string { func (*DataMessage_Payment_Activation) ProtoMessage() {} func (x *DataMessage_Payment_Activation) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[39] + mi := &file_SignalService_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5038,7 +5240,7 @@ type DataMessage_Payment_Amount_MobileCoin struct { func (x *DataMessage_Payment_Amount_MobileCoin) Reset() { *x = DataMessage_Payment_Amount_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[40] + mi := &file_SignalService_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5050,7 +5252,7 @@ func (x *DataMessage_Payment_Amount_MobileCoin) String() string { func (*DataMessage_Payment_Amount_MobileCoin) ProtoMessage() {} func (x *DataMessage_Payment_Amount_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[40] + mi := &file_SignalService_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5082,7 +5284,7 @@ type DataMessage_Payment_Notification_MobileCoin struct { func (x *DataMessage_Payment_Notification_MobileCoin) Reset() { *x = DataMessage_Payment_Notification_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[41] + mi := &file_SignalService_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5094,7 +5296,7 @@ func (x *DataMessage_Payment_Notification_MobileCoin) String() string { func (*DataMessage_Payment_Notification_MobileCoin) ProtoMessage() {} func (x *DataMessage_Payment_Notification_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[41] + mi := &file_SignalService_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5128,7 +5330,7 @@ type DataMessage_Quote_QuotedAttachment struct { func (x *DataMessage_Quote_QuotedAttachment) Reset() { *x = DataMessage_Quote_QuotedAttachment{} - mi := &file_SignalService_proto_msgTypes[42] + mi := &file_SignalService_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5140,7 +5342,7 @@ func (x *DataMessage_Quote_QuotedAttachment) String() string { func (*DataMessage_Quote_QuotedAttachment) ProtoMessage() {} func (x *DataMessage_Quote_QuotedAttachment) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[42] + mi := &file_SignalService_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5191,7 +5393,7 @@ type DataMessage_Contact_Name struct { func (x *DataMessage_Contact_Name) Reset() { *x = DataMessage_Contact_Name{} - mi := &file_SignalService_proto_msgTypes[43] + mi := &file_SignalService_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5203,7 +5405,7 @@ func (x *DataMessage_Contact_Name) String() string { func (*DataMessage_Contact_Name) ProtoMessage() {} func (x *DataMessage_Contact_Name) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[43] + mi := &file_SignalService_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5272,7 +5474,7 @@ type DataMessage_Contact_Phone struct { func (x *DataMessage_Contact_Phone) Reset() { *x = DataMessage_Contact_Phone{} - mi := &file_SignalService_proto_msgTypes[44] + mi := &file_SignalService_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5284,7 +5486,7 @@ func (x *DataMessage_Contact_Phone) String() string { func (*DataMessage_Contact_Phone) ProtoMessage() {} func (x *DataMessage_Contact_Phone) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[44] + mi := &file_SignalService_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5332,7 +5534,7 @@ type DataMessage_Contact_Email struct { func (x *DataMessage_Contact_Email) Reset() { *x = DataMessage_Contact_Email{} - mi := &file_SignalService_proto_msgTypes[45] + mi := &file_SignalService_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5344,7 +5546,7 @@ func (x *DataMessage_Contact_Email) String() string { func (*DataMessage_Contact_Email) ProtoMessage() {} func (x *DataMessage_Contact_Email) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[45] + mi := &file_SignalService_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5398,7 +5600,7 @@ type DataMessage_Contact_PostalAddress struct { func (x *DataMessage_Contact_PostalAddress) Reset() { *x = DataMessage_Contact_PostalAddress{} - mi := &file_SignalService_proto_msgTypes[46] + mi := &file_SignalService_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5410,7 +5612,7 @@ func (x *DataMessage_Contact_PostalAddress) String() string { func (*DataMessage_Contact_PostalAddress) ProtoMessage() {} func (x *DataMessage_Contact_PostalAddress) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[46] + mi := &file_SignalService_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5499,7 +5701,7 @@ type DataMessage_Contact_Avatar struct { func (x *DataMessage_Contact_Avatar) Reset() { *x = DataMessage_Contact_Avatar{} - mi := &file_SignalService_proto_msgTypes[47] + mi := &file_SignalService_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5511,7 +5713,7 @@ func (x *DataMessage_Contact_Avatar) String() string { func (*DataMessage_Contact_Avatar) ProtoMessage() {} func (x *DataMessage_Contact_Avatar) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[47] + mi := &file_SignalService_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5554,7 +5756,7 @@ type TextAttachment_Gradient struct { func (x *TextAttachment_Gradient) Reset() { *x = TextAttachment_Gradient{} - mi := &file_SignalService_proto_msgTypes[48] + mi := &file_SignalService_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5566,7 +5768,7 @@ func (x *TextAttachment_Gradient) String() string { func (*TextAttachment_Gradient) ProtoMessage() {} func (x *TextAttachment_Gradient) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[48] + mi := &file_SignalService_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5640,7 +5842,7 @@ const ( func (x *SyncMessage_Sent) Reset() { *x = SyncMessage_Sent{} - mi := &file_SignalService_proto_msgTypes[49] + mi := &file_SignalService_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5652,7 +5854,7 @@ func (x *SyncMessage_Sent) String() string { func (*SyncMessage_Sent) ProtoMessage() {} func (x *SyncMessage_Sent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[49] + mi := &file_SignalService_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5753,7 +5955,7 @@ const ( func (x *SyncMessage_Contacts) Reset() { *x = SyncMessage_Contacts{} - mi := &file_SignalService_proto_msgTypes[50] + mi := &file_SignalService_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5765,7 +5967,7 @@ func (x *SyncMessage_Contacts) String() string { func (*SyncMessage_Contacts) ProtoMessage() {} func (x *SyncMessage_Contacts) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[50] + mi := &file_SignalService_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5806,7 +6008,7 @@ type SyncMessage_Blocked struct { func (x *SyncMessage_Blocked) Reset() { *x = SyncMessage_Blocked{} - mi := &file_SignalService_proto_msgTypes[51] + mi := &file_SignalService_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5818,7 +6020,7 @@ func (x *SyncMessage_Blocked) String() string { func (*SyncMessage_Blocked) ProtoMessage() {} func (x *SyncMessage_Blocked) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[51] + mi := &file_SignalService_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5864,7 +6066,7 @@ type SyncMessage_Request struct { func (x *SyncMessage_Request) Reset() { *x = SyncMessage_Request{} - mi := &file_SignalService_proto_msgTypes[52] + mi := &file_SignalService_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5876,7 +6078,7 @@ func (x *SyncMessage_Request) String() string { func (*SyncMessage_Request) ProtoMessage() {} func (x *SyncMessage_Request) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[52] + mi := &file_SignalService_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5909,7 +6111,7 @@ type SyncMessage_Read struct { func (x *SyncMessage_Read) Reset() { *x = SyncMessage_Read{} - mi := &file_SignalService_proto_msgTypes[53] + mi := &file_SignalService_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5921,7 +6123,7 @@ func (x *SyncMessage_Read) String() string { func (*SyncMessage_Read) ProtoMessage() {} func (x *SyncMessage_Read) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[53] + mi := &file_SignalService_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5961,7 +6163,7 @@ type SyncMessage_Viewed struct { func (x *SyncMessage_Viewed) Reset() { *x = SyncMessage_Viewed{} - mi := &file_SignalService_proto_msgTypes[54] + mi := &file_SignalService_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5973,7 +6175,7 @@ func (x *SyncMessage_Viewed) String() string { func (*SyncMessage_Viewed) ProtoMessage() {} func (x *SyncMessage_Viewed) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[54] + mi := &file_SignalService_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6016,7 +6218,7 @@ type SyncMessage_Configuration struct { func (x *SyncMessage_Configuration) Reset() { *x = SyncMessage_Configuration{} - mi := &file_SignalService_proto_msgTypes[55] + mi := &file_SignalService_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6028,7 +6230,7 @@ func (x *SyncMessage_Configuration) String() string { func (*SyncMessage_Configuration) ProtoMessage() {} func (x *SyncMessage_Configuration) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[55] + mi := &file_SignalService_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6090,7 +6292,7 @@ type SyncMessage_StickerPackOperation struct { func (x *SyncMessage_StickerPackOperation) Reset() { *x = SyncMessage_StickerPackOperation{} - mi := &file_SignalService_proto_msgTypes[56] + mi := &file_SignalService_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6102,7 +6304,7 @@ func (x *SyncMessage_StickerPackOperation) String() string { func (*SyncMessage_StickerPackOperation) ProtoMessage() {} func (x *SyncMessage_StickerPackOperation) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[56] + mi := &file_SignalService_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6149,7 +6351,7 @@ type SyncMessage_ViewOnceOpen struct { func (x *SyncMessage_ViewOnceOpen) Reset() { *x = SyncMessage_ViewOnceOpen{} - mi := &file_SignalService_proto_msgTypes[57] + mi := &file_SignalService_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6161,7 +6363,7 @@ func (x *SyncMessage_ViewOnceOpen) String() string { func (*SyncMessage_ViewOnceOpen) ProtoMessage() {} func (x *SyncMessage_ViewOnceOpen) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[57] + mi := &file_SignalService_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6200,7 +6402,7 @@ type SyncMessage_FetchLatest struct { func (x *SyncMessage_FetchLatest) Reset() { *x = SyncMessage_FetchLatest{} - mi := &file_SignalService_proto_msgTypes[58] + mi := &file_SignalService_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6212,7 +6414,7 @@ func (x *SyncMessage_FetchLatest) String() string { func (*SyncMessage_FetchLatest) ProtoMessage() {} func (x *SyncMessage_FetchLatest) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[58] + mi := &file_SignalService_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6246,7 +6448,7 @@ type SyncMessage_Keys struct { func (x *SyncMessage_Keys) Reset() { *x = SyncMessage_Keys{} - mi := &file_SignalService_proto_msgTypes[59] + mi := &file_SignalService_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6258,7 +6460,7 @@ func (x *SyncMessage_Keys) String() string { func (*SyncMessage_Keys) ProtoMessage() {} func (x *SyncMessage_Keys) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[59] + mi := &file_SignalService_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6305,7 +6507,7 @@ type SyncMessage_PniIdentity struct { func (x *SyncMessage_PniIdentity) Reset() { *x = SyncMessage_PniIdentity{} - mi := &file_SignalService_proto_msgTypes[60] + mi := &file_SignalService_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6317,7 +6519,7 @@ func (x *SyncMessage_PniIdentity) String() string { func (*SyncMessage_PniIdentity) ProtoMessage() {} func (x *SyncMessage_PniIdentity) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[60] + mi := &file_SignalService_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6358,7 +6560,7 @@ type SyncMessage_MessageRequestResponse struct { func (x *SyncMessage_MessageRequestResponse) Reset() { *x = SyncMessage_MessageRequestResponse{} - mi := &file_SignalService_proto_msgTypes[61] + mi := &file_SignalService_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6370,7 +6572,7 @@ func (x *SyncMessage_MessageRequestResponse) String() string { func (*SyncMessage_MessageRequestResponse) ProtoMessage() {} func (x *SyncMessage_MessageRequestResponse) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[61] + mi := &file_SignalService_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6421,7 +6623,7 @@ type SyncMessage_OutgoingPayment struct { func (x *SyncMessage_OutgoingPayment) Reset() { *x = SyncMessage_OutgoingPayment{} - mi := &file_SignalService_proto_msgTypes[62] + mi := &file_SignalService_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6433,7 +6635,7 @@ func (x *SyncMessage_OutgoingPayment) String() string { func (*SyncMessage_OutgoingPayment) ProtoMessage() {} func (x *SyncMessage_OutgoingPayment) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[62] + mi := &file_SignalService_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6503,7 +6705,7 @@ type SyncMessage_PniChangeNumber struct { func (x *SyncMessage_PniChangeNumber) Reset() { *x = SyncMessage_PniChangeNumber{} - mi := &file_SignalService_proto_msgTypes[63] + mi := &file_SignalService_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6515,7 +6717,7 @@ func (x *SyncMessage_PniChangeNumber) String() string { func (*SyncMessage_PniChangeNumber) ProtoMessage() {} func (x *SyncMessage_PniChangeNumber) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[63] + mi := &file_SignalService_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6585,7 +6787,7 @@ type SyncMessage_CallEvent struct { func (x *SyncMessage_CallEvent) Reset() { *x = SyncMessage_CallEvent{} - mi := &file_SignalService_proto_msgTypes[64] + mi := &file_SignalService_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6597,7 +6799,7 @@ func (x *SyncMessage_CallEvent) String() string { func (*SyncMessage_CallEvent) ProtoMessage() {} func (x *SyncMessage_CallEvent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[64] + mi := &file_SignalService_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6667,7 +6869,7 @@ type SyncMessage_CallLinkUpdate struct { func (x *SyncMessage_CallLinkUpdate) Reset() { *x = SyncMessage_CallLinkUpdate{} - mi := &file_SignalService_proto_msgTypes[65] + mi := &file_SignalService_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6679,7 +6881,7 @@ func (x *SyncMessage_CallLinkUpdate) String() string { func (*SyncMessage_CallLinkUpdate) ProtoMessage() {} func (x *SyncMessage_CallLinkUpdate) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[65] + mi := &file_SignalService_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6740,7 +6942,7 @@ type SyncMessage_CallLogEvent struct { func (x *SyncMessage_CallLogEvent) Reset() { *x = SyncMessage_CallLogEvent{} - mi := &file_SignalService_proto_msgTypes[66] + mi := &file_SignalService_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6752,7 +6954,7 @@ func (x *SyncMessage_CallLogEvent) String() string { func (*SyncMessage_CallLogEvent) ProtoMessage() {} func (x *SyncMessage_CallLogEvent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[66] + mi := &file_SignalService_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6808,7 +7010,7 @@ type SyncMessage_DeleteForMe struct { func (x *SyncMessage_DeleteForMe) Reset() { *x = SyncMessage_DeleteForMe{} - mi := &file_SignalService_proto_msgTypes[67] + mi := &file_SignalService_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6820,7 +7022,7 @@ func (x *SyncMessage_DeleteForMe) String() string { func (*SyncMessage_DeleteForMe) ProtoMessage() {} func (x *SyncMessage_DeleteForMe) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[67] + mi := &file_SignalService_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6873,7 +7075,7 @@ type SyncMessage_DeviceNameChange struct { func (x *SyncMessage_DeviceNameChange) Reset() { *x = SyncMessage_DeviceNameChange{} - mi := &file_SignalService_proto_msgTypes[68] + mi := &file_SignalService_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6885,7 +7087,7 @@ func (x *SyncMessage_DeviceNameChange) String() string { func (*SyncMessage_DeviceNameChange) ProtoMessage() {} func (x *SyncMessage_DeviceNameChange) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[68] + mi := &file_SignalService_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6918,7 +7120,7 @@ type SyncMessage_AttachmentBackfillRequest struct { func (x *SyncMessage_AttachmentBackfillRequest) Reset() { *x = SyncMessage_AttachmentBackfillRequest{} - mi := &file_SignalService_proto_msgTypes[69] + mi := &file_SignalService_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6930,7 +7132,7 @@ func (x *SyncMessage_AttachmentBackfillRequest) String() string { func (*SyncMessage_AttachmentBackfillRequest) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillRequest) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[69] + mi := &file_SignalService_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6975,7 +7177,7 @@ type SyncMessage_AttachmentBackfillResponse struct { func (x *SyncMessage_AttachmentBackfillResponse) Reset() { *x = SyncMessage_AttachmentBackfillResponse{} - mi := &file_SignalService_proto_msgTypes[70] + mi := &file_SignalService_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6987,7 +7189,7 @@ func (x *SyncMessage_AttachmentBackfillResponse) String() string { func (*SyncMessage_AttachmentBackfillResponse) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[70] + mi := &file_SignalService_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7071,7 +7273,7 @@ type SyncMessage_Sent_UnidentifiedDeliveryStatus struct { func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) Reset() { *x = SyncMessage_Sent_UnidentifiedDeliveryStatus{} - mi := &file_SignalService_proto_msgTypes[71] + mi := &file_SignalService_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7083,7 +7285,7 @@ func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) String() string { func (*SyncMessage_Sent_UnidentifiedDeliveryStatus) ProtoMessage() {} func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[71] + mi := &file_SignalService_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7131,7 +7333,7 @@ type SyncMessage_Sent_StoryMessageRecipient struct { func (x *SyncMessage_Sent_StoryMessageRecipient) Reset() { *x = SyncMessage_Sent_StoryMessageRecipient{} - mi := &file_SignalService_proto_msgTypes[72] + mi := &file_SignalService_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7143,7 +7345,7 @@ func (x *SyncMessage_Sent_StoryMessageRecipient) String() string { func (*SyncMessage_Sent_StoryMessageRecipient) ProtoMessage() {} func (x *SyncMessage_Sent_StoryMessageRecipient) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[72] + mi := &file_SignalService_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7196,7 +7398,7 @@ type SyncMessage_OutgoingPayment_MobileCoin struct { func (x *SyncMessage_OutgoingPayment_MobileCoin) Reset() { *x = SyncMessage_OutgoingPayment_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[73] + mi := &file_SignalService_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7208,7 +7410,7 @@ func (x *SyncMessage_OutgoingPayment_MobileCoin) String() string { func (*SyncMessage_OutgoingPayment_MobileCoin) ProtoMessage() {} func (x *SyncMessage_OutgoingPayment_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[73] + mi := &file_SignalService_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7290,7 +7492,7 @@ type SyncMessage_DeleteForMe_MessageDeletes struct { func (x *SyncMessage_DeleteForMe_MessageDeletes) Reset() { *x = SyncMessage_DeleteForMe_MessageDeletes{} - mi := &file_SignalService_proto_msgTypes[74] + mi := &file_SignalService_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7302,7 +7504,7 @@ func (x *SyncMessage_DeleteForMe_MessageDeletes) String() string { func (*SyncMessage_DeleteForMe_MessageDeletes) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_MessageDeletes) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[74] + mi := &file_SignalService_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7348,7 +7550,7 @@ type SyncMessage_DeleteForMe_AttachmentDelete struct { func (x *SyncMessage_DeleteForMe_AttachmentDelete) Reset() { *x = SyncMessage_DeleteForMe_AttachmentDelete{} - mi := &file_SignalService_proto_msgTypes[75] + mi := &file_SignalService_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7360,7 +7562,7 @@ func (x *SyncMessage_DeleteForMe_AttachmentDelete) String() string { func (*SyncMessage_DeleteForMe_AttachmentDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_AttachmentDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[75] + mi := &file_SignalService_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7423,7 +7625,7 @@ type SyncMessage_DeleteForMe_ConversationDelete struct { func (x *SyncMessage_DeleteForMe_ConversationDelete) Reset() { *x = SyncMessage_DeleteForMe_ConversationDelete{} - mi := &file_SignalService_proto_msgTypes[76] + mi := &file_SignalService_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7435,7 +7637,7 @@ func (x *SyncMessage_DeleteForMe_ConversationDelete) String() string { func (*SyncMessage_DeleteForMe_ConversationDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_ConversationDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[76] + mi := &file_SignalService_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7488,7 +7690,7 @@ type SyncMessage_DeleteForMe_LocalOnlyConversationDelete struct { func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) Reset() { *x = SyncMessage_DeleteForMe_LocalOnlyConversationDelete{} - mi := &file_SignalService_proto_msgTypes[77] + mi := &file_SignalService_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7500,7 +7702,7 @@ func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) String() string { func (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[77] + mi := &file_SignalService_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7536,7 +7738,7 @@ type SyncMessage_AttachmentBackfillResponse_AttachmentData struct { func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) Reset() { *x = SyncMessage_AttachmentBackfillResponse_AttachmentData{} - mi := &file_SignalService_proto_msgTypes[78] + mi := &file_SignalService_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7548,7 +7750,7 @@ func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) String() string func (*SyncMessage_AttachmentBackfillResponse_AttachmentData) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[78] + mi := &file_SignalService_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7617,7 +7819,7 @@ type SyncMessage_AttachmentBackfillResponse_AttachmentDataList struct { func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) Reset() { *x = SyncMessage_AttachmentBackfillResponse_AttachmentDataList{} - mi := &file_SignalService_proto_msgTypes[79] + mi := &file_SignalService_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7629,7 +7831,7 @@ func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) String() str func (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[79] + mi := &file_SignalService_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7669,7 +7871,7 @@ type ContactDetails_Avatar struct { func (x *ContactDetails_Avatar) Reset() { *x = ContactDetails_Avatar{} - mi := &file_SignalService_proto_msgTypes[80] + mi := &file_SignalService_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7681,7 +7883,7 @@ func (x *ContactDetails_Avatar) String() string { func (*ContactDetails_Avatar) ProtoMessage() {} func (x *ContactDetails_Avatar) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[80] + mi := &file_SignalService_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7721,7 +7923,7 @@ type PaymentAddress_MobileCoin struct { func (x *PaymentAddress_MobileCoin) Reset() { *x = PaymentAddress_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[81] + mi := &file_SignalService_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7733,7 +7935,7 @@ func (x *PaymentAddress_MobileCoin) String() string { func (*PaymentAddress_MobileCoin) ProtoMessage() {} func (x *PaymentAddress_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[81] + mi := &file_SignalService_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7848,7 +8050,7 @@ const file_SignalService_proto_rawDesc = "" + "\aurgency\x18\x02 \x01(\x0e2).signalservice.CallMessage.Opaque.UrgencyR\aurgency\"0\n" + "\aUrgency\x12\r\n" + "\tDROPPABLE\x10\x00\x12\x16\n" + - "\x12HANDLE_IMMEDIATELY\x10\x01J\x04\b\x04\x10\x05J\x04\b\x06\x10\aJ\x04\b\b\x10\t\"\xf7\"\n" + + "\x12HANDLE_IMMEDIATELY\x10\x01J\x04\b\x04\x10\x05J\x04\b\x06\x10\aJ\x04\b\b\x10\t\"\xca'\n" + "\vDataMessage\x12\x12\n" + "\x04body\x18\x01 \x01(\tR\x04body\x12B\n" + "\vattachments\x18\x02 \x03(\v2 .signalservice.AttachmentPointerR\vattachments\x127\n" + @@ -7877,7 +8079,12 @@ const file_SignalService_proto_rawDesc = "" + "\x0fgroupCallUpdate\x18\x13 \x01(\v2*.signalservice.DataMessage.GroupCallUpdateR\x0fgroupCallUpdate\x12<\n" + "\apayment\x18\x14 \x01(\v2\".signalservice.DataMessage.PaymentR\apayment\x12K\n" + "\fstoryContext\x18\x15 \x01(\v2'.signalservice.DataMessage.StoryContextR\fstoryContext\x12B\n" + - "\tgiftBadge\x18\x16 \x01(\v2$.signalservice.DataMessage.GiftBadgeR\tgiftBadge\x1a\x9a\x05\n" + + "\tgiftBadge\x18\x16 \x01(\v2$.signalservice.DataMessage.GiftBadgeR\tgiftBadge\x12E\n" + + "\n" + + "pollCreate\x18\x18 \x01(\v2%.signalservice.DataMessage.PollCreateR\n" + + "pollCreate\x12N\n" + + "\rpollTerminate\x18\x19 \x01(\v2(.signalservice.DataMessage.PollTerminateR\rpollTerminate\x12?\n" + + "\bpollVote\x18\x1a \x01(\v2#.signalservice.DataMessage.PollVoteR\bpollVote\x1a\x9a\x05\n" + "\aPayment\x12U\n" + "\fnotification\x18\x01 \x01(\v2/.signalservice.DataMessage.Payment.NotificationH\x00R\fnotification\x12O\n" + "\n" + @@ -7906,7 +8113,7 @@ const file_SignalService_proto_rawDesc = "" + "\x04Type\x12\v\n" + "\aREQUEST\x10\x00\x12\r\n" + "\tACTIVATED\x10\x01B\x06\n" + - "\x04ItemJ\x06\b\xea\a\x10\xeb\aJ\x06\b\xeb\a\x10\xec\a\x1a\xd0\x03\n" + + "\x04ItemJ\x06\b\xea\a\x10\xeb\aJ\x06\b\xeb\a\x10\xec\a\x1a\xda\x03\n" + "\x05Quote\x12\x0e\n" + "\x02id\x18\x01 \x01(\x04R\x02id\x12\x1c\n" + "\tauthorAci\x18\x05 \x01(\tR\tauthorAci\x12\x12\n" + @@ -7919,12 +8126,13 @@ const file_SignalService_proto_rawDesc = "" + "\x10QuotedAttachment\x12 \n" + "\vcontentType\x18\x01 \x01(\tR\vcontentType\x12\x1a\n" + "\bfileName\x18\x02 \x01(\tR\bfileName\x12>\n" + - "\tthumbnail\x18\x03 \x01(\v2 .signalservice.AttachmentPointerR\tthumbnail\"\"\n" + + "\tthumbnail\x18\x03 \x01(\v2 .signalservice.AttachmentPointerR\tthumbnail\",\n" + "\x04Type\x12\n" + "\n" + "\x06NORMAL\x10\x00\x12\x0e\n" + "\n" + - "GIFT_BADGE\x10\x01J\x04\b\x02\x10\x03\x1a\xbf\n" + + "GIFT_BADGE\x10\x01\x12\b\n" + + "\x04POLL\x10\x02J\x04\b\x02\x10\x03\x1a\xbf\n" + "\n" + "\aContact\x12;\n" + "\x04name\x18\x01 \x01(\v2'.signalservice.DataMessage.Contact.NameR\x04name\x12@\n" + @@ -8003,12 +8211,24 @@ const file_SignalService_proto_rawDesc = "" + "\tauthorAci\x18\x01 \x01(\tR\tauthorAci\x12$\n" + "\rsentTimestamp\x18\x02 \x01(\x04R\rsentTimestamp\x1aQ\n" + "\tGiftBadge\x12D\n" + - "\x1dreceiptCredentialPresentation\x18\x01 \x01(\fR\x1dreceiptCredentialPresentation\"Z\n" + + "\x1dreceiptCredentialPresentation\x18\x01 \x01(\fR\x1dreceiptCredentialPresentation\x1ah\n" + + "\n" + + "PollCreate\x12\x1a\n" + + "\bquestion\x18\x01 \x01(\tR\bquestion\x12$\n" + + "\rallowMultiple\x18\x02 \x01(\bR\rallowMultiple\x12\x18\n" + + "\aoptions\x18\x03 \x03(\tR\aoptions\x1aA\n" + + "\rPollTerminate\x120\n" + + "\x13targetSentTimestamp\x18\x01 \x01(\x04R\x13targetSentTimestamp\x1a\xb6\x01\n" + + "\bPollVote\x124\n" + + "\x15targetAuthorAciBinary\x18\x01 \x01(\fR\x15targetAuthorAciBinary\x120\n" + + "\x13targetSentTimestamp\x18\x02 \x01(\x04R\x13targetSentTimestamp\x12$\n" + + "\roptionIndexes\x18\x03 \x03(\rR\roptionIndexes\x12\x1c\n" + + "\tvoteCount\x18\x04 \x01(\rR\tvoteCount\"Z\n" + "\x05Flags\x12\x0f\n" + "\vEND_SESSION\x10\x01\x12\x1b\n" + "\x17EXPIRATION_TIMER_UPDATE\x10\x02\x12\x16\n" + "\x12PROFILE_KEY_UPDATE\x10\x04\x12\v\n" + - "\aFORWARD\x10\b\"\xb0\x01\n" + + "\aFORWARD\x10\b\"\xbb\x01\n" + "\x0fProtocolVersion\x12\v\n" + "\aINITIAL\x10\x00\x12\x12\n" + "\x0eMESSAGE_TIMERS\x10\x01\x12\r\n" + @@ -8017,7 +8237,8 @@ const file_SignalService_proto_rawDesc = "" + "\tREACTIONS\x10\x04\x12\x1c\n" + "\x18CDN_SELECTOR_ATTACHMENTS\x10\x05\x12\f\n" + "\bMENTIONS\x10\x06\x12\f\n" + - "\bPAYMENTS\x10\a\x12\v\n" + + "\bPAYMENTS\x10\a\x12\t\n" + + "\x05POLLS\x10\b\x12\v\n" + "\aCURRENT\x10\a\x1a\x02\x10\x01J\x04\b\x03\x10\x04\"'\n" + "\vNullMessage\x12\x18\n" + "\apadding\x18\x01 \x01(\fR\apadding\"\x92\x01\n" + @@ -8434,7 +8655,7 @@ func file_SignalService_proto_rawDescGZIP() []byte { } var file_SignalService_proto_enumTypes = make([]protoimpl.EnumInfo, 28) -var file_SignalService_proto_msgTypes = make([]protoimpl.MessageInfo, 82) +var file_SignalService_proto_msgTypes = make([]protoimpl.MessageInfo, 85) var file_SignalService_proto_goTypes = []any{ (Envelope_Type)(0), // 0: signalservice.Envelope.Type (CallMessage_Offer_Type)(0), // 1: signalservice.CallMessage.Offer.Type @@ -8501,51 +8722,54 @@ var file_SignalService_proto_goTypes = []any{ (*DataMessage_GroupCallUpdate)(nil), // 62: signalservice.DataMessage.GroupCallUpdate (*DataMessage_StoryContext)(nil), // 63: signalservice.DataMessage.StoryContext (*DataMessage_GiftBadge)(nil), // 64: signalservice.DataMessage.GiftBadge - (*DataMessage_Payment_Amount)(nil), // 65: signalservice.DataMessage.Payment.Amount - (*DataMessage_Payment_Notification)(nil), // 66: signalservice.DataMessage.Payment.Notification - (*DataMessage_Payment_Activation)(nil), // 67: signalservice.DataMessage.Payment.Activation - (*DataMessage_Payment_Amount_MobileCoin)(nil), // 68: signalservice.DataMessage.Payment.Amount.MobileCoin - (*DataMessage_Payment_Notification_MobileCoin)(nil), // 69: signalservice.DataMessage.Payment.Notification.MobileCoin - (*DataMessage_Quote_QuotedAttachment)(nil), // 70: signalservice.DataMessage.Quote.QuotedAttachment - (*DataMessage_Contact_Name)(nil), // 71: signalservice.DataMessage.Contact.Name - (*DataMessage_Contact_Phone)(nil), // 72: signalservice.DataMessage.Contact.Phone - (*DataMessage_Contact_Email)(nil), // 73: signalservice.DataMessage.Contact.Email - (*DataMessage_Contact_PostalAddress)(nil), // 74: signalservice.DataMessage.Contact.PostalAddress - (*DataMessage_Contact_Avatar)(nil), // 75: signalservice.DataMessage.Contact.Avatar - (*TextAttachment_Gradient)(nil), // 76: signalservice.TextAttachment.Gradient - (*SyncMessage_Sent)(nil), // 77: signalservice.SyncMessage.Sent - (*SyncMessage_Contacts)(nil), // 78: signalservice.SyncMessage.Contacts - (*SyncMessage_Blocked)(nil), // 79: signalservice.SyncMessage.Blocked - (*SyncMessage_Request)(nil), // 80: signalservice.SyncMessage.Request - (*SyncMessage_Read)(nil), // 81: signalservice.SyncMessage.Read - (*SyncMessage_Viewed)(nil), // 82: signalservice.SyncMessage.Viewed - (*SyncMessage_Configuration)(nil), // 83: signalservice.SyncMessage.Configuration - (*SyncMessage_StickerPackOperation)(nil), // 84: signalservice.SyncMessage.StickerPackOperation - (*SyncMessage_ViewOnceOpen)(nil), // 85: signalservice.SyncMessage.ViewOnceOpen - (*SyncMessage_FetchLatest)(nil), // 86: signalservice.SyncMessage.FetchLatest - (*SyncMessage_Keys)(nil), // 87: signalservice.SyncMessage.Keys - (*SyncMessage_PniIdentity)(nil), // 88: signalservice.SyncMessage.PniIdentity - (*SyncMessage_MessageRequestResponse)(nil), // 89: signalservice.SyncMessage.MessageRequestResponse - (*SyncMessage_OutgoingPayment)(nil), // 90: signalservice.SyncMessage.OutgoingPayment - (*SyncMessage_PniChangeNumber)(nil), // 91: signalservice.SyncMessage.PniChangeNumber - (*SyncMessage_CallEvent)(nil), // 92: signalservice.SyncMessage.CallEvent - (*SyncMessage_CallLinkUpdate)(nil), // 93: signalservice.SyncMessage.CallLinkUpdate - (*SyncMessage_CallLogEvent)(nil), // 94: signalservice.SyncMessage.CallLogEvent - (*SyncMessage_DeleteForMe)(nil), // 95: signalservice.SyncMessage.DeleteForMe - (*SyncMessage_DeviceNameChange)(nil), // 96: signalservice.SyncMessage.DeviceNameChange - (*SyncMessage_AttachmentBackfillRequest)(nil), // 97: signalservice.SyncMessage.AttachmentBackfillRequest - (*SyncMessage_AttachmentBackfillResponse)(nil), // 98: signalservice.SyncMessage.AttachmentBackfillResponse - (*SyncMessage_Sent_UnidentifiedDeliveryStatus)(nil), // 99: signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus - (*SyncMessage_Sent_StoryMessageRecipient)(nil), // 100: signalservice.SyncMessage.Sent.StoryMessageRecipient - (*SyncMessage_OutgoingPayment_MobileCoin)(nil), // 101: signalservice.SyncMessage.OutgoingPayment.MobileCoin - (*SyncMessage_DeleteForMe_MessageDeletes)(nil), // 102: signalservice.SyncMessage.DeleteForMe.MessageDeletes - (*SyncMessage_DeleteForMe_AttachmentDelete)(nil), // 103: signalservice.SyncMessage.DeleteForMe.AttachmentDelete - (*SyncMessage_DeleteForMe_ConversationDelete)(nil), // 104: signalservice.SyncMessage.DeleteForMe.ConversationDelete - (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete)(nil), // 105: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete - (*SyncMessage_AttachmentBackfillResponse_AttachmentData)(nil), // 106: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList)(nil), // 107: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList - (*ContactDetails_Avatar)(nil), // 108: signalservice.ContactDetails.Avatar - (*PaymentAddress_MobileCoin)(nil), // 109: signalservice.PaymentAddress.MobileCoin + (*DataMessage_PollCreate)(nil), // 65: signalservice.DataMessage.PollCreate + (*DataMessage_PollTerminate)(nil), // 66: signalservice.DataMessage.PollTerminate + (*DataMessage_PollVote)(nil), // 67: signalservice.DataMessage.PollVote + (*DataMessage_Payment_Amount)(nil), // 68: signalservice.DataMessage.Payment.Amount + (*DataMessage_Payment_Notification)(nil), // 69: signalservice.DataMessage.Payment.Notification + (*DataMessage_Payment_Activation)(nil), // 70: signalservice.DataMessage.Payment.Activation + (*DataMessage_Payment_Amount_MobileCoin)(nil), // 71: signalservice.DataMessage.Payment.Amount.MobileCoin + (*DataMessage_Payment_Notification_MobileCoin)(nil), // 72: signalservice.DataMessage.Payment.Notification.MobileCoin + (*DataMessage_Quote_QuotedAttachment)(nil), // 73: signalservice.DataMessage.Quote.QuotedAttachment + (*DataMessage_Contact_Name)(nil), // 74: signalservice.DataMessage.Contact.Name + (*DataMessage_Contact_Phone)(nil), // 75: signalservice.DataMessage.Contact.Phone + (*DataMessage_Contact_Email)(nil), // 76: signalservice.DataMessage.Contact.Email + (*DataMessage_Contact_PostalAddress)(nil), // 77: signalservice.DataMessage.Contact.PostalAddress + (*DataMessage_Contact_Avatar)(nil), // 78: signalservice.DataMessage.Contact.Avatar + (*TextAttachment_Gradient)(nil), // 79: signalservice.TextAttachment.Gradient + (*SyncMessage_Sent)(nil), // 80: signalservice.SyncMessage.Sent + (*SyncMessage_Contacts)(nil), // 81: signalservice.SyncMessage.Contacts + (*SyncMessage_Blocked)(nil), // 82: signalservice.SyncMessage.Blocked + (*SyncMessage_Request)(nil), // 83: signalservice.SyncMessage.Request + (*SyncMessage_Read)(nil), // 84: signalservice.SyncMessage.Read + (*SyncMessage_Viewed)(nil), // 85: signalservice.SyncMessage.Viewed + (*SyncMessage_Configuration)(nil), // 86: signalservice.SyncMessage.Configuration + (*SyncMessage_StickerPackOperation)(nil), // 87: signalservice.SyncMessage.StickerPackOperation + (*SyncMessage_ViewOnceOpen)(nil), // 88: signalservice.SyncMessage.ViewOnceOpen + (*SyncMessage_FetchLatest)(nil), // 89: signalservice.SyncMessage.FetchLatest + (*SyncMessage_Keys)(nil), // 90: signalservice.SyncMessage.Keys + (*SyncMessage_PniIdentity)(nil), // 91: signalservice.SyncMessage.PniIdentity + (*SyncMessage_MessageRequestResponse)(nil), // 92: signalservice.SyncMessage.MessageRequestResponse + (*SyncMessage_OutgoingPayment)(nil), // 93: signalservice.SyncMessage.OutgoingPayment + (*SyncMessage_PniChangeNumber)(nil), // 94: signalservice.SyncMessage.PniChangeNumber + (*SyncMessage_CallEvent)(nil), // 95: signalservice.SyncMessage.CallEvent + (*SyncMessage_CallLinkUpdate)(nil), // 96: signalservice.SyncMessage.CallLinkUpdate + (*SyncMessage_CallLogEvent)(nil), // 97: signalservice.SyncMessage.CallLogEvent + (*SyncMessage_DeleteForMe)(nil), // 98: signalservice.SyncMessage.DeleteForMe + (*SyncMessage_DeviceNameChange)(nil), // 99: signalservice.SyncMessage.DeviceNameChange + (*SyncMessage_AttachmentBackfillRequest)(nil), // 100: signalservice.SyncMessage.AttachmentBackfillRequest + (*SyncMessage_AttachmentBackfillResponse)(nil), // 101: signalservice.SyncMessage.AttachmentBackfillResponse + (*SyncMessage_Sent_UnidentifiedDeliveryStatus)(nil), // 102: signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus + (*SyncMessage_Sent_StoryMessageRecipient)(nil), // 103: signalservice.SyncMessage.Sent.StoryMessageRecipient + (*SyncMessage_OutgoingPayment_MobileCoin)(nil), // 104: signalservice.SyncMessage.OutgoingPayment.MobileCoin + (*SyncMessage_DeleteForMe_MessageDeletes)(nil), // 105: signalservice.SyncMessage.DeleteForMe.MessageDeletes + (*SyncMessage_DeleteForMe_AttachmentDelete)(nil), // 106: signalservice.SyncMessage.DeleteForMe.AttachmentDelete + (*SyncMessage_DeleteForMe_ConversationDelete)(nil), // 107: signalservice.SyncMessage.DeleteForMe.ConversationDelete + (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete)(nil), // 108: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete + (*SyncMessage_AttachmentBackfillResponse_AttachmentData)(nil), // 109: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList)(nil), // 110: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList + (*ContactDetails_Avatar)(nil), // 111: signalservice.ContactDetails.Avatar + (*PaymentAddress_MobileCoin)(nil), // 112: signalservice.PaymentAddress.MobileCoin } var file_SignalService_proto_depIdxs = []int32{ 0, // 0: signalservice.Envelope.type:type_name -> signalservice.Envelope.Type @@ -8577,108 +8801,111 @@ var file_SignalService_proto_depIdxs = []int32{ 56, // 26: signalservice.DataMessage.payment:type_name -> signalservice.DataMessage.Payment 63, // 27: signalservice.DataMessage.storyContext:type_name -> signalservice.DataMessage.StoryContext 64, // 28: signalservice.DataMessage.giftBadge:type_name -> signalservice.DataMessage.GiftBadge - 11, // 29: signalservice.ReceiptMessage.type:type_name -> signalservice.ReceiptMessage.Type - 12, // 30: signalservice.TypingMessage.action:type_name -> signalservice.TypingMessage.Action - 41, // 31: signalservice.StoryMessage.group:type_name -> signalservice.GroupContextV2 - 40, // 32: signalservice.StoryMessage.fileAttachment:type_name -> signalservice.AttachmentPointer - 37, // 33: signalservice.StoryMessage.textAttachment:type_name -> signalservice.TextAttachment - 47, // 34: signalservice.StoryMessage.bodyRanges:type_name -> signalservice.BodyRange - 40, // 35: signalservice.Preview.image:type_name -> signalservice.AttachmentPointer - 13, // 36: signalservice.TextAttachment.textStyle:type_name -> signalservice.TextAttachment.Style - 36, // 37: signalservice.TextAttachment.preview:type_name -> signalservice.Preview - 76, // 38: signalservice.TextAttachment.gradient:type_name -> signalservice.TextAttachment.Gradient - 14, // 39: signalservice.Verified.state:type_name -> signalservice.Verified.State - 77, // 40: signalservice.SyncMessage.sent:type_name -> signalservice.SyncMessage.Sent - 78, // 41: signalservice.SyncMessage.contacts:type_name -> signalservice.SyncMessage.Contacts - 80, // 42: signalservice.SyncMessage.request:type_name -> signalservice.SyncMessage.Request - 81, // 43: signalservice.SyncMessage.read:type_name -> signalservice.SyncMessage.Read - 79, // 44: signalservice.SyncMessage.blocked:type_name -> signalservice.SyncMessage.Blocked - 38, // 45: signalservice.SyncMessage.verified:type_name -> signalservice.Verified - 83, // 46: signalservice.SyncMessage.configuration:type_name -> signalservice.SyncMessage.Configuration - 84, // 47: signalservice.SyncMessage.stickerPackOperation:type_name -> signalservice.SyncMessage.StickerPackOperation - 85, // 48: signalservice.SyncMessage.viewOnceOpen:type_name -> signalservice.SyncMessage.ViewOnceOpen - 86, // 49: signalservice.SyncMessage.fetchLatest:type_name -> signalservice.SyncMessage.FetchLatest - 87, // 50: signalservice.SyncMessage.keys:type_name -> signalservice.SyncMessage.Keys - 89, // 51: signalservice.SyncMessage.messageRequestResponse:type_name -> signalservice.SyncMessage.MessageRequestResponse - 90, // 52: signalservice.SyncMessage.outgoingPayment:type_name -> signalservice.SyncMessage.OutgoingPayment - 82, // 53: signalservice.SyncMessage.viewed:type_name -> signalservice.SyncMessage.Viewed - 91, // 54: signalservice.SyncMessage.pniChangeNumber:type_name -> signalservice.SyncMessage.PniChangeNumber - 92, // 55: signalservice.SyncMessage.callEvent:type_name -> signalservice.SyncMessage.CallEvent - 93, // 56: signalservice.SyncMessage.callLinkUpdate:type_name -> signalservice.SyncMessage.CallLinkUpdate - 94, // 57: signalservice.SyncMessage.callLogEvent:type_name -> signalservice.SyncMessage.CallLogEvent - 95, // 58: signalservice.SyncMessage.deleteForMe:type_name -> signalservice.SyncMessage.DeleteForMe - 96, // 59: signalservice.SyncMessage.deviceNameChange:type_name -> signalservice.SyncMessage.DeviceNameChange - 97, // 60: signalservice.SyncMessage.attachmentBackfillRequest:type_name -> signalservice.SyncMessage.AttachmentBackfillRequest - 98, // 61: signalservice.SyncMessage.attachmentBackfillResponse:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse - 108, // 62: signalservice.ContactDetails.avatar:type_name -> signalservice.ContactDetails.Avatar - 109, // 63: signalservice.PaymentAddress.mobileCoin:type_name -> signalservice.PaymentAddress.MobileCoin - 31, // 64: signalservice.EditMessage.dataMessage:type_name -> signalservice.DataMessage - 27, // 65: signalservice.BodyRange.style:type_name -> signalservice.BodyRange.Style - 1, // 66: signalservice.CallMessage.Offer.type:type_name -> signalservice.CallMessage.Offer.Type - 2, // 67: signalservice.CallMessage.Hangup.type:type_name -> signalservice.CallMessage.Hangup.Type - 3, // 68: signalservice.CallMessage.Opaque.urgency:type_name -> signalservice.CallMessage.Opaque.Urgency - 66, // 69: signalservice.DataMessage.Payment.notification:type_name -> signalservice.DataMessage.Payment.Notification - 67, // 70: signalservice.DataMessage.Payment.activation:type_name -> signalservice.DataMessage.Payment.Activation - 70, // 71: signalservice.DataMessage.Quote.attachments:type_name -> signalservice.DataMessage.Quote.QuotedAttachment - 47, // 72: signalservice.DataMessage.Quote.bodyRanges:type_name -> signalservice.BodyRange - 7, // 73: signalservice.DataMessage.Quote.type:type_name -> signalservice.DataMessage.Quote.Type - 71, // 74: signalservice.DataMessage.Contact.name:type_name -> signalservice.DataMessage.Contact.Name - 72, // 75: signalservice.DataMessage.Contact.number:type_name -> signalservice.DataMessage.Contact.Phone - 73, // 76: signalservice.DataMessage.Contact.email:type_name -> signalservice.DataMessage.Contact.Email - 74, // 77: signalservice.DataMessage.Contact.address:type_name -> signalservice.DataMessage.Contact.PostalAddress - 75, // 78: signalservice.DataMessage.Contact.avatar:type_name -> signalservice.DataMessage.Contact.Avatar - 40, // 79: signalservice.DataMessage.Sticker.data:type_name -> signalservice.AttachmentPointer - 68, // 80: signalservice.DataMessage.Payment.Amount.mobileCoin:type_name -> signalservice.DataMessage.Payment.Amount.MobileCoin - 69, // 81: signalservice.DataMessage.Payment.Notification.mobileCoin:type_name -> signalservice.DataMessage.Payment.Notification.MobileCoin - 6, // 82: signalservice.DataMessage.Payment.Activation.type:type_name -> signalservice.DataMessage.Payment.Activation.Type - 40, // 83: signalservice.DataMessage.Quote.QuotedAttachment.thumbnail:type_name -> signalservice.AttachmentPointer - 8, // 84: signalservice.DataMessage.Contact.Phone.type:type_name -> signalservice.DataMessage.Contact.Phone.Type - 9, // 85: signalservice.DataMessage.Contact.Email.type:type_name -> signalservice.DataMessage.Contact.Email.Type - 10, // 86: signalservice.DataMessage.Contact.PostalAddress.type:type_name -> signalservice.DataMessage.Contact.PostalAddress.Type - 40, // 87: signalservice.DataMessage.Contact.Avatar.avatar:type_name -> signalservice.AttachmentPointer - 31, // 88: signalservice.SyncMessage.Sent.message:type_name -> signalservice.DataMessage - 99, // 89: signalservice.SyncMessage.Sent.unidentifiedStatus:type_name -> signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus - 35, // 90: signalservice.SyncMessage.Sent.storyMessage:type_name -> signalservice.StoryMessage - 100, // 91: signalservice.SyncMessage.Sent.storyMessageRecipients:type_name -> signalservice.SyncMessage.Sent.StoryMessageRecipient - 46, // 92: signalservice.SyncMessage.Sent.editMessage:type_name -> signalservice.EditMessage - 40, // 93: signalservice.SyncMessage.Contacts.blob:type_name -> signalservice.AttachmentPointer - 15, // 94: signalservice.SyncMessage.Request.type:type_name -> signalservice.SyncMessage.Request.Type - 16, // 95: signalservice.SyncMessage.StickerPackOperation.type:type_name -> signalservice.SyncMessage.StickerPackOperation.Type - 17, // 96: signalservice.SyncMessage.FetchLatest.type:type_name -> signalservice.SyncMessage.FetchLatest.Type - 18, // 97: signalservice.SyncMessage.MessageRequestResponse.type:type_name -> signalservice.SyncMessage.MessageRequestResponse.Type - 101, // 98: signalservice.SyncMessage.OutgoingPayment.mobileCoin:type_name -> signalservice.SyncMessage.OutgoingPayment.MobileCoin - 19, // 99: signalservice.SyncMessage.CallEvent.type:type_name -> signalservice.SyncMessage.CallEvent.Type - 20, // 100: signalservice.SyncMessage.CallEvent.direction:type_name -> signalservice.SyncMessage.CallEvent.Direction - 21, // 101: signalservice.SyncMessage.CallEvent.event:type_name -> signalservice.SyncMessage.CallEvent.Event - 22, // 102: signalservice.SyncMessage.CallLinkUpdate.type:type_name -> signalservice.SyncMessage.CallLinkUpdate.Type - 23, // 103: signalservice.SyncMessage.CallLogEvent.type:type_name -> signalservice.SyncMessage.CallLogEvent.Type - 102, // 104: signalservice.SyncMessage.DeleteForMe.messageDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.MessageDeletes - 104, // 105: signalservice.SyncMessage.DeleteForMe.conversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.ConversationDelete - 105, // 106: signalservice.SyncMessage.DeleteForMe.localOnlyConversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete - 103, // 107: signalservice.SyncMessage.DeleteForMe.attachmentDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.AttachmentDelete - 48, // 108: signalservice.SyncMessage.AttachmentBackfillRequest.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 109: signalservice.SyncMessage.AttachmentBackfillRequest.targetConversation:type_name -> signalservice.ConversationIdentifier - 48, // 110: signalservice.SyncMessage.AttachmentBackfillResponse.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 111: signalservice.SyncMessage.AttachmentBackfillResponse.targetConversation:type_name -> signalservice.ConversationIdentifier - 107, // 112: signalservice.SyncMessage.AttachmentBackfillResponse.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList - 24, // 113: signalservice.SyncMessage.AttachmentBackfillResponse.error:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.Error - 49, // 114: signalservice.SyncMessage.DeleteForMe.MessageDeletes.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 115: signalservice.SyncMessage.DeleteForMe.MessageDeletes.messages:type_name -> signalservice.AddressableMessage - 49, // 116: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 117: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 118: signalservice.SyncMessage.DeleteForMe.ConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 119: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentMessages:type_name -> signalservice.AddressableMessage - 48, // 120: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentNonExpiringMessages:type_name -> signalservice.AddressableMessage - 49, // 121: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier - 40, // 122: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.attachment:type_name -> signalservice.AttachmentPointer - 25, // 123: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.status:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status - 106, // 124: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - 106, // 125: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.longText:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - 126, // [126:126] is the sub-list for method output_type - 126, // [126:126] is the sub-list for method input_type - 126, // [126:126] is the sub-list for extension type_name - 126, // [126:126] is the sub-list for extension extendee - 0, // [0:126] is the sub-list for field type_name + 65, // 29: signalservice.DataMessage.pollCreate:type_name -> signalservice.DataMessage.PollCreate + 66, // 30: signalservice.DataMessage.pollTerminate:type_name -> signalservice.DataMessage.PollTerminate + 67, // 31: signalservice.DataMessage.pollVote:type_name -> signalservice.DataMessage.PollVote + 11, // 32: signalservice.ReceiptMessage.type:type_name -> signalservice.ReceiptMessage.Type + 12, // 33: signalservice.TypingMessage.action:type_name -> signalservice.TypingMessage.Action + 41, // 34: signalservice.StoryMessage.group:type_name -> signalservice.GroupContextV2 + 40, // 35: signalservice.StoryMessage.fileAttachment:type_name -> signalservice.AttachmentPointer + 37, // 36: signalservice.StoryMessage.textAttachment:type_name -> signalservice.TextAttachment + 47, // 37: signalservice.StoryMessage.bodyRanges:type_name -> signalservice.BodyRange + 40, // 38: signalservice.Preview.image:type_name -> signalservice.AttachmentPointer + 13, // 39: signalservice.TextAttachment.textStyle:type_name -> signalservice.TextAttachment.Style + 36, // 40: signalservice.TextAttachment.preview:type_name -> signalservice.Preview + 79, // 41: signalservice.TextAttachment.gradient:type_name -> signalservice.TextAttachment.Gradient + 14, // 42: signalservice.Verified.state:type_name -> signalservice.Verified.State + 80, // 43: signalservice.SyncMessage.sent:type_name -> signalservice.SyncMessage.Sent + 81, // 44: signalservice.SyncMessage.contacts:type_name -> signalservice.SyncMessage.Contacts + 83, // 45: signalservice.SyncMessage.request:type_name -> signalservice.SyncMessage.Request + 84, // 46: signalservice.SyncMessage.read:type_name -> signalservice.SyncMessage.Read + 82, // 47: signalservice.SyncMessage.blocked:type_name -> signalservice.SyncMessage.Blocked + 38, // 48: signalservice.SyncMessage.verified:type_name -> signalservice.Verified + 86, // 49: signalservice.SyncMessage.configuration:type_name -> signalservice.SyncMessage.Configuration + 87, // 50: signalservice.SyncMessage.stickerPackOperation:type_name -> signalservice.SyncMessage.StickerPackOperation + 88, // 51: signalservice.SyncMessage.viewOnceOpen:type_name -> signalservice.SyncMessage.ViewOnceOpen + 89, // 52: signalservice.SyncMessage.fetchLatest:type_name -> signalservice.SyncMessage.FetchLatest + 90, // 53: signalservice.SyncMessage.keys:type_name -> signalservice.SyncMessage.Keys + 92, // 54: signalservice.SyncMessage.messageRequestResponse:type_name -> signalservice.SyncMessage.MessageRequestResponse + 93, // 55: signalservice.SyncMessage.outgoingPayment:type_name -> signalservice.SyncMessage.OutgoingPayment + 85, // 56: signalservice.SyncMessage.viewed:type_name -> signalservice.SyncMessage.Viewed + 94, // 57: signalservice.SyncMessage.pniChangeNumber:type_name -> signalservice.SyncMessage.PniChangeNumber + 95, // 58: signalservice.SyncMessage.callEvent:type_name -> signalservice.SyncMessage.CallEvent + 96, // 59: signalservice.SyncMessage.callLinkUpdate:type_name -> signalservice.SyncMessage.CallLinkUpdate + 97, // 60: signalservice.SyncMessage.callLogEvent:type_name -> signalservice.SyncMessage.CallLogEvent + 98, // 61: signalservice.SyncMessage.deleteForMe:type_name -> signalservice.SyncMessage.DeleteForMe + 99, // 62: signalservice.SyncMessage.deviceNameChange:type_name -> signalservice.SyncMessage.DeviceNameChange + 100, // 63: signalservice.SyncMessage.attachmentBackfillRequest:type_name -> signalservice.SyncMessage.AttachmentBackfillRequest + 101, // 64: signalservice.SyncMessage.attachmentBackfillResponse:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse + 111, // 65: signalservice.ContactDetails.avatar:type_name -> signalservice.ContactDetails.Avatar + 112, // 66: signalservice.PaymentAddress.mobileCoin:type_name -> signalservice.PaymentAddress.MobileCoin + 31, // 67: signalservice.EditMessage.dataMessage:type_name -> signalservice.DataMessage + 27, // 68: signalservice.BodyRange.style:type_name -> signalservice.BodyRange.Style + 1, // 69: signalservice.CallMessage.Offer.type:type_name -> signalservice.CallMessage.Offer.Type + 2, // 70: signalservice.CallMessage.Hangup.type:type_name -> signalservice.CallMessage.Hangup.Type + 3, // 71: signalservice.CallMessage.Opaque.urgency:type_name -> signalservice.CallMessage.Opaque.Urgency + 69, // 72: signalservice.DataMessage.Payment.notification:type_name -> signalservice.DataMessage.Payment.Notification + 70, // 73: signalservice.DataMessage.Payment.activation:type_name -> signalservice.DataMessage.Payment.Activation + 73, // 74: signalservice.DataMessage.Quote.attachments:type_name -> signalservice.DataMessage.Quote.QuotedAttachment + 47, // 75: signalservice.DataMessage.Quote.bodyRanges:type_name -> signalservice.BodyRange + 7, // 76: signalservice.DataMessage.Quote.type:type_name -> signalservice.DataMessage.Quote.Type + 74, // 77: signalservice.DataMessage.Contact.name:type_name -> signalservice.DataMessage.Contact.Name + 75, // 78: signalservice.DataMessage.Contact.number:type_name -> signalservice.DataMessage.Contact.Phone + 76, // 79: signalservice.DataMessage.Contact.email:type_name -> signalservice.DataMessage.Contact.Email + 77, // 80: signalservice.DataMessage.Contact.address:type_name -> signalservice.DataMessage.Contact.PostalAddress + 78, // 81: signalservice.DataMessage.Contact.avatar:type_name -> signalservice.DataMessage.Contact.Avatar + 40, // 82: signalservice.DataMessage.Sticker.data:type_name -> signalservice.AttachmentPointer + 71, // 83: signalservice.DataMessage.Payment.Amount.mobileCoin:type_name -> signalservice.DataMessage.Payment.Amount.MobileCoin + 72, // 84: signalservice.DataMessage.Payment.Notification.mobileCoin:type_name -> signalservice.DataMessage.Payment.Notification.MobileCoin + 6, // 85: signalservice.DataMessage.Payment.Activation.type:type_name -> signalservice.DataMessage.Payment.Activation.Type + 40, // 86: signalservice.DataMessage.Quote.QuotedAttachment.thumbnail:type_name -> signalservice.AttachmentPointer + 8, // 87: signalservice.DataMessage.Contact.Phone.type:type_name -> signalservice.DataMessage.Contact.Phone.Type + 9, // 88: signalservice.DataMessage.Contact.Email.type:type_name -> signalservice.DataMessage.Contact.Email.Type + 10, // 89: signalservice.DataMessage.Contact.PostalAddress.type:type_name -> signalservice.DataMessage.Contact.PostalAddress.Type + 40, // 90: signalservice.DataMessage.Contact.Avatar.avatar:type_name -> signalservice.AttachmentPointer + 31, // 91: signalservice.SyncMessage.Sent.message:type_name -> signalservice.DataMessage + 102, // 92: signalservice.SyncMessage.Sent.unidentifiedStatus:type_name -> signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus + 35, // 93: signalservice.SyncMessage.Sent.storyMessage:type_name -> signalservice.StoryMessage + 103, // 94: signalservice.SyncMessage.Sent.storyMessageRecipients:type_name -> signalservice.SyncMessage.Sent.StoryMessageRecipient + 46, // 95: signalservice.SyncMessage.Sent.editMessage:type_name -> signalservice.EditMessage + 40, // 96: signalservice.SyncMessage.Contacts.blob:type_name -> signalservice.AttachmentPointer + 15, // 97: signalservice.SyncMessage.Request.type:type_name -> signalservice.SyncMessage.Request.Type + 16, // 98: signalservice.SyncMessage.StickerPackOperation.type:type_name -> signalservice.SyncMessage.StickerPackOperation.Type + 17, // 99: signalservice.SyncMessage.FetchLatest.type:type_name -> signalservice.SyncMessage.FetchLatest.Type + 18, // 100: signalservice.SyncMessage.MessageRequestResponse.type:type_name -> signalservice.SyncMessage.MessageRequestResponse.Type + 104, // 101: signalservice.SyncMessage.OutgoingPayment.mobileCoin:type_name -> signalservice.SyncMessage.OutgoingPayment.MobileCoin + 19, // 102: signalservice.SyncMessage.CallEvent.type:type_name -> signalservice.SyncMessage.CallEvent.Type + 20, // 103: signalservice.SyncMessage.CallEvent.direction:type_name -> signalservice.SyncMessage.CallEvent.Direction + 21, // 104: signalservice.SyncMessage.CallEvent.event:type_name -> signalservice.SyncMessage.CallEvent.Event + 22, // 105: signalservice.SyncMessage.CallLinkUpdate.type:type_name -> signalservice.SyncMessage.CallLinkUpdate.Type + 23, // 106: signalservice.SyncMessage.CallLogEvent.type:type_name -> signalservice.SyncMessage.CallLogEvent.Type + 105, // 107: signalservice.SyncMessage.DeleteForMe.messageDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.MessageDeletes + 107, // 108: signalservice.SyncMessage.DeleteForMe.conversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.ConversationDelete + 108, // 109: signalservice.SyncMessage.DeleteForMe.localOnlyConversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete + 106, // 110: signalservice.SyncMessage.DeleteForMe.attachmentDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.AttachmentDelete + 48, // 111: signalservice.SyncMessage.AttachmentBackfillRequest.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 112: signalservice.SyncMessage.AttachmentBackfillRequest.targetConversation:type_name -> signalservice.ConversationIdentifier + 48, // 113: signalservice.SyncMessage.AttachmentBackfillResponse.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 114: signalservice.SyncMessage.AttachmentBackfillResponse.targetConversation:type_name -> signalservice.ConversationIdentifier + 110, // 115: signalservice.SyncMessage.AttachmentBackfillResponse.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList + 24, // 116: signalservice.SyncMessage.AttachmentBackfillResponse.error:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.Error + 49, // 117: signalservice.SyncMessage.DeleteForMe.MessageDeletes.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 118: signalservice.SyncMessage.DeleteForMe.MessageDeletes.messages:type_name -> signalservice.AddressableMessage + 49, // 119: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 120: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 121: signalservice.SyncMessage.DeleteForMe.ConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 122: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentMessages:type_name -> signalservice.AddressableMessage + 48, // 123: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentNonExpiringMessages:type_name -> signalservice.AddressableMessage + 49, // 124: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier + 40, // 125: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.attachment:type_name -> signalservice.AttachmentPointer + 25, // 126: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.status:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status + 109, // 127: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + 109, // 128: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.longText:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + 129, // [129:129] is the sub-list for method output_type + 129, // [129:129] is the sub-list for method input_type + 129, // [129:129] is the sub-list for extension type_name + 129, // [129:129] is the sub-list for extension extendee + 0, // [0:129] is the sub-list for field type_name } func init() { file_SignalService_proto_init() } @@ -8718,20 +8945,20 @@ func file_SignalService_proto_init() { (*DataMessage_Payment_Notification_)(nil), (*DataMessage_Payment_Activation_)(nil), } - file_SignalService_proto_msgTypes[37].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[40].OneofWrappers = []any{ (*DataMessage_Payment_Amount_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[38].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[41].OneofWrappers = []any{ (*DataMessage_Payment_Notification_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[62].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[65].OneofWrappers = []any{ (*SyncMessage_OutgoingPayment_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[70].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[73].OneofWrappers = []any{ (*SyncMessage_AttachmentBackfillResponse_Attachments)(nil), (*SyncMessage_AttachmentBackfillResponse_Error_)(nil), } - file_SignalService_proto_msgTypes[78].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[81].OneofWrappers = []any{ (*SyncMessage_AttachmentBackfillResponse_AttachmentData_Attachment)(nil), (*SyncMessage_AttachmentBackfillResponse_AttachmentData_Status_)(nil), } @@ -8741,7 +8968,7 @@ func file_SignalService_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_SignalService_proto_rawDesc), len(file_SignalService_proto_rawDesc)), NumEnums: 28, - NumMessages: 82, + NumMessages: 85, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/signalmeow/protobuf/SignalService.proto b/pkg/signalmeow/protobuf/SignalService.proto index a1fa8f9..249c4eb 100644 --- a/pkg/signalmeow/protobuf/SignalService.proto +++ b/pkg/signalmeow/protobuf/SignalService.proto @@ -177,6 +177,7 @@ message DataMessage { enum Type { NORMAL = 0; GIFT_BADGE = 1; + POLL = 2; } message QuotedAttachment { @@ -302,6 +303,7 @@ message DataMessage { CDN_SELECTOR_ATTACHMENTS = 5; MENTIONS = 6; PAYMENTS = 7; + POLLS = 8; CURRENT = 7; } @@ -309,6 +311,23 @@ message DataMessage { optional bytes receiptCredentialPresentation = 1; } + message PollCreate { + optional string question = 1; + optional bool allowMultiple = 2; + repeated string options = 3; + } + + message PollTerminate { + optional uint64 targetSentTimestamp = 1; + } + + message PollVote { + optional bytes targetAuthorAciBinary = 1; + optional uint64 targetSentTimestamp = 2; + repeated uint32 optionIndexes = 3; // must be in the range [0, options.length) from the PollCreate + optional uint32 voteCount = 4; // increment this by 1 each time you vote on a given poll + } + optional string body = 1; repeated AttachmentPointer attachments = 2; reserved /*groupV1*/ 3; @@ -331,7 +350,10 @@ message DataMessage { optional Payment payment = 20; optional StoryContext storyContext = 21; optional GiftBadge giftBadge = 22; - // NEXT ID: 24 + optional PollCreate pollCreate = 24; + optional PollTerminate pollTerminate = 25; + optional PollVote pollVote = 26; + // NEXT ID: 27 } message NullMessage { diff --git a/pkg/signalmeow/protobuf/StickerResources.pb.go b/pkg/signalmeow/protobuf/StickerResources.pb.go index b1969bc..52905c6 100644 --- a/pkg/signalmeow/protobuf/StickerResources.pb.go +++ b/pkg/signalmeow/protobuf/StickerResources.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: StickerResources.proto diff --git a/pkg/signalmeow/protobuf/StorageService.pb.go b/pkg/signalmeow/protobuf/StorageService.pb.go index 33804f6..1294a3f 100644 --- a/pkg/signalmeow/protobuf/StorageService.pb.go +++ b/pkg/signalmeow/protobuf/StorageService.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: StorageService.proto diff --git a/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go b/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go index bb5b256..d512960 100644 --- a/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go +++ b/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: UnidentifiedDelivery.proto diff --git a/pkg/signalmeow/protobuf/WebSocketResources.pb.go b/pkg/signalmeow/protobuf/WebSocketResources.pb.go index ff48cda..ef45ba0 100644 --- a/pkg/signalmeow/protobuf/WebSocketResources.pb.go +++ b/pkg/signalmeow/protobuf/WebSocketResources.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: WebSocketResources.proto diff --git a/pkg/signalmeow/protobuf/backuppb/Backup.pb.go b/pkg/signalmeow/protobuf/backuppb/Backup.pb.go index 3eaaed0..86e176a 100644 --- a/pkg/signalmeow/protobuf/backuppb/Backup.pb.go +++ b/pkg/signalmeow/protobuf/backuppb/Backup.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 +// protoc-gen-go v1.36.10 // protoc v3.21.12 // source: backuppb/Backup.proto @@ -1098,6 +1098,7 @@ const ( Quote_NORMAL Quote_Type = 1 Quote_GIFT_BADGE Quote_Type = 2 Quote_VIEW_ONCE Quote_Type = 3 + Quote_POLL Quote_Type = 4 ) // Enum value maps for Quote_Type. @@ -1107,12 +1108,14 @@ var ( 1: "NORMAL", 2: "GIFT_BADGE", 3: "VIEW_ONCE", + 4: "POLL", } Quote_Type_value = map[string]int32{ "UNKNOWN": 0, "NORMAL": 1, "GIFT_BADGE": 2, "VIEW_ONCE": 3, + "POLL": 4, } ) @@ -1247,7 +1250,7 @@ func (x IndividualCall_Type) Number() protoreflect.EnumNumber { // Deprecated: Use IndividualCall_Type.Descriptor instead. func (IndividualCall_Type) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{33, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{34, 0} } type IndividualCall_Direction int32 @@ -1296,7 +1299,7 @@ func (x IndividualCall_Direction) Number() protoreflect.EnumNumber { // Deprecated: Use IndividualCall_Direction.Descriptor instead. func (IndividualCall_Direction) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{33, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{34, 1} } type IndividualCall_State int32 @@ -1355,7 +1358,7 @@ func (x IndividualCall_State) Number() protoreflect.EnumNumber { // Deprecated: Use IndividualCall_State.Descriptor instead. func (IndividualCall_State) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{33, 2} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{34, 2} } type GroupCall_State int32 @@ -1431,7 +1434,7 @@ func (x GroupCall_State) Number() protoreflect.EnumNumber { // Deprecated: Use GroupCall_State.Descriptor instead. func (GroupCall_State) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{34, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{35, 0} } type SimpleChatUpdate_Type int32 @@ -1522,7 +1525,7 @@ func (x SimpleChatUpdate_Type) Number() protoreflect.EnumNumber { // Deprecated: Use SimpleChatUpdate_Type.Descriptor instead. func (SimpleChatUpdate_Type) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{35, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{36, 0} } type ChatStyle_WallpaperPreset int32 @@ -1628,7 +1631,7 @@ func (x ChatStyle_WallpaperPreset) Number() protoreflect.EnumNumber { // Deprecated: Use ChatStyle_WallpaperPreset.Descriptor instead. func (ChatStyle_WallpaperPreset) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{77, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 0} } type ChatStyle_BubbleColorPreset int32 @@ -1737,7 +1740,7 @@ func (x ChatStyle_BubbleColorPreset) Number() protoreflect.EnumNumber { // Deprecated: Use ChatStyle_BubbleColorPreset.Descriptor instead. func (ChatStyle_BubbleColorPreset) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{77, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 1} } type NotificationProfile_DayOfWeek int32 @@ -1801,7 +1804,7 @@ func (x NotificationProfile_DayOfWeek) Number() protoreflect.EnumNumber { // Deprecated: Use NotificationProfile_DayOfWeek.Descriptor instead. func (NotificationProfile_DayOfWeek) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{78, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 0} } // Represents the default "All chats" folder record vs all other custom folders @@ -1851,7 +1854,7 @@ func (x ChatFolder_FolderType) Number() protoreflect.EnumNumber { // Deprecated: Use ChatFolder_FolderType.Descriptor instead. func (ChatFolder_FolderType) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{81, 0} } type BackupInfo struct { @@ -3282,6 +3285,7 @@ type ChatItem struct { // *ChatItem_GiftBadge // *ChatItem_ViewOnceMessage // *ChatItem_DirectStoryReplyMessage + // *ChatItem_Poll Item isChatItem_Item `protobuf_oneof:"item"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -3488,6 +3492,15 @@ func (x *ChatItem) GetDirectStoryReplyMessage() *DirectStoryReplyMessage { return nil } +func (x *ChatItem) GetPoll() *Poll { + if x != nil { + if x, ok := x.Item.(*ChatItem_Poll); ok { + return x.Poll + } + } + return nil +} + type isChatItem_DirectionalDetails interface { isChatItem_DirectionalDetails() } @@ -3550,6 +3563,10 @@ type ChatItem_DirectStoryReplyMessage struct { DirectStoryReplyMessage *DirectStoryReplyMessage `protobuf:"bytes,19,opt,name=directStoryReplyMessage,proto3,oneof"` // group story reply messages are not backed up } +type ChatItem_Poll struct { + Poll *Poll `protobuf:"bytes,20,opt,name=poll,proto3,oneof"` +} + func (*ChatItem_StandardMessage) isChatItem_Item() {} func (*ChatItem_ContactMessage) isChatItem_Item() {} @@ -3568,6 +3585,8 @@ func (*ChatItem_ViewOnceMessage) isChatItem_Item() {} func (*ChatItem_DirectStoryReplyMessage) isChatItem_Item() {} +func (*ChatItem_Poll) isChatItem_Item() {} + type SendStatus struct { state protoimpl.MessageState `protogen:"open.v1"` RecipientId uint64 `protobuf:"varint,1,opt,name=recipientId,proto3" json:"recipientId,omitempty"` @@ -4958,6 +4977,74 @@ func (x *Reaction) GetSortOrder() uint64 { return 0 } +type Poll struct { + state protoimpl.MessageState `protogen:"open.v1"` + Question string `protobuf:"bytes,1,opt,name=question,proto3" json:"question,omitempty"` // Between 1-100 characters + AllowMultiple bool `protobuf:"varint,2,opt,name=allowMultiple,proto3" json:"allowMultiple,omitempty"` + Options []*Poll_PollOption `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` // At least two + HasEnded bool `protobuf:"varint,4,opt,name=hasEnded,proto3" json:"hasEnded,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Poll) Reset() { + *x = Poll{} + mi := &file_backuppb_Backup_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Poll) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Poll) ProtoMessage() {} + +func (x *Poll) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Poll.ProtoReflect.Descriptor instead. +func (*Poll) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{32} +} + +func (x *Poll) GetQuestion() string { + if x != nil { + return x.Question + } + return "" +} + +func (x *Poll) GetAllowMultiple() bool { + if x != nil { + return x.AllowMultiple + } + return false +} + +func (x *Poll) GetOptions() []*Poll_PollOption { + if x != nil { + return x.Options + } + return nil +} + +func (x *Poll) GetHasEnded() bool { + if x != nil { + return x.HasEnded + } + return false +} + type ChatUpdateMessage struct { state protoimpl.MessageState `protogen:"open.v1"` // If unset, importers should ignore the update message without throwing an error. @@ -4973,6 +5060,7 @@ type ChatUpdateMessage struct { // *ChatUpdateMessage_IndividualCall // *ChatUpdateMessage_GroupCall // *ChatUpdateMessage_LearnedProfileChange + // *ChatUpdateMessage_PollTerminate Update isChatUpdateMessage_Update `protobuf_oneof:"update"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -4980,7 +5068,7 @@ type ChatUpdateMessage struct { func (x *ChatUpdateMessage) Reset() { *x = ChatUpdateMessage{} - mi := &file_backuppb_Backup_proto_msgTypes[32] + mi := &file_backuppb_Backup_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4992,7 +5080,7 @@ func (x *ChatUpdateMessage) String() string { func (*ChatUpdateMessage) ProtoMessage() {} func (x *ChatUpdateMessage) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[32] + mi := &file_backuppb_Backup_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5005,7 +5093,7 @@ func (x *ChatUpdateMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatUpdateMessage.ProtoReflect.Descriptor instead. func (*ChatUpdateMessage) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{32} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{33} } func (x *ChatUpdateMessage) GetUpdate() isChatUpdateMessage_Update { @@ -5096,6 +5184,15 @@ func (x *ChatUpdateMessage) GetLearnedProfileChange() *LearnedProfileChatUpdate return nil } +func (x *ChatUpdateMessage) GetPollTerminate() *PollTerminateUpdate { + if x != nil { + if x, ok := x.Update.(*ChatUpdateMessage_PollTerminate); ok { + return x.PollTerminate + } + } + return nil +} + type isChatUpdateMessage_Update interface { isChatUpdateMessage_Update() } @@ -5136,6 +5233,10 @@ type ChatUpdateMessage_LearnedProfileChange struct { LearnedProfileChange *LearnedProfileChatUpdate `protobuf:"bytes,9,opt,name=learnedProfileChange,proto3,oneof"` } +type ChatUpdateMessage_PollTerminate struct { + PollTerminate *PollTerminateUpdate `protobuf:"bytes,10,opt,name=pollTerminate,proto3,oneof"` +} + func (*ChatUpdateMessage_SimpleUpdate) isChatUpdateMessage_Update() {} func (*ChatUpdateMessage_GroupChange) isChatUpdateMessage_Update() {} @@ -5154,6 +5255,8 @@ func (*ChatUpdateMessage_GroupCall) isChatUpdateMessage_Update() {} func (*ChatUpdateMessage_LearnedProfileChange) isChatUpdateMessage_Update() {} +func (*ChatUpdateMessage_PollTerminate) isChatUpdateMessage_Update() {} + type IndividualCall struct { state protoimpl.MessageState `protogen:"open.v1"` CallId *uint64 `protobuf:"varint,1,opt,name=callId,proto3,oneof" json:"callId,omitempty"` @@ -5168,7 +5271,7 @@ type IndividualCall struct { func (x *IndividualCall) Reset() { *x = IndividualCall{} - mi := &file_backuppb_Backup_proto_msgTypes[33] + mi := &file_backuppb_Backup_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5180,7 +5283,7 @@ func (x *IndividualCall) String() string { func (*IndividualCall) ProtoMessage() {} func (x *IndividualCall) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[33] + mi := &file_backuppb_Backup_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5193,7 +5296,7 @@ func (x *IndividualCall) ProtoReflect() protoreflect.Message { // Deprecated: Use IndividualCall.ProtoReflect.Descriptor instead. func (*IndividualCall) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{33} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{34} } func (x *IndividualCall) GetCallId() uint64 { @@ -5253,7 +5356,7 @@ type GroupCall struct { func (x *GroupCall) Reset() { *x = GroupCall{} - mi := &file_backuppb_Backup_proto_msgTypes[34] + mi := &file_backuppb_Backup_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5265,7 +5368,7 @@ func (x *GroupCall) String() string { func (*GroupCall) ProtoMessage() {} func (x *GroupCall) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[34] + mi := &file_backuppb_Backup_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5278,7 +5381,7 @@ func (x *GroupCall) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupCall.ProtoReflect.Descriptor instead. func (*GroupCall) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{34} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{35} } func (x *GroupCall) GetCallId() uint64 { @@ -5339,7 +5442,7 @@ type SimpleChatUpdate struct { func (x *SimpleChatUpdate) Reset() { *x = SimpleChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[35] + mi := &file_backuppb_Backup_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5351,7 +5454,7 @@ func (x *SimpleChatUpdate) String() string { func (*SimpleChatUpdate) ProtoMessage() {} func (x *SimpleChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[35] + mi := &file_backuppb_Backup_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5364,7 +5467,7 @@ func (x *SimpleChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use SimpleChatUpdate.ProtoReflect.Descriptor instead. func (*SimpleChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{35} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{36} } func (x *SimpleChatUpdate) GetType() SimpleChatUpdate_Type { @@ -5385,7 +5488,7 @@ type ExpirationTimerChatUpdate struct { func (x *ExpirationTimerChatUpdate) Reset() { *x = ExpirationTimerChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[36] + mi := &file_backuppb_Backup_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5397,7 +5500,7 @@ func (x *ExpirationTimerChatUpdate) String() string { func (*ExpirationTimerChatUpdate) ProtoMessage() {} func (x *ExpirationTimerChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[36] + mi := &file_backuppb_Backup_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5410,7 +5513,7 @@ func (x *ExpirationTimerChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpirationTimerChatUpdate.ProtoReflect.Descriptor instead. func (*ExpirationTimerChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{36} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{37} } func (x *ExpirationTimerChatUpdate) GetExpiresInMs() uint64 { @@ -5430,7 +5533,7 @@ type ProfileChangeChatUpdate struct { func (x *ProfileChangeChatUpdate) Reset() { *x = ProfileChangeChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[37] + mi := &file_backuppb_Backup_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5442,7 +5545,7 @@ func (x *ProfileChangeChatUpdate) String() string { func (*ProfileChangeChatUpdate) ProtoMessage() {} func (x *ProfileChangeChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[37] + mi := &file_backuppb_Backup_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5455,7 +5558,7 @@ func (x *ProfileChangeChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileChangeChatUpdate.ProtoReflect.Descriptor instead. func (*ProfileChangeChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{37} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{38} } func (x *ProfileChangeChatUpdate) GetPreviousName() string { @@ -5487,7 +5590,7 @@ type LearnedProfileChatUpdate struct { func (x *LearnedProfileChatUpdate) Reset() { *x = LearnedProfileChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[38] + mi := &file_backuppb_Backup_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5499,7 +5602,7 @@ func (x *LearnedProfileChatUpdate) String() string { func (*LearnedProfileChatUpdate) ProtoMessage() {} func (x *LearnedProfileChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[38] + mi := &file_backuppb_Backup_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5512,7 +5615,7 @@ func (x *LearnedProfileChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use LearnedProfileChatUpdate.ProtoReflect.Descriptor instead. func (*LearnedProfileChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{38} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{39} } func (x *LearnedProfileChatUpdate) GetPreviousName() isLearnedProfileChatUpdate_PreviousName { @@ -5565,7 +5668,7 @@ type ThreadMergeChatUpdate struct { func (x *ThreadMergeChatUpdate) Reset() { *x = ThreadMergeChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[39] + mi := &file_backuppb_Backup_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5577,7 +5680,7 @@ func (x *ThreadMergeChatUpdate) String() string { func (*ThreadMergeChatUpdate) ProtoMessage() {} func (x *ThreadMergeChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[39] + mi := &file_backuppb_Backup_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5590,7 +5693,7 @@ func (x *ThreadMergeChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ThreadMergeChatUpdate.ProtoReflect.Descriptor instead. func (*ThreadMergeChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{39} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{40} } func (x *ThreadMergeChatUpdate) GetPreviousE164() uint64 { @@ -5609,7 +5712,7 @@ type SessionSwitchoverChatUpdate struct { func (x *SessionSwitchoverChatUpdate) Reset() { *x = SessionSwitchoverChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[40] + mi := &file_backuppb_Backup_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5621,7 +5724,7 @@ func (x *SessionSwitchoverChatUpdate) String() string { func (*SessionSwitchoverChatUpdate) ProtoMessage() {} func (x *SessionSwitchoverChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[40] + mi := &file_backuppb_Backup_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5634,7 +5737,7 @@ func (x *SessionSwitchoverChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionSwitchoverChatUpdate.ProtoReflect.Descriptor instead. func (*SessionSwitchoverChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{40} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{41} } func (x *SessionSwitchoverChatUpdate) GetE164() uint64 { @@ -5655,7 +5758,7 @@ type GroupChangeChatUpdate struct { func (x *GroupChangeChatUpdate) Reset() { *x = GroupChangeChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[41] + mi := &file_backuppb_Backup_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5667,7 +5770,7 @@ func (x *GroupChangeChatUpdate) String() string { func (*GroupChangeChatUpdate) ProtoMessage() {} func (x *GroupChangeChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[41] + mi := &file_backuppb_Backup_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5680,7 +5783,7 @@ func (x *GroupChangeChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupChangeChatUpdate.ProtoReflect.Descriptor instead. func (*GroupChangeChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{41} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{42} } func (x *GroupChangeChatUpdate) GetUpdates() []*GroupChangeChatUpdate_Update { @@ -5699,7 +5802,7 @@ type GenericGroupUpdate struct { func (x *GenericGroupUpdate) Reset() { *x = GenericGroupUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[42] + mi := &file_backuppb_Backup_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5711,7 +5814,7 @@ func (x *GenericGroupUpdate) String() string { func (*GenericGroupUpdate) ProtoMessage() {} func (x *GenericGroupUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[42] + mi := &file_backuppb_Backup_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5724,7 +5827,7 @@ func (x *GenericGroupUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GenericGroupUpdate.ProtoReflect.Descriptor instead. func (*GenericGroupUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{42} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{43} } func (x *GenericGroupUpdate) GetUpdaterAci() []byte { @@ -5743,7 +5846,7 @@ type GroupCreationUpdate struct { func (x *GroupCreationUpdate) Reset() { *x = GroupCreationUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[43] + mi := &file_backuppb_Backup_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5755,7 +5858,7 @@ func (x *GroupCreationUpdate) String() string { func (*GroupCreationUpdate) ProtoMessage() {} func (x *GroupCreationUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[43] + mi := &file_backuppb_Backup_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5768,7 +5871,7 @@ func (x *GroupCreationUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupCreationUpdate.ProtoReflect.Descriptor instead. func (*GroupCreationUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{43} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{44} } func (x *GroupCreationUpdate) GetUpdaterAci() []byte { @@ -5789,7 +5892,7 @@ type GroupNameUpdate struct { func (x *GroupNameUpdate) Reset() { *x = GroupNameUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[44] + mi := &file_backuppb_Backup_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5801,7 +5904,7 @@ func (x *GroupNameUpdate) String() string { func (*GroupNameUpdate) ProtoMessage() {} func (x *GroupNameUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[44] + mi := &file_backuppb_Backup_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5814,7 +5917,7 @@ func (x *GroupNameUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupNameUpdate.ProtoReflect.Descriptor instead. func (*GroupNameUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{44} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{45} } func (x *GroupNameUpdate) GetUpdaterAci() []byte { @@ -5841,7 +5944,7 @@ type GroupAvatarUpdate struct { func (x *GroupAvatarUpdate) Reset() { *x = GroupAvatarUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[45] + mi := &file_backuppb_Backup_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5853,7 +5956,7 @@ func (x *GroupAvatarUpdate) String() string { func (*GroupAvatarUpdate) ProtoMessage() {} func (x *GroupAvatarUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[45] + mi := &file_backuppb_Backup_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5866,7 +5969,7 @@ func (x *GroupAvatarUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupAvatarUpdate.ProtoReflect.Descriptor instead. func (*GroupAvatarUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{45} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{46} } func (x *GroupAvatarUpdate) GetUpdaterAci() []byte { @@ -5894,7 +5997,7 @@ type GroupDescriptionUpdate struct { func (x *GroupDescriptionUpdate) Reset() { *x = GroupDescriptionUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[46] + mi := &file_backuppb_Backup_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5906,7 +6009,7 @@ func (x *GroupDescriptionUpdate) String() string { func (*GroupDescriptionUpdate) ProtoMessage() {} func (x *GroupDescriptionUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[46] + mi := &file_backuppb_Backup_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5919,7 +6022,7 @@ func (x *GroupDescriptionUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupDescriptionUpdate.ProtoReflect.Descriptor instead. func (*GroupDescriptionUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{46} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{47} } func (x *GroupDescriptionUpdate) GetUpdaterAci() []byte { @@ -5946,7 +6049,7 @@ type GroupMembershipAccessLevelChangeUpdate struct { func (x *GroupMembershipAccessLevelChangeUpdate) Reset() { *x = GroupMembershipAccessLevelChangeUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[47] + mi := &file_backuppb_Backup_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5958,7 +6061,7 @@ func (x *GroupMembershipAccessLevelChangeUpdate) String() string { func (*GroupMembershipAccessLevelChangeUpdate) ProtoMessage() {} func (x *GroupMembershipAccessLevelChangeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[47] + mi := &file_backuppb_Backup_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5971,7 +6074,7 @@ func (x *GroupMembershipAccessLevelChangeUpdate) ProtoReflect() protoreflect.Mes // Deprecated: Use GroupMembershipAccessLevelChangeUpdate.ProtoReflect.Descriptor instead. func (*GroupMembershipAccessLevelChangeUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{47} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{48} } func (x *GroupMembershipAccessLevelChangeUpdate) GetUpdaterAci() []byte { @@ -5998,7 +6101,7 @@ type GroupAttributesAccessLevelChangeUpdate struct { func (x *GroupAttributesAccessLevelChangeUpdate) Reset() { *x = GroupAttributesAccessLevelChangeUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[48] + mi := &file_backuppb_Backup_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6010,7 +6113,7 @@ func (x *GroupAttributesAccessLevelChangeUpdate) String() string { func (*GroupAttributesAccessLevelChangeUpdate) ProtoMessage() {} func (x *GroupAttributesAccessLevelChangeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[48] + mi := &file_backuppb_Backup_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6023,7 +6126,7 @@ func (x *GroupAttributesAccessLevelChangeUpdate) ProtoReflect() protoreflect.Mes // Deprecated: Use GroupAttributesAccessLevelChangeUpdate.ProtoReflect.Descriptor instead. func (*GroupAttributesAccessLevelChangeUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{48} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{49} } func (x *GroupAttributesAccessLevelChangeUpdate) GetUpdaterAci() []byte { @@ -6050,7 +6153,7 @@ type GroupAnnouncementOnlyChangeUpdate struct { func (x *GroupAnnouncementOnlyChangeUpdate) Reset() { *x = GroupAnnouncementOnlyChangeUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[49] + mi := &file_backuppb_Backup_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6062,7 +6165,7 @@ func (x *GroupAnnouncementOnlyChangeUpdate) String() string { func (*GroupAnnouncementOnlyChangeUpdate) ProtoMessage() {} func (x *GroupAnnouncementOnlyChangeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[49] + mi := &file_backuppb_Backup_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6075,7 +6178,7 @@ func (x *GroupAnnouncementOnlyChangeUpdate) ProtoReflect() protoreflect.Message // Deprecated: Use GroupAnnouncementOnlyChangeUpdate.ProtoReflect.Descriptor instead. func (*GroupAnnouncementOnlyChangeUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{49} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{50} } func (x *GroupAnnouncementOnlyChangeUpdate) GetUpdaterAci() []byte { @@ -6104,7 +6207,7 @@ type GroupAdminStatusUpdate struct { func (x *GroupAdminStatusUpdate) Reset() { *x = GroupAdminStatusUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[50] + mi := &file_backuppb_Backup_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6116,7 +6219,7 @@ func (x *GroupAdminStatusUpdate) String() string { func (*GroupAdminStatusUpdate) ProtoMessage() {} func (x *GroupAdminStatusUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[50] + mi := &file_backuppb_Backup_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6129,7 +6232,7 @@ func (x *GroupAdminStatusUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupAdminStatusUpdate.ProtoReflect.Descriptor instead. func (*GroupAdminStatusUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{50} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{51} } func (x *GroupAdminStatusUpdate) GetUpdaterAci() []byte { @@ -6162,7 +6265,7 @@ type GroupMemberLeftUpdate struct { func (x *GroupMemberLeftUpdate) Reset() { *x = GroupMemberLeftUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[51] + mi := &file_backuppb_Backup_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6174,7 +6277,7 @@ func (x *GroupMemberLeftUpdate) String() string { func (*GroupMemberLeftUpdate) ProtoMessage() {} func (x *GroupMemberLeftUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[51] + mi := &file_backuppb_Backup_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6187,7 +6290,7 @@ func (x *GroupMemberLeftUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberLeftUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberLeftUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{51} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{52} } func (x *GroupMemberLeftUpdate) GetAci() []byte { @@ -6207,7 +6310,7 @@ type GroupMemberRemovedUpdate struct { func (x *GroupMemberRemovedUpdate) Reset() { *x = GroupMemberRemovedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[52] + mi := &file_backuppb_Backup_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6219,7 +6322,7 @@ func (x *GroupMemberRemovedUpdate) String() string { func (*GroupMemberRemovedUpdate) ProtoMessage() {} func (x *GroupMemberRemovedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[52] + mi := &file_backuppb_Backup_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6232,7 +6335,7 @@ func (x *GroupMemberRemovedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberRemovedUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberRemovedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{52} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{53} } func (x *GroupMemberRemovedUpdate) GetRemoverAci() []byte { @@ -6258,7 +6361,7 @@ type SelfInvitedToGroupUpdate struct { func (x *SelfInvitedToGroupUpdate) Reset() { *x = SelfInvitedToGroupUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[53] + mi := &file_backuppb_Backup_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6270,7 +6373,7 @@ func (x *SelfInvitedToGroupUpdate) String() string { func (*SelfInvitedToGroupUpdate) ProtoMessage() {} func (x *SelfInvitedToGroupUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[53] + mi := &file_backuppb_Backup_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6283,7 +6386,7 @@ func (x *SelfInvitedToGroupUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfInvitedToGroupUpdate.ProtoReflect.Descriptor instead. func (*SelfInvitedToGroupUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{53} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{54} } func (x *SelfInvitedToGroupUpdate) GetInviterAci() []byte { @@ -6303,7 +6406,7 @@ type SelfInvitedOtherUserToGroupUpdate struct { func (x *SelfInvitedOtherUserToGroupUpdate) Reset() { *x = SelfInvitedOtherUserToGroupUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[54] + mi := &file_backuppb_Backup_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6315,7 +6418,7 @@ func (x *SelfInvitedOtherUserToGroupUpdate) String() string { func (*SelfInvitedOtherUserToGroupUpdate) ProtoMessage() {} func (x *SelfInvitedOtherUserToGroupUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[54] + mi := &file_backuppb_Backup_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6328,7 +6431,7 @@ func (x *SelfInvitedOtherUserToGroupUpdate) ProtoReflect() protoreflect.Message // Deprecated: Use SelfInvitedOtherUserToGroupUpdate.ProtoReflect.Descriptor instead. func (*SelfInvitedOtherUserToGroupUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{54} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{55} } func (x *SelfInvitedOtherUserToGroupUpdate) GetInviteeServiceId() []byte { @@ -6349,7 +6452,7 @@ type GroupUnknownInviteeUpdate struct { func (x *GroupUnknownInviteeUpdate) Reset() { *x = GroupUnknownInviteeUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[55] + mi := &file_backuppb_Backup_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6361,7 +6464,7 @@ func (x *GroupUnknownInviteeUpdate) String() string { func (*GroupUnknownInviteeUpdate) ProtoMessage() {} func (x *GroupUnknownInviteeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[55] + mi := &file_backuppb_Backup_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6374,7 +6477,7 @@ func (x *GroupUnknownInviteeUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupUnknownInviteeUpdate.ProtoReflect.Descriptor instead. func (*GroupUnknownInviteeUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{55} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{56} } func (x *GroupUnknownInviteeUpdate) GetInviterAci() []byte { @@ -6401,7 +6504,7 @@ type GroupInvitationAcceptedUpdate struct { func (x *GroupInvitationAcceptedUpdate) Reset() { *x = GroupInvitationAcceptedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[56] + mi := &file_backuppb_Backup_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6413,7 +6516,7 @@ func (x *GroupInvitationAcceptedUpdate) String() string { func (*GroupInvitationAcceptedUpdate) ProtoMessage() {} func (x *GroupInvitationAcceptedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[56] + mi := &file_backuppb_Backup_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6426,7 +6529,7 @@ func (x *GroupInvitationAcceptedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInvitationAcceptedUpdate.ProtoReflect.Descriptor instead. func (*GroupInvitationAcceptedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{56} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{57} } func (x *GroupInvitationAcceptedUpdate) GetInviterAci() []byte { @@ -6454,7 +6557,7 @@ type GroupInvitationDeclinedUpdate struct { func (x *GroupInvitationDeclinedUpdate) Reset() { *x = GroupInvitationDeclinedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[57] + mi := &file_backuppb_Backup_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6466,7 +6569,7 @@ func (x *GroupInvitationDeclinedUpdate) String() string { func (*GroupInvitationDeclinedUpdate) ProtoMessage() {} func (x *GroupInvitationDeclinedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[57] + mi := &file_backuppb_Backup_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6479,7 +6582,7 @@ func (x *GroupInvitationDeclinedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInvitationDeclinedUpdate.ProtoReflect.Descriptor instead. func (*GroupInvitationDeclinedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{57} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{58} } func (x *GroupInvitationDeclinedUpdate) GetInviterAci() []byte { @@ -6505,7 +6608,7 @@ type GroupMemberJoinedUpdate struct { func (x *GroupMemberJoinedUpdate) Reset() { *x = GroupMemberJoinedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[58] + mi := &file_backuppb_Backup_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6517,7 +6620,7 @@ func (x *GroupMemberJoinedUpdate) String() string { func (*GroupMemberJoinedUpdate) ProtoMessage() {} func (x *GroupMemberJoinedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[58] + mi := &file_backuppb_Backup_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6530,7 +6633,7 @@ func (x *GroupMemberJoinedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberJoinedUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberJoinedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{58} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{59} } func (x *GroupMemberJoinedUpdate) GetNewMemberAci() []byte { @@ -6553,7 +6656,7 @@ type GroupMemberAddedUpdate struct { func (x *GroupMemberAddedUpdate) Reset() { *x = GroupMemberAddedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[59] + mi := &file_backuppb_Backup_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6565,7 +6668,7 @@ func (x *GroupMemberAddedUpdate) String() string { func (*GroupMemberAddedUpdate) ProtoMessage() {} func (x *GroupMemberAddedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[59] + mi := &file_backuppb_Backup_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6578,7 +6681,7 @@ func (x *GroupMemberAddedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberAddedUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberAddedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{59} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{60} } func (x *GroupMemberAddedUpdate) GetUpdaterAci() []byte { @@ -6619,7 +6722,7 @@ type GroupSelfInvitationRevokedUpdate struct { func (x *GroupSelfInvitationRevokedUpdate) Reset() { *x = GroupSelfInvitationRevokedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[60] + mi := &file_backuppb_Backup_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6631,7 +6734,7 @@ func (x *GroupSelfInvitationRevokedUpdate) String() string { func (*GroupSelfInvitationRevokedUpdate) ProtoMessage() {} func (x *GroupSelfInvitationRevokedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[60] + mi := &file_backuppb_Backup_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6644,7 +6747,7 @@ func (x *GroupSelfInvitationRevokedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupSelfInvitationRevokedUpdate.ProtoReflect.Descriptor instead. func (*GroupSelfInvitationRevokedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{60} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{61} } func (x *GroupSelfInvitationRevokedUpdate) GetRevokerAci() []byte { @@ -6670,7 +6773,7 @@ type GroupInvitationRevokedUpdate struct { func (x *GroupInvitationRevokedUpdate) Reset() { *x = GroupInvitationRevokedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[61] + mi := &file_backuppb_Backup_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6682,7 +6785,7 @@ func (x *GroupInvitationRevokedUpdate) String() string { func (*GroupInvitationRevokedUpdate) ProtoMessage() {} func (x *GroupInvitationRevokedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[61] + mi := &file_backuppb_Backup_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6695,7 +6798,7 @@ func (x *GroupInvitationRevokedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInvitationRevokedUpdate.ProtoReflect.Descriptor instead. func (*GroupInvitationRevokedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{61} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{62} } func (x *GroupInvitationRevokedUpdate) GetUpdaterAci() []byte { @@ -6721,7 +6824,7 @@ type GroupJoinRequestUpdate struct { func (x *GroupJoinRequestUpdate) Reset() { *x = GroupJoinRequestUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[62] + mi := &file_backuppb_Backup_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6733,7 +6836,7 @@ func (x *GroupJoinRequestUpdate) String() string { func (*GroupJoinRequestUpdate) ProtoMessage() {} func (x *GroupJoinRequestUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[62] + mi := &file_backuppb_Backup_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6746,7 +6849,7 @@ func (x *GroupJoinRequestUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupJoinRequestUpdate.ProtoReflect.Descriptor instead. func (*GroupJoinRequestUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{62} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{63} } func (x *GroupJoinRequestUpdate) GetRequestorAci() []byte { @@ -6768,7 +6871,7 @@ type GroupJoinRequestApprovalUpdate struct { func (x *GroupJoinRequestApprovalUpdate) Reset() { *x = GroupJoinRequestApprovalUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[63] + mi := &file_backuppb_Backup_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6780,7 +6883,7 @@ func (x *GroupJoinRequestApprovalUpdate) String() string { func (*GroupJoinRequestApprovalUpdate) ProtoMessage() {} func (x *GroupJoinRequestApprovalUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[63] + mi := &file_backuppb_Backup_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6793,7 +6896,7 @@ func (x *GroupJoinRequestApprovalUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupJoinRequestApprovalUpdate.ProtoReflect.Descriptor instead. func (*GroupJoinRequestApprovalUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{63} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{64} } func (x *GroupJoinRequestApprovalUpdate) GetRequestorAci() []byte { @@ -6826,7 +6929,7 @@ type GroupJoinRequestCanceledUpdate struct { func (x *GroupJoinRequestCanceledUpdate) Reset() { *x = GroupJoinRequestCanceledUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[64] + mi := &file_backuppb_Backup_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6838,7 +6941,7 @@ func (x *GroupJoinRequestCanceledUpdate) String() string { func (*GroupJoinRequestCanceledUpdate) ProtoMessage() {} func (x *GroupJoinRequestCanceledUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[64] + mi := &file_backuppb_Backup_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6851,7 +6954,7 @@ func (x *GroupJoinRequestCanceledUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupJoinRequestCanceledUpdate.ProtoReflect.Descriptor instead. func (*GroupJoinRequestCanceledUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{64} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{65} } func (x *GroupJoinRequestCanceledUpdate) GetRequestorAci() []byte { @@ -6877,7 +6980,7 @@ type GroupSequenceOfRequestsAndCancelsUpdate struct { func (x *GroupSequenceOfRequestsAndCancelsUpdate) Reset() { *x = GroupSequenceOfRequestsAndCancelsUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[65] + mi := &file_backuppb_Backup_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6889,7 +6992,7 @@ func (x *GroupSequenceOfRequestsAndCancelsUpdate) String() string { func (*GroupSequenceOfRequestsAndCancelsUpdate) ProtoMessage() {} func (x *GroupSequenceOfRequestsAndCancelsUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[65] + mi := &file_backuppb_Backup_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6902,7 +7005,7 @@ func (x *GroupSequenceOfRequestsAndCancelsUpdate) ProtoReflect() protoreflect.Me // Deprecated: Use GroupSequenceOfRequestsAndCancelsUpdate.ProtoReflect.Descriptor instead. func (*GroupSequenceOfRequestsAndCancelsUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{65} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{66} } func (x *GroupSequenceOfRequestsAndCancelsUpdate) GetRequestorAci() []byte { @@ -6928,7 +7031,7 @@ type GroupInviteLinkResetUpdate struct { func (x *GroupInviteLinkResetUpdate) Reset() { *x = GroupInviteLinkResetUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[66] + mi := &file_backuppb_Backup_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6940,7 +7043,7 @@ func (x *GroupInviteLinkResetUpdate) String() string { func (*GroupInviteLinkResetUpdate) ProtoMessage() {} func (x *GroupInviteLinkResetUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[66] + mi := &file_backuppb_Backup_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6953,7 +7056,7 @@ func (x *GroupInviteLinkResetUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInviteLinkResetUpdate.ProtoReflect.Descriptor instead. func (*GroupInviteLinkResetUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{66} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{67} } func (x *GroupInviteLinkResetUpdate) GetUpdaterAci() []byte { @@ -6973,7 +7076,7 @@ type GroupInviteLinkEnabledUpdate struct { func (x *GroupInviteLinkEnabledUpdate) Reset() { *x = GroupInviteLinkEnabledUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[67] + mi := &file_backuppb_Backup_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6985,7 +7088,7 @@ func (x *GroupInviteLinkEnabledUpdate) String() string { func (*GroupInviteLinkEnabledUpdate) ProtoMessage() {} func (x *GroupInviteLinkEnabledUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[67] + mi := &file_backuppb_Backup_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6998,7 +7101,7 @@ func (x *GroupInviteLinkEnabledUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInviteLinkEnabledUpdate.ProtoReflect.Descriptor instead. func (*GroupInviteLinkEnabledUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{67} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{68} } func (x *GroupInviteLinkEnabledUpdate) GetUpdaterAci() []byte { @@ -7025,7 +7128,7 @@ type GroupInviteLinkAdminApprovalUpdate struct { func (x *GroupInviteLinkAdminApprovalUpdate) Reset() { *x = GroupInviteLinkAdminApprovalUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[68] + mi := &file_backuppb_Backup_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7037,7 +7140,7 @@ func (x *GroupInviteLinkAdminApprovalUpdate) String() string { func (*GroupInviteLinkAdminApprovalUpdate) ProtoMessage() {} func (x *GroupInviteLinkAdminApprovalUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[68] + mi := &file_backuppb_Backup_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7050,7 +7153,7 @@ func (x *GroupInviteLinkAdminApprovalUpdate) ProtoReflect() protoreflect.Message // Deprecated: Use GroupInviteLinkAdminApprovalUpdate.ProtoReflect.Descriptor instead. func (*GroupInviteLinkAdminApprovalUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{68} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{69} } func (x *GroupInviteLinkAdminApprovalUpdate) GetUpdaterAci() []byte { @@ -7076,7 +7179,7 @@ type GroupInviteLinkDisabledUpdate struct { func (x *GroupInviteLinkDisabledUpdate) Reset() { *x = GroupInviteLinkDisabledUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[69] + mi := &file_backuppb_Backup_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7088,7 +7191,7 @@ func (x *GroupInviteLinkDisabledUpdate) String() string { func (*GroupInviteLinkDisabledUpdate) ProtoMessage() {} func (x *GroupInviteLinkDisabledUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[69] + mi := &file_backuppb_Backup_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7101,7 +7204,7 @@ func (x *GroupInviteLinkDisabledUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInviteLinkDisabledUpdate.ProtoReflect.Descriptor instead. func (*GroupInviteLinkDisabledUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{69} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{70} } func (x *GroupInviteLinkDisabledUpdate) GetUpdaterAci() []byte { @@ -7120,7 +7223,7 @@ type GroupMemberJoinedByLinkUpdate struct { func (x *GroupMemberJoinedByLinkUpdate) Reset() { *x = GroupMemberJoinedByLinkUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[70] + mi := &file_backuppb_Backup_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7132,7 +7235,7 @@ func (x *GroupMemberJoinedByLinkUpdate) String() string { func (*GroupMemberJoinedByLinkUpdate) ProtoMessage() {} func (x *GroupMemberJoinedByLinkUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[70] + mi := &file_backuppb_Backup_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7145,7 +7248,7 @@ func (x *GroupMemberJoinedByLinkUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberJoinedByLinkUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberJoinedByLinkUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{70} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{71} } func (x *GroupMemberJoinedByLinkUpdate) GetNewMemberAci() []byte { @@ -7164,7 +7267,7 @@ type GroupV2MigrationUpdate struct { func (x *GroupV2MigrationUpdate) Reset() { *x = GroupV2MigrationUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[71] + mi := &file_backuppb_Backup_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7176,7 +7279,7 @@ func (x *GroupV2MigrationUpdate) String() string { func (*GroupV2MigrationUpdate) ProtoMessage() {} func (x *GroupV2MigrationUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[71] + mi := &file_backuppb_Backup_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7189,7 +7292,7 @@ func (x *GroupV2MigrationUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupV2MigrationUpdate.ProtoReflect.Descriptor instead. func (*GroupV2MigrationUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{71} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{72} } // Another user migrated gv1->gv2 but was unable to add @@ -7202,7 +7305,7 @@ type GroupV2MigrationSelfInvitedUpdate struct { func (x *GroupV2MigrationSelfInvitedUpdate) Reset() { *x = GroupV2MigrationSelfInvitedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[72] + mi := &file_backuppb_Backup_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7214,7 +7317,7 @@ func (x *GroupV2MigrationSelfInvitedUpdate) String() string { func (*GroupV2MigrationSelfInvitedUpdate) ProtoMessage() {} func (x *GroupV2MigrationSelfInvitedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[72] + mi := &file_backuppb_Backup_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7227,7 +7330,7 @@ func (x *GroupV2MigrationSelfInvitedUpdate) ProtoReflect() protoreflect.Message // Deprecated: Use GroupV2MigrationSelfInvitedUpdate.ProtoReflect.Descriptor instead. func (*GroupV2MigrationSelfInvitedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{72} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{73} } // The local user migrated gv1->gv2 but was unable to @@ -7242,7 +7345,7 @@ type GroupV2MigrationInvitedMembersUpdate struct { func (x *GroupV2MigrationInvitedMembersUpdate) Reset() { *x = GroupV2MigrationInvitedMembersUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[73] + mi := &file_backuppb_Backup_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7254,7 +7357,7 @@ func (x *GroupV2MigrationInvitedMembersUpdate) String() string { func (*GroupV2MigrationInvitedMembersUpdate) ProtoMessage() {} func (x *GroupV2MigrationInvitedMembersUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[73] + mi := &file_backuppb_Backup_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7267,7 +7370,7 @@ func (x *GroupV2MigrationInvitedMembersUpdate) ProtoReflect() protoreflect.Messa // Deprecated: Use GroupV2MigrationInvitedMembersUpdate.ProtoReflect.Descriptor instead. func (*GroupV2MigrationInvitedMembersUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{73} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{74} } func (x *GroupV2MigrationInvitedMembersUpdate) GetInvitedMembersCount() uint32 { @@ -7289,7 +7392,7 @@ type GroupV2MigrationDroppedMembersUpdate struct { func (x *GroupV2MigrationDroppedMembersUpdate) Reset() { *x = GroupV2MigrationDroppedMembersUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[74] + mi := &file_backuppb_Backup_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7301,7 +7404,7 @@ func (x *GroupV2MigrationDroppedMembersUpdate) String() string { func (*GroupV2MigrationDroppedMembersUpdate) ProtoMessage() {} func (x *GroupV2MigrationDroppedMembersUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[74] + mi := &file_backuppb_Backup_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7314,7 +7417,7 @@ func (x *GroupV2MigrationDroppedMembersUpdate) ProtoReflect() protoreflect.Messa // Deprecated: Use GroupV2MigrationDroppedMembersUpdate.ProtoReflect.Descriptor instead. func (*GroupV2MigrationDroppedMembersUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{74} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{75} } func (x *GroupV2MigrationDroppedMembersUpdate) GetDroppedMembersCount() uint32 { @@ -7335,7 +7438,7 @@ type GroupExpirationTimerUpdate struct { func (x *GroupExpirationTimerUpdate) Reset() { *x = GroupExpirationTimerUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[75] + mi := &file_backuppb_Backup_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7347,7 +7450,7 @@ func (x *GroupExpirationTimerUpdate) String() string { func (*GroupExpirationTimerUpdate) ProtoMessage() {} func (x *GroupExpirationTimerUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[75] + mi := &file_backuppb_Backup_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7360,7 +7463,7 @@ func (x *GroupExpirationTimerUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupExpirationTimerUpdate.ProtoReflect.Descriptor instead. func (*GroupExpirationTimerUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{75} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{76} } func (x *GroupExpirationTimerUpdate) GetExpiresInMs() uint64 { @@ -7377,6 +7480,58 @@ func (x *GroupExpirationTimerUpdate) GetUpdaterAci() []byte { return nil } +type PollTerminateUpdate struct { + state protoimpl.MessageState `protogen:"open.v1"` + TargetSentTimestamp uint64 `protobuf:"varint,1,opt,name=targetSentTimestamp,proto3" json:"targetSentTimestamp,omitempty"` + Question string `protobuf:"bytes,2,opt,name=question,proto3" json:"question,omitempty"` // Between 1-100 characters + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PollTerminateUpdate) Reset() { + *x = PollTerminateUpdate{} + mi := &file_backuppb_Backup_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PollTerminateUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PollTerminateUpdate) ProtoMessage() {} + +func (x *PollTerminateUpdate) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[77] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PollTerminateUpdate.ProtoReflect.Descriptor instead. +func (*PollTerminateUpdate) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{77} +} + +func (x *PollTerminateUpdate) GetTargetSentTimestamp() uint64 { + if x != nil { + return x.TargetSentTimestamp + } + return 0 +} + +func (x *PollTerminateUpdate) GetQuestion() string { + if x != nil { + return x.Question + } + return "" +} + type StickerPack struct { state protoimpl.MessageState `protogen:"open.v1"` PackId []byte `protobuf:"bytes,1,opt,name=packId,proto3" json:"packId,omitempty"` @@ -7387,7 +7542,7 @@ type StickerPack struct { func (x *StickerPack) Reset() { *x = StickerPack{} - mi := &file_backuppb_Backup_proto_msgTypes[76] + mi := &file_backuppb_Backup_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7399,7 +7554,7 @@ func (x *StickerPack) String() string { func (*StickerPack) ProtoMessage() {} func (x *StickerPack) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[76] + mi := &file_backuppb_Backup_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7412,7 +7567,7 @@ func (x *StickerPack) ProtoReflect() protoreflect.Message { // Deprecated: Use StickerPack.ProtoReflect.Descriptor instead. func (*StickerPack) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{76} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{78} } func (x *StickerPack) GetPackId() []byte { @@ -7453,7 +7608,7 @@ type ChatStyle struct { func (x *ChatStyle) Reset() { *x = ChatStyle{} - mi := &file_backuppb_Backup_proto_msgTypes[77] + mi := &file_backuppb_Backup_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7465,7 +7620,7 @@ func (x *ChatStyle) String() string { func (*ChatStyle) ProtoMessage() {} func (x *ChatStyle) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[77] + mi := &file_backuppb_Backup_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7478,7 +7633,7 @@ func (x *ChatStyle) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle.ProtoReflect.Descriptor instead. func (*ChatStyle) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{77} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{79} } func (x *ChatStyle) GetWallpaper() isChatStyle_Wallpaper { @@ -7610,7 +7765,7 @@ type NotificationProfile struct { func (x *NotificationProfile) Reset() { *x = NotificationProfile{} - mi := &file_backuppb_Backup_proto_msgTypes[78] + mi := &file_backuppb_Backup_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7622,7 +7777,7 @@ func (x *NotificationProfile) String() string { func (*NotificationProfile) ProtoMessage() {} func (x *NotificationProfile) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[78] + mi := &file_backuppb_Backup_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7635,7 +7790,7 @@ func (x *NotificationProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use NotificationProfile.ProtoReflect.Descriptor instead. func (*NotificationProfile) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{78} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80} } func (x *NotificationProfile) GetName() string { @@ -7741,7 +7896,7 @@ type ChatFolder struct { func (x *ChatFolder) Reset() { *x = ChatFolder{} - mi := &file_backuppb_Backup_proto_msgTypes[79] + mi := &file_backuppb_Backup_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7753,7 +7908,7 @@ func (x *ChatFolder) String() string { func (*ChatFolder) ProtoMessage() {} func (x *ChatFolder) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[79] + mi := &file_backuppb_Backup_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7766,7 +7921,7 @@ func (x *ChatFolder) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatFolder.ProtoReflect.Descriptor instead. func (*ChatFolder) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{81} } func (x *ChatFolder) GetName() string { @@ -7843,7 +7998,7 @@ type AccountData_UsernameLink struct { func (x *AccountData_UsernameLink) Reset() { *x = AccountData_UsernameLink{} - mi := &file_backuppb_Backup_proto_msgTypes[80] + mi := &file_backuppb_Backup_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7855,7 +8010,7 @@ func (x *AccountData_UsernameLink) String() string { func (*AccountData_UsernameLink) ProtoMessage() {} func (x *AccountData_UsernameLink) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[80] + mi := &file_backuppb_Backup_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7922,7 +8077,7 @@ type AccountData_AccountSettings struct { func (x *AccountData_AccountSettings) Reset() { *x = AccountData_AccountSettings{} - mi := &file_backuppb_Backup_proto_msgTypes[81] + mi := &file_backuppb_Backup_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7934,7 +8089,7 @@ func (x *AccountData_AccountSettings) String() string { func (*AccountData_AccountSettings) ProtoMessage() {} func (x *AccountData_AccountSettings) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[81] + mi := &file_backuppb_Backup_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8108,7 +8263,7 @@ type AccountData_SubscriberData struct { func (x *AccountData_SubscriberData) Reset() { *x = AccountData_SubscriberData{} - mi := &file_backuppb_Backup_proto_msgTypes[82] + mi := &file_backuppb_Backup_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8120,7 +8275,7 @@ func (x *AccountData_SubscriberData) String() string { func (*AccountData_SubscriberData) ProtoMessage() {} func (x *AccountData_SubscriberData) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[82] + mi := &file_backuppb_Backup_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8173,7 +8328,7 @@ type AccountData_IAPSubscriberData struct { func (x *AccountData_IAPSubscriberData) Reset() { *x = AccountData_IAPSubscriberData{} - mi := &file_backuppb_Backup_proto_msgTypes[83] + mi := &file_backuppb_Backup_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8185,7 +8340,7 @@ func (x *AccountData_IAPSubscriberData) String() string { func (*AccountData_IAPSubscriberData) ProtoMessage() {} func (x *AccountData_IAPSubscriberData) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[83] + mi := &file_backuppb_Backup_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8261,7 +8416,7 @@ type Contact_Registered struct { func (x *Contact_Registered) Reset() { *x = Contact_Registered{} - mi := &file_backuppb_Backup_proto_msgTypes[84] + mi := &file_backuppb_Backup_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8273,7 +8428,7 @@ func (x *Contact_Registered) String() string { func (*Contact_Registered) ProtoMessage() {} func (x *Contact_Registered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[84] + mi := &file_backuppb_Backup_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8298,7 +8453,7 @@ type Contact_NotRegistered struct { func (x *Contact_NotRegistered) Reset() { *x = Contact_NotRegistered{} - mi := &file_backuppb_Backup_proto_msgTypes[85] + mi := &file_backuppb_Backup_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8310,7 +8465,7 @@ func (x *Contact_NotRegistered) String() string { func (*Contact_NotRegistered) ProtoMessage() {} func (x *Contact_NotRegistered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[85] + mi := &file_backuppb_Backup_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8343,7 +8498,7 @@ type Contact_Name struct { func (x *Contact_Name) Reset() { *x = Contact_Name{} - mi := &file_backuppb_Backup_proto_msgTypes[86] + mi := &file_backuppb_Backup_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8355,7 +8510,7 @@ func (x *Contact_Name) String() string { func (*Contact_Name) ProtoMessage() {} func (x *Contact_Name) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[86] + mi := &file_backuppb_Backup_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8410,7 +8565,7 @@ type Group_GroupSnapshot struct { func (x *Group_GroupSnapshot) Reset() { *x = Group_GroupSnapshot{} - mi := &file_backuppb_Backup_proto_msgTypes[87] + mi := &file_backuppb_Backup_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8422,7 +8577,7 @@ func (x *Group_GroupSnapshot) String() string { func (*Group_GroupSnapshot) ProtoMessage() {} func (x *Group_GroupSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[87] + mi := &file_backuppb_Backup_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8539,7 +8694,7 @@ type Group_GroupAttributeBlob struct { func (x *Group_GroupAttributeBlob) Reset() { *x = Group_GroupAttributeBlob{} - mi := &file_backuppb_Backup_proto_msgTypes[88] + mi := &file_backuppb_Backup_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8551,7 +8706,7 @@ func (x *Group_GroupAttributeBlob) String() string { func (*Group_GroupAttributeBlob) ProtoMessage() {} func (x *Group_GroupAttributeBlob) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[88] + mi := &file_backuppb_Backup_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8649,7 +8804,7 @@ type Group_Member struct { func (x *Group_Member) Reset() { *x = Group_Member{} - mi := &file_backuppb_Backup_proto_msgTypes[89] + mi := &file_backuppb_Backup_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8661,7 +8816,7 @@ func (x *Group_Member) String() string { func (*Group_Member) ProtoMessage() {} func (x *Group_Member) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[89] + mi := &file_backuppb_Backup_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8709,7 +8864,7 @@ type Group_MemberPendingProfileKey struct { func (x *Group_MemberPendingProfileKey) Reset() { *x = Group_MemberPendingProfileKey{} - mi := &file_backuppb_Backup_proto_msgTypes[90] + mi := &file_backuppb_Backup_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8721,7 +8876,7 @@ func (x *Group_MemberPendingProfileKey) String() string { func (*Group_MemberPendingProfileKey) ProtoMessage() {} func (x *Group_MemberPendingProfileKey) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[90] + mi := &file_backuppb_Backup_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8768,7 +8923,7 @@ type Group_MemberPendingAdminApproval struct { func (x *Group_MemberPendingAdminApproval) Reset() { *x = Group_MemberPendingAdminApproval{} - mi := &file_backuppb_Backup_proto_msgTypes[91] + mi := &file_backuppb_Backup_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8780,7 +8935,7 @@ func (x *Group_MemberPendingAdminApproval) String() string { func (*Group_MemberPendingAdminApproval) ProtoMessage() {} func (x *Group_MemberPendingAdminApproval) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[91] + mi := &file_backuppb_Backup_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8820,7 +8975,7 @@ type Group_MemberBanned struct { func (x *Group_MemberBanned) Reset() { *x = Group_MemberBanned{} - mi := &file_backuppb_Backup_proto_msgTypes[92] + mi := &file_backuppb_Backup_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8832,7 +8987,7 @@ func (x *Group_MemberBanned) String() string { func (*Group_MemberBanned) ProtoMessage() {} func (x *Group_MemberBanned) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[92] + mi := &file_backuppb_Backup_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8873,7 +9028,7 @@ type Group_AccessControl struct { func (x *Group_AccessControl) Reset() { *x = Group_AccessControl{} - mi := &file_backuppb_Backup_proto_msgTypes[93] + mi := &file_backuppb_Backup_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8885,7 +9040,7 @@ func (x *Group_AccessControl) String() string { func (*Group_AccessControl) ProtoMessage() {} func (x *Group_AccessControl) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[93] + mi := &file_backuppb_Backup_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8934,7 +9089,7 @@ type ChatItem_IncomingMessageDetails struct { func (x *ChatItem_IncomingMessageDetails) Reset() { *x = ChatItem_IncomingMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[94] + mi := &file_backuppb_Backup_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8946,7 +9101,7 @@ func (x *ChatItem_IncomingMessageDetails) String() string { func (*ChatItem_IncomingMessageDetails) ProtoMessage() {} func (x *ChatItem_IncomingMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[94] + mi := &file_backuppb_Backup_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9000,7 +9155,7 @@ type ChatItem_OutgoingMessageDetails struct { func (x *ChatItem_OutgoingMessageDetails) Reset() { *x = ChatItem_OutgoingMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[95] + mi := &file_backuppb_Backup_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9012,7 +9167,7 @@ func (x *ChatItem_OutgoingMessageDetails) String() string { func (*ChatItem_OutgoingMessageDetails) ProtoMessage() {} func (x *ChatItem_OutgoingMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[95] + mi := &file_backuppb_Backup_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9050,7 +9205,7 @@ type ChatItem_DirectionlessMessageDetails struct { func (x *ChatItem_DirectionlessMessageDetails) Reset() { *x = ChatItem_DirectionlessMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[96] + mi := &file_backuppb_Backup_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9062,7 +9217,7 @@ func (x *ChatItem_DirectionlessMessageDetails) String() string { func (*ChatItem_DirectionlessMessageDetails) ProtoMessage() {} func (x *ChatItem_DirectionlessMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[96] + mi := &file_backuppb_Backup_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9086,7 +9241,7 @@ type SendStatus_Pending struct { func (x *SendStatus_Pending) Reset() { *x = SendStatus_Pending{} - mi := &file_backuppb_Backup_proto_msgTypes[97] + mi := &file_backuppb_Backup_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9098,7 +9253,7 @@ func (x *SendStatus_Pending) String() string { func (*SendStatus_Pending) ProtoMessage() {} func (x *SendStatus_Pending) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[97] + mi := &file_backuppb_Backup_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9123,7 +9278,7 @@ type SendStatus_Sent struct { func (x *SendStatus_Sent) Reset() { *x = SendStatus_Sent{} - mi := &file_backuppb_Backup_proto_msgTypes[98] + mi := &file_backuppb_Backup_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9135,7 +9290,7 @@ func (x *SendStatus_Sent) String() string { func (*SendStatus_Sent) ProtoMessage() {} func (x *SendStatus_Sent) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[98] + mi := &file_backuppb_Backup_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9167,7 +9322,7 @@ type SendStatus_Delivered struct { func (x *SendStatus_Delivered) Reset() { *x = SendStatus_Delivered{} - mi := &file_backuppb_Backup_proto_msgTypes[99] + mi := &file_backuppb_Backup_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9179,7 +9334,7 @@ func (x *SendStatus_Delivered) String() string { func (*SendStatus_Delivered) ProtoMessage() {} func (x *SendStatus_Delivered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[99] + mi := &file_backuppb_Backup_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9211,7 +9366,7 @@ type SendStatus_Read struct { func (x *SendStatus_Read) Reset() { *x = SendStatus_Read{} - mi := &file_backuppb_Backup_proto_msgTypes[100] + mi := &file_backuppb_Backup_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9223,7 +9378,7 @@ func (x *SendStatus_Read) String() string { func (*SendStatus_Read) ProtoMessage() {} func (x *SendStatus_Read) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[100] + mi := &file_backuppb_Backup_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9255,7 +9410,7 @@ type SendStatus_Viewed struct { func (x *SendStatus_Viewed) Reset() { *x = SendStatus_Viewed{} - mi := &file_backuppb_Backup_proto_msgTypes[101] + mi := &file_backuppb_Backup_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9267,7 +9422,7 @@ func (x *SendStatus_Viewed) String() string { func (*SendStatus_Viewed) ProtoMessage() {} func (x *SendStatus_Viewed) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[101] + mi := &file_backuppb_Backup_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9299,7 +9454,7 @@ type SendStatus_Skipped struct { func (x *SendStatus_Skipped) Reset() { *x = SendStatus_Skipped{} - mi := &file_backuppb_Backup_proto_msgTypes[102] + mi := &file_backuppb_Backup_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9311,7 +9466,7 @@ func (x *SendStatus_Skipped) String() string { func (*SendStatus_Skipped) ProtoMessage() {} func (x *SendStatus_Skipped) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[102] + mi := &file_backuppb_Backup_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9336,7 +9491,7 @@ type SendStatus_Failed struct { func (x *SendStatus_Failed) Reset() { *x = SendStatus_Failed{} - mi := &file_backuppb_Backup_proto_msgTypes[103] + mi := &file_backuppb_Backup_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9348,7 +9503,7 @@ func (x *SendStatus_Failed) String() string { func (*SendStatus_Failed) ProtoMessage() {} func (x *SendStatus_Failed) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[103] + mi := &file_backuppb_Backup_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9381,7 +9536,7 @@ type DirectStoryReplyMessage_TextReply struct { func (x *DirectStoryReplyMessage_TextReply) Reset() { *x = DirectStoryReplyMessage_TextReply{} - mi := &file_backuppb_Backup_proto_msgTypes[104] + mi := &file_backuppb_Backup_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9393,7 +9548,7 @@ func (x *DirectStoryReplyMessage_TextReply) String() string { func (*DirectStoryReplyMessage_TextReply) ProtoMessage() {} func (x *DirectStoryReplyMessage_TextReply) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[104] + mi := &file_backuppb_Backup_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9438,7 +9593,7 @@ type PaymentNotification_TransactionDetails struct { func (x *PaymentNotification_TransactionDetails) Reset() { *x = PaymentNotification_TransactionDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[105] + mi := &file_backuppb_Backup_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9450,7 +9605,7 @@ func (x *PaymentNotification_TransactionDetails) String() string { func (*PaymentNotification_TransactionDetails) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[105] + mi := &file_backuppb_Backup_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9519,7 +9674,7 @@ type PaymentNotification_TransactionDetails_MobileCoinTxoIdentification struct { func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) Reset() { *x = PaymentNotification_TransactionDetails_MobileCoinTxoIdentification{} - mi := &file_backuppb_Backup_proto_msgTypes[106] + mi := &file_backuppb_Backup_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9531,7 +9686,7 @@ func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) Str func (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[106] + mi := &file_backuppb_Backup_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9570,7 +9725,7 @@ type PaymentNotification_TransactionDetails_FailedTransaction struct { func (x *PaymentNotification_TransactionDetails_FailedTransaction) Reset() { *x = PaymentNotification_TransactionDetails_FailedTransaction{} - mi := &file_backuppb_Backup_proto_msgTypes[107] + mi := &file_backuppb_Backup_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9582,7 +9737,7 @@ func (x *PaymentNotification_TransactionDetails_FailedTransaction) String() stri func (*PaymentNotification_TransactionDetails_FailedTransaction) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_FailedTransaction) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[107] + mi := &file_backuppb_Backup_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9623,7 +9778,7 @@ type PaymentNotification_TransactionDetails_Transaction struct { func (x *PaymentNotification_TransactionDetails_Transaction) Reset() { *x = PaymentNotification_TransactionDetails_Transaction{} - mi := &file_backuppb_Backup_proto_msgTypes[108] + mi := &file_backuppb_Backup_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9635,7 +9790,7 @@ func (x *PaymentNotification_TransactionDetails_Transaction) String() string { func (*PaymentNotification_TransactionDetails_Transaction) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_Transaction) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[108] + mi := &file_backuppb_Backup_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9714,7 +9869,7 @@ type ContactAttachment_Name struct { func (x *ContactAttachment_Name) Reset() { *x = ContactAttachment_Name{} - mi := &file_backuppb_Backup_proto_msgTypes[109] + mi := &file_backuppb_Backup_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9726,7 +9881,7 @@ func (x *ContactAttachment_Name) String() string { func (*ContactAttachment_Name) ProtoMessage() {} func (x *ContactAttachment_Name) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[109] + mi := &file_backuppb_Backup_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9795,7 +9950,7 @@ type ContactAttachment_Phone struct { func (x *ContactAttachment_Phone) Reset() { *x = ContactAttachment_Phone{} - mi := &file_backuppb_Backup_proto_msgTypes[110] + mi := &file_backuppb_Backup_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9807,7 +9962,7 @@ func (x *ContactAttachment_Phone) String() string { func (*ContactAttachment_Phone) ProtoMessage() {} func (x *ContactAttachment_Phone) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[110] + mi := &file_backuppb_Backup_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9855,7 +10010,7 @@ type ContactAttachment_Email struct { func (x *ContactAttachment_Email) Reset() { *x = ContactAttachment_Email{} - mi := &file_backuppb_Backup_proto_msgTypes[111] + mi := &file_backuppb_Backup_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9867,7 +10022,7 @@ func (x *ContactAttachment_Email) String() string { func (*ContactAttachment_Email) ProtoMessage() {} func (x *ContactAttachment_Email) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[111] + mi := &file_backuppb_Backup_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9921,7 +10076,7 @@ type ContactAttachment_PostalAddress struct { func (x *ContactAttachment_PostalAddress) Reset() { *x = ContactAttachment_PostalAddress{} - mi := &file_backuppb_Backup_proto_msgTypes[112] + mi := &file_backuppb_Backup_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9933,7 +10088,7 @@ func (x *ContactAttachment_PostalAddress) String() string { func (*ContactAttachment_PostalAddress) ProtoMessage() {} func (x *ContactAttachment_PostalAddress) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[112] + mi := &file_backuppb_Backup_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10048,7 +10203,7 @@ type FilePointer_LocatorInfo struct { func (x *FilePointer_LocatorInfo) Reset() { *x = FilePointer_LocatorInfo{} - mi := &file_backuppb_Backup_proto_msgTypes[113] + mi := &file_backuppb_Backup_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10060,7 +10215,7 @@ func (x *FilePointer_LocatorInfo) String() string { func (*FilePointer_LocatorInfo) ProtoMessage() {} func (x *FilePointer_LocatorInfo) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[113] + mi := &file_backuppb_Backup_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10180,7 +10335,7 @@ type Quote_QuotedAttachment struct { func (x *Quote_QuotedAttachment) Reset() { *x = Quote_QuotedAttachment{} - mi := &file_backuppb_Backup_proto_msgTypes[114] + mi := &file_backuppb_Backup_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10192,7 +10347,7 @@ func (x *Quote_QuotedAttachment) String() string { func (*Quote_QuotedAttachment) ProtoMessage() {} func (x *Quote_QuotedAttachment) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[114] + mi := &file_backuppb_Backup_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10229,6 +10384,110 @@ func (x *Quote_QuotedAttachment) GetThumbnail() *MessageAttachment { return nil } +type Poll_PollOption struct { + state protoimpl.MessageState `protogen:"open.v1"` + Option string `protobuf:"bytes,1,opt,name=option,proto3" json:"option,omitempty"` // Between 1-100 characters + Votes []*Poll_PollOption_PollVote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Poll_PollOption) Reset() { + *x = Poll_PollOption{} + mi := &file_backuppb_Backup_proto_msgTypes[117] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Poll_PollOption) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Poll_PollOption) ProtoMessage() {} + +func (x *Poll_PollOption) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[117] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Poll_PollOption.ProtoReflect.Descriptor instead. +func (*Poll_PollOption) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{32, 0} +} + +func (x *Poll_PollOption) GetOption() string { + if x != nil { + return x.Option + } + return "" +} + +func (x *Poll_PollOption) GetVotes() []*Poll_PollOption_PollVote { + if x != nil { + return x.Votes + } + return nil +} + +type Poll_PollOption_PollVote struct { + state protoimpl.MessageState `protogen:"open.v1"` + VoterId uint64 `protobuf:"varint,1,opt,name=voterId,proto3" json:"voterId,omitempty"` // A direct reference to Recipient proto id. Must be self or contact. + VoteCount uint32 `protobuf:"varint,2,opt,name=voteCount,proto3" json:"voteCount,omitempty"` // Tracks how many times you voted. + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Poll_PollOption_PollVote) Reset() { + *x = Poll_PollOption_PollVote{} + mi := &file_backuppb_Backup_proto_msgTypes[118] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Poll_PollOption_PollVote) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Poll_PollOption_PollVote) ProtoMessage() {} + +func (x *Poll_PollOption_PollVote) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[118] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Poll_PollOption_PollVote.ProtoReflect.Descriptor instead. +func (*Poll_PollOption_PollVote) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{32, 0, 0} +} + +func (x *Poll_PollOption_PollVote) GetVoterId() uint64 { + if x != nil { + return x.VoterId + } + return 0 +} + +func (x *Poll_PollOption_PollVote) GetVoteCount() uint32 { + if x != nil { + return x.VoteCount + } + return 0 +} + type GroupChangeChatUpdate_Update struct { state protoimpl.MessageState `protogen:"open.v1"` // If unset, importers should consider it to be a GenericGroupUpdate with unset updaterAci @@ -10276,7 +10535,7 @@ type GroupChangeChatUpdate_Update struct { func (x *GroupChangeChatUpdate_Update) Reset() { *x = GroupChangeChatUpdate_Update{} - mi := &file_backuppb_Backup_proto_msgTypes[115] + mi := &file_backuppb_Backup_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10288,7 +10547,7 @@ func (x *GroupChangeChatUpdate_Update) String() string { func (*GroupChangeChatUpdate_Update) ProtoMessage() {} func (x *GroupChangeChatUpdate_Update) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[115] + mi := &file_backuppb_Backup_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10301,7 +10560,7 @@ func (x *GroupChangeChatUpdate_Update) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupChangeChatUpdate_Update.ProtoReflect.Descriptor instead. func (*GroupChangeChatUpdate_Update) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{41, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{42, 0} } func (x *GroupChangeChatUpdate_Update) GetUpdate() isGroupChangeChatUpdate_Update_Update { @@ -10862,7 +11121,7 @@ type GroupInvitationRevokedUpdate_Invitee struct { func (x *GroupInvitationRevokedUpdate_Invitee) Reset() { *x = GroupInvitationRevokedUpdate_Invitee{} - mi := &file_backuppb_Backup_proto_msgTypes[116] + mi := &file_backuppb_Backup_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10874,7 +11133,7 @@ func (x *GroupInvitationRevokedUpdate_Invitee) String() string { func (*GroupInvitationRevokedUpdate_Invitee) ProtoMessage() {} func (x *GroupInvitationRevokedUpdate_Invitee) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[116] + mi := &file_backuppb_Backup_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10887,7 +11146,7 @@ func (x *GroupInvitationRevokedUpdate_Invitee) ProtoReflect() protoreflect.Messa // Deprecated: Use GroupInvitationRevokedUpdate_Invitee.ProtoReflect.Descriptor instead. func (*GroupInvitationRevokedUpdate_Invitee) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{61, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{62, 0} } func (x *GroupInvitationRevokedUpdate_Invitee) GetInviterAci() []byte { @@ -10922,7 +11181,7 @@ type ChatStyle_Gradient struct { func (x *ChatStyle_Gradient) Reset() { *x = ChatStyle_Gradient{} - mi := &file_backuppb_Backup_proto_msgTypes[117] + mi := &file_backuppb_Backup_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10934,7 +11193,7 @@ func (x *ChatStyle_Gradient) String() string { func (*ChatStyle_Gradient) ProtoMessage() {} func (x *ChatStyle_Gradient) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[117] + mi := &file_backuppb_Backup_proto_msgTypes[121] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10947,7 +11206,7 @@ func (x *ChatStyle_Gradient) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_Gradient.ProtoReflect.Descriptor instead. func (*ChatStyle_Gradient) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{77, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 0} } func (x *ChatStyle_Gradient) GetAngle() uint32 { @@ -10987,7 +11246,7 @@ type ChatStyle_CustomChatColor struct { func (x *ChatStyle_CustomChatColor) Reset() { *x = ChatStyle_CustomChatColor{} - mi := &file_backuppb_Backup_proto_msgTypes[118] + mi := &file_backuppb_Backup_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10999,7 +11258,7 @@ func (x *ChatStyle_CustomChatColor) String() string { func (*ChatStyle_CustomChatColor) ProtoMessage() {} func (x *ChatStyle_CustomChatColor) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[118] + mi := &file_backuppb_Backup_proto_msgTypes[122] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11012,7 +11271,7 @@ func (x *ChatStyle_CustomChatColor) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_CustomChatColor.ProtoReflect.Descriptor instead. func (*ChatStyle_CustomChatColor) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{77, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 1} } func (x *ChatStyle_CustomChatColor) GetId() uint64 { @@ -11071,7 +11330,7 @@ type ChatStyle_AutomaticBubbleColor struct { func (x *ChatStyle_AutomaticBubbleColor) Reset() { *x = ChatStyle_AutomaticBubbleColor{} - mi := &file_backuppb_Backup_proto_msgTypes[119] + mi := &file_backuppb_Backup_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11083,7 +11342,7 @@ func (x *ChatStyle_AutomaticBubbleColor) String() string { func (*ChatStyle_AutomaticBubbleColor) ProtoMessage() {} func (x *ChatStyle_AutomaticBubbleColor) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[119] + mi := &file_backuppb_Backup_proto_msgTypes[123] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11096,7 +11355,7 @@ func (x *ChatStyle_AutomaticBubbleColor) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_AutomaticBubbleColor.ProtoReflect.Descriptor instead. func (*ChatStyle_AutomaticBubbleColor) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{77, 2} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 2} } var File_backuppb_Backup_proto protoreflect.FileDescriptor @@ -11385,7 +11644,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\tONLY_WITH\x10\x01\x12\x0e\n" + "\n" + "ALL_EXCEPT\x10\x02\x12\a\n" + - "\x03ALL\x10\x03\"\xc8\f\n" + + "\x03ALL\x10\x03\"\xf3\f\n" + "\bChatItem\x12\x16\n" + "\x06chatId\x18\x01 \x01(\x04R\x06chatId\x12\x1a\n" + "\bauthorId\x18\x02 \x01(\x04R\bauthorId\x12\x1a\n" + @@ -11406,7 +11665,8 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x13paymentNotification\x18\x10 \x01(\v2\".signal.backup.PaymentNotificationH\x01R\x13paymentNotification\x128\n" + "\tgiftBadge\x18\x11 \x01(\v2\x18.signal.backup.GiftBadgeH\x01R\tgiftBadge\x12J\n" + "\x0fviewOnceMessage\x18\x12 \x01(\v2\x1e.signal.backup.ViewOnceMessageH\x01R\x0fviewOnceMessage\x12b\n" + - "\x17directStoryReplyMessage\x18\x13 \x01(\v2&.signal.backup.DirectStoryReplyMessageH\x01R\x17directStoryReplyMessage\x1a\xb4\x01\n" + + "\x17directStoryReplyMessage\x18\x13 \x01(\v2&.signal.backup.DirectStoryReplyMessageH\x01R\x17directStoryReplyMessage\x12)\n" + + "\x04poll\x18\x14 \x01(\v2\x13.signal.backup.PollH\x01R\x04poll\x1a\xb4\x01\n" + "\x16IncomingMessageDetails\x12\"\n" + "\fdateReceived\x18\x01 \x01(\x04R\fdateReceived\x12+\n" + "\x0edateServerSent\x18\x02 \x01(\x04H\x00R\x0edateServerSent\x88\x01\x01\x12\x12\n" + @@ -11669,7 +11929,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\a_heightB\n" + "\n" + "\b_captionB\v\n" + - "\t_blurHashJ\x04\b\x01\x10\x02J\x04\b\x02\x10\x03J\x04\b\x03\x10\x04J\x04\b\f\x10\r\"\xae\x04\n" + + "\t_blurHashJ\x04\b\x01\x10\x02J\x04\b\x02\x10\x03J\x04\b\x03\x10\x04J\x04\b\f\x10\r\"\xb8\x04\n" + "\x05Quote\x125\n" + "\x13targetSentTimestamp\x18\x01 \x01(\x04H\x00R\x13targetSentTimestamp\x88\x01\x01\x12\x1a\n" + "\bauthorId\x18\x02 \x01(\x04R\bauthorId\x12,\n" + @@ -11683,14 +11943,15 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\f_contentTypeB\v\n" + "\t_fileNameB\f\n" + "\n" + - "_thumbnail\">\n" + + "_thumbnail\"H\n" + "\x04Type\x12\v\n" + "\aUNKNOWN\x10\x00\x12\n" + "\n" + "\x06NORMAL\x10\x01\x12\x0e\n" + "\n" + "GIFT_BADGE\x10\x02\x12\r\n" + - "\tVIEW_ONCE\x10\x03B\x16\n" + + "\tVIEW_ONCE\x10\x03\x12\b\n" + + "\x04POLL\x10\x04B\x16\n" + "\x14_targetSentTimestampB\a\n" + "\x05_text\"\xfe\x01\n" + "\tBodyRange\x12\x14\n" + @@ -11713,7 +11974,19 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x05emoji\x18\x01 \x01(\tR\x05emoji\x12\x1a\n" + "\bauthorId\x18\x02 \x01(\x04R\bauthorId\x12$\n" + "\rsentTimestamp\x18\x03 \x01(\x04R\rsentTimestamp\x12\x1c\n" + - "\tsortOrder\x18\x04 \x01(\x04R\tsortOrder\"\xe8\x05\n" + + "\tsortOrder\x18\x04 \x01(\x04R\tsortOrder\"\xc8\x02\n" + + "\x04Poll\x12\x1a\n" + + "\bquestion\x18\x01 \x01(\tR\bquestion\x12$\n" + + "\rallowMultiple\x18\x02 \x01(\bR\rallowMultiple\x128\n" + + "\aoptions\x18\x03 \x03(\v2\x1e.signal.backup.Poll.PollOptionR\aoptions\x12\x1a\n" + + "\bhasEnded\x18\x04 \x01(\bR\bhasEnded\x1a\xa7\x01\n" + + "\n" + + "PollOption\x12\x16\n" + + "\x06option\x18\x01 \x01(\tR\x06option\x12=\n" + + "\x05votes\x18\x02 \x03(\v2'.signal.backup.Poll.PollOption.PollVoteR\x05votes\x1aB\n" + + "\bPollVote\x12\x18\n" + + "\avoterId\x18\x01 \x01(\x04R\avoterId\x12\x1c\n" + + "\tvoteCount\x18\x02 \x01(\rR\tvoteCount\"\xb4\x06\n" + "\x11ChatUpdateMessage\x12E\n" + "\fsimpleUpdate\x18\x01 \x01(\v2\x1f.signal.backup.SimpleChatUpdateH\x00R\fsimpleUpdate\x12H\n" + "\vgroupChange\x18\x02 \x01(\v2$.signal.backup.GroupChangeChatUpdateH\x00R\vgroupChange\x12`\n" + @@ -11723,7 +11996,9 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x11sessionSwitchover\x18\x06 \x01(\v2*.signal.backup.SessionSwitchoverChatUpdateH\x00R\x11sessionSwitchover\x12G\n" + "\x0eindividualCall\x18\a \x01(\v2\x1d.signal.backup.IndividualCallH\x00R\x0eindividualCall\x128\n" + "\tgroupCall\x18\b \x01(\v2\x18.signal.backup.GroupCallH\x00R\tgroupCall\x12]\n" + - "\x14learnedProfileChange\x18\t \x01(\v2'.signal.backup.LearnedProfileChatUpdateH\x00R\x14learnedProfileChangeB\b\n" + + "\x14learnedProfileChange\x18\t \x01(\v2'.signal.backup.LearnedProfileChatUpdateH\x00R\x14learnedProfileChange\x12J\n" + + "\rpollTerminate\x18\n" + + " \x01(\v2\".signal.backup.PollTerminateUpdateH\x00R\rpollTerminateB\b\n" + "\x06update\"\x9d\x04\n" + "\x0eIndividualCall\x12\x1b\n" + "\x06callId\x18\x01 \x01(\x04H\x00R\x06callId\x88\x01\x01\x126\n" + @@ -12028,7 +12303,10 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\n" + "updaterAci\x18\x02 \x01(\fH\x00R\n" + "updaterAci\x88\x01\x01B\r\n" + - "\v_updaterAci\"?\n" + + "\v_updaterAci\"c\n" + + "\x13PollTerminateUpdate\x120\n" + + "\x13targetSentTimestamp\x18\x01 \x01(\x04R\x13targetSentTimestamp\x12\x1a\n" + + "\bquestion\x18\x02 \x01(\tR\bquestion\"?\n" + "\vStickerPack\x12\x16\n" + "\x06packId\x18\x01 \x01(\fR\x06packId\x12\x18\n" + "\apackKey\x18\x02 \x01(\fR\apackKey\"\x80\r\n" + @@ -12188,7 +12466,7 @@ func file_backuppb_Backup_proto_rawDescGZIP() []byte { } var file_backuppb_Backup_proto_enumTypes = make([]protoimpl.EnumInfo, 31) -var file_backuppb_Backup_proto_msgTypes = make([]protoimpl.MessageInfo, 120) +var file_backuppb_Backup_proto_msgTypes = make([]protoimpl.MessageInfo, 124) var file_backuppb_Backup_proto_goTypes = []any{ (AvatarColor)(0), // 0: signal.backup.AvatarColor (GroupV2AccessLevel)(0), // 1: signal.backup.GroupV2AccessLevel @@ -12253,108 +12531,112 @@ var file_backuppb_Backup_proto_goTypes = []any{ (*Quote)(nil), // 60: signal.backup.Quote (*BodyRange)(nil), // 61: signal.backup.BodyRange (*Reaction)(nil), // 62: signal.backup.Reaction - (*ChatUpdateMessage)(nil), // 63: signal.backup.ChatUpdateMessage - (*IndividualCall)(nil), // 64: signal.backup.IndividualCall - (*GroupCall)(nil), // 65: signal.backup.GroupCall - (*SimpleChatUpdate)(nil), // 66: signal.backup.SimpleChatUpdate - (*ExpirationTimerChatUpdate)(nil), // 67: signal.backup.ExpirationTimerChatUpdate - (*ProfileChangeChatUpdate)(nil), // 68: signal.backup.ProfileChangeChatUpdate - (*LearnedProfileChatUpdate)(nil), // 69: signal.backup.LearnedProfileChatUpdate - (*ThreadMergeChatUpdate)(nil), // 70: signal.backup.ThreadMergeChatUpdate - (*SessionSwitchoverChatUpdate)(nil), // 71: signal.backup.SessionSwitchoverChatUpdate - (*GroupChangeChatUpdate)(nil), // 72: signal.backup.GroupChangeChatUpdate - (*GenericGroupUpdate)(nil), // 73: signal.backup.GenericGroupUpdate - (*GroupCreationUpdate)(nil), // 74: signal.backup.GroupCreationUpdate - (*GroupNameUpdate)(nil), // 75: signal.backup.GroupNameUpdate - (*GroupAvatarUpdate)(nil), // 76: signal.backup.GroupAvatarUpdate - (*GroupDescriptionUpdate)(nil), // 77: signal.backup.GroupDescriptionUpdate - (*GroupMembershipAccessLevelChangeUpdate)(nil), // 78: signal.backup.GroupMembershipAccessLevelChangeUpdate - (*GroupAttributesAccessLevelChangeUpdate)(nil), // 79: signal.backup.GroupAttributesAccessLevelChangeUpdate - (*GroupAnnouncementOnlyChangeUpdate)(nil), // 80: signal.backup.GroupAnnouncementOnlyChangeUpdate - (*GroupAdminStatusUpdate)(nil), // 81: signal.backup.GroupAdminStatusUpdate - (*GroupMemberLeftUpdate)(nil), // 82: signal.backup.GroupMemberLeftUpdate - (*GroupMemberRemovedUpdate)(nil), // 83: signal.backup.GroupMemberRemovedUpdate - (*SelfInvitedToGroupUpdate)(nil), // 84: signal.backup.SelfInvitedToGroupUpdate - (*SelfInvitedOtherUserToGroupUpdate)(nil), // 85: signal.backup.SelfInvitedOtherUserToGroupUpdate - (*GroupUnknownInviteeUpdate)(nil), // 86: signal.backup.GroupUnknownInviteeUpdate - (*GroupInvitationAcceptedUpdate)(nil), // 87: signal.backup.GroupInvitationAcceptedUpdate - (*GroupInvitationDeclinedUpdate)(nil), // 88: signal.backup.GroupInvitationDeclinedUpdate - (*GroupMemberJoinedUpdate)(nil), // 89: signal.backup.GroupMemberJoinedUpdate - (*GroupMemberAddedUpdate)(nil), // 90: signal.backup.GroupMemberAddedUpdate - (*GroupSelfInvitationRevokedUpdate)(nil), // 91: signal.backup.GroupSelfInvitationRevokedUpdate - (*GroupInvitationRevokedUpdate)(nil), // 92: signal.backup.GroupInvitationRevokedUpdate - (*GroupJoinRequestUpdate)(nil), // 93: signal.backup.GroupJoinRequestUpdate - (*GroupJoinRequestApprovalUpdate)(nil), // 94: signal.backup.GroupJoinRequestApprovalUpdate - (*GroupJoinRequestCanceledUpdate)(nil), // 95: signal.backup.GroupJoinRequestCanceledUpdate - (*GroupSequenceOfRequestsAndCancelsUpdate)(nil), // 96: signal.backup.GroupSequenceOfRequestsAndCancelsUpdate - (*GroupInviteLinkResetUpdate)(nil), // 97: signal.backup.GroupInviteLinkResetUpdate - (*GroupInviteLinkEnabledUpdate)(nil), // 98: signal.backup.GroupInviteLinkEnabledUpdate - (*GroupInviteLinkAdminApprovalUpdate)(nil), // 99: signal.backup.GroupInviteLinkAdminApprovalUpdate - (*GroupInviteLinkDisabledUpdate)(nil), // 100: signal.backup.GroupInviteLinkDisabledUpdate - (*GroupMemberJoinedByLinkUpdate)(nil), // 101: signal.backup.GroupMemberJoinedByLinkUpdate - (*GroupV2MigrationUpdate)(nil), // 102: signal.backup.GroupV2MigrationUpdate - (*GroupV2MigrationSelfInvitedUpdate)(nil), // 103: signal.backup.GroupV2MigrationSelfInvitedUpdate - (*GroupV2MigrationInvitedMembersUpdate)(nil), // 104: signal.backup.GroupV2MigrationInvitedMembersUpdate - (*GroupV2MigrationDroppedMembersUpdate)(nil), // 105: signal.backup.GroupV2MigrationDroppedMembersUpdate - (*GroupExpirationTimerUpdate)(nil), // 106: signal.backup.GroupExpirationTimerUpdate - (*StickerPack)(nil), // 107: signal.backup.StickerPack - (*ChatStyle)(nil), // 108: signal.backup.ChatStyle - (*NotificationProfile)(nil), // 109: signal.backup.NotificationProfile - (*ChatFolder)(nil), // 110: signal.backup.ChatFolder - (*AccountData_UsernameLink)(nil), // 111: signal.backup.AccountData.UsernameLink - (*AccountData_AccountSettings)(nil), // 112: signal.backup.AccountData.AccountSettings - (*AccountData_SubscriberData)(nil), // 113: signal.backup.AccountData.SubscriberData - (*AccountData_IAPSubscriberData)(nil), // 114: signal.backup.AccountData.IAPSubscriberData - (*Contact_Registered)(nil), // 115: signal.backup.Contact.Registered - (*Contact_NotRegistered)(nil), // 116: signal.backup.Contact.NotRegistered - (*Contact_Name)(nil), // 117: signal.backup.Contact.Name - (*Group_GroupSnapshot)(nil), // 118: signal.backup.Group.GroupSnapshot - (*Group_GroupAttributeBlob)(nil), // 119: signal.backup.Group.GroupAttributeBlob - (*Group_Member)(nil), // 120: signal.backup.Group.Member - (*Group_MemberPendingProfileKey)(nil), // 121: signal.backup.Group.MemberPendingProfileKey - (*Group_MemberPendingAdminApproval)(nil), // 122: signal.backup.Group.MemberPendingAdminApproval - (*Group_MemberBanned)(nil), // 123: signal.backup.Group.MemberBanned - (*Group_AccessControl)(nil), // 124: signal.backup.Group.AccessControl - (*ChatItem_IncomingMessageDetails)(nil), // 125: signal.backup.ChatItem.IncomingMessageDetails - (*ChatItem_OutgoingMessageDetails)(nil), // 126: signal.backup.ChatItem.OutgoingMessageDetails - (*ChatItem_DirectionlessMessageDetails)(nil), // 127: signal.backup.ChatItem.DirectionlessMessageDetails - (*SendStatus_Pending)(nil), // 128: signal.backup.SendStatus.Pending - (*SendStatus_Sent)(nil), // 129: signal.backup.SendStatus.Sent - (*SendStatus_Delivered)(nil), // 130: signal.backup.SendStatus.Delivered - (*SendStatus_Read)(nil), // 131: signal.backup.SendStatus.Read - (*SendStatus_Viewed)(nil), // 132: signal.backup.SendStatus.Viewed - (*SendStatus_Skipped)(nil), // 133: signal.backup.SendStatus.Skipped - (*SendStatus_Failed)(nil), // 134: signal.backup.SendStatus.Failed - (*DirectStoryReplyMessage_TextReply)(nil), // 135: signal.backup.DirectStoryReplyMessage.TextReply - (*PaymentNotification_TransactionDetails)(nil), // 136: signal.backup.PaymentNotification.TransactionDetails - (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification)(nil), // 137: signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification - (*PaymentNotification_TransactionDetails_FailedTransaction)(nil), // 138: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction - (*PaymentNotification_TransactionDetails_Transaction)(nil), // 139: signal.backup.PaymentNotification.TransactionDetails.Transaction - (*ContactAttachment_Name)(nil), // 140: signal.backup.ContactAttachment.Name - (*ContactAttachment_Phone)(nil), // 141: signal.backup.ContactAttachment.Phone - (*ContactAttachment_Email)(nil), // 142: signal.backup.ContactAttachment.Email - (*ContactAttachment_PostalAddress)(nil), // 143: signal.backup.ContactAttachment.PostalAddress - (*FilePointer_LocatorInfo)(nil), // 144: signal.backup.FilePointer.LocatorInfo - (*Quote_QuotedAttachment)(nil), // 145: signal.backup.Quote.QuotedAttachment - (*GroupChangeChatUpdate_Update)(nil), // 146: signal.backup.GroupChangeChatUpdate.Update - (*GroupInvitationRevokedUpdate_Invitee)(nil), // 147: signal.backup.GroupInvitationRevokedUpdate.Invitee - (*ChatStyle_Gradient)(nil), // 148: signal.backup.ChatStyle.Gradient - (*ChatStyle_CustomChatColor)(nil), // 149: signal.backup.ChatStyle.CustomChatColor - (*ChatStyle_AutomaticBubbleColor)(nil), // 150: signal.backup.ChatStyle.AutomaticBubbleColor + (*Poll)(nil), // 63: signal.backup.Poll + (*ChatUpdateMessage)(nil), // 64: signal.backup.ChatUpdateMessage + (*IndividualCall)(nil), // 65: signal.backup.IndividualCall + (*GroupCall)(nil), // 66: signal.backup.GroupCall + (*SimpleChatUpdate)(nil), // 67: signal.backup.SimpleChatUpdate + (*ExpirationTimerChatUpdate)(nil), // 68: signal.backup.ExpirationTimerChatUpdate + (*ProfileChangeChatUpdate)(nil), // 69: signal.backup.ProfileChangeChatUpdate + (*LearnedProfileChatUpdate)(nil), // 70: signal.backup.LearnedProfileChatUpdate + (*ThreadMergeChatUpdate)(nil), // 71: signal.backup.ThreadMergeChatUpdate + (*SessionSwitchoverChatUpdate)(nil), // 72: signal.backup.SessionSwitchoverChatUpdate + (*GroupChangeChatUpdate)(nil), // 73: signal.backup.GroupChangeChatUpdate + (*GenericGroupUpdate)(nil), // 74: signal.backup.GenericGroupUpdate + (*GroupCreationUpdate)(nil), // 75: signal.backup.GroupCreationUpdate + (*GroupNameUpdate)(nil), // 76: signal.backup.GroupNameUpdate + (*GroupAvatarUpdate)(nil), // 77: signal.backup.GroupAvatarUpdate + (*GroupDescriptionUpdate)(nil), // 78: signal.backup.GroupDescriptionUpdate + (*GroupMembershipAccessLevelChangeUpdate)(nil), // 79: signal.backup.GroupMembershipAccessLevelChangeUpdate + (*GroupAttributesAccessLevelChangeUpdate)(nil), // 80: signal.backup.GroupAttributesAccessLevelChangeUpdate + (*GroupAnnouncementOnlyChangeUpdate)(nil), // 81: signal.backup.GroupAnnouncementOnlyChangeUpdate + (*GroupAdminStatusUpdate)(nil), // 82: signal.backup.GroupAdminStatusUpdate + (*GroupMemberLeftUpdate)(nil), // 83: signal.backup.GroupMemberLeftUpdate + (*GroupMemberRemovedUpdate)(nil), // 84: signal.backup.GroupMemberRemovedUpdate + (*SelfInvitedToGroupUpdate)(nil), // 85: signal.backup.SelfInvitedToGroupUpdate + (*SelfInvitedOtherUserToGroupUpdate)(nil), // 86: signal.backup.SelfInvitedOtherUserToGroupUpdate + (*GroupUnknownInviteeUpdate)(nil), // 87: signal.backup.GroupUnknownInviteeUpdate + (*GroupInvitationAcceptedUpdate)(nil), // 88: signal.backup.GroupInvitationAcceptedUpdate + (*GroupInvitationDeclinedUpdate)(nil), // 89: signal.backup.GroupInvitationDeclinedUpdate + (*GroupMemberJoinedUpdate)(nil), // 90: signal.backup.GroupMemberJoinedUpdate + (*GroupMemberAddedUpdate)(nil), // 91: signal.backup.GroupMemberAddedUpdate + (*GroupSelfInvitationRevokedUpdate)(nil), // 92: signal.backup.GroupSelfInvitationRevokedUpdate + (*GroupInvitationRevokedUpdate)(nil), // 93: signal.backup.GroupInvitationRevokedUpdate + (*GroupJoinRequestUpdate)(nil), // 94: signal.backup.GroupJoinRequestUpdate + (*GroupJoinRequestApprovalUpdate)(nil), // 95: signal.backup.GroupJoinRequestApprovalUpdate + (*GroupJoinRequestCanceledUpdate)(nil), // 96: signal.backup.GroupJoinRequestCanceledUpdate + (*GroupSequenceOfRequestsAndCancelsUpdate)(nil), // 97: signal.backup.GroupSequenceOfRequestsAndCancelsUpdate + (*GroupInviteLinkResetUpdate)(nil), // 98: signal.backup.GroupInviteLinkResetUpdate + (*GroupInviteLinkEnabledUpdate)(nil), // 99: signal.backup.GroupInviteLinkEnabledUpdate + (*GroupInviteLinkAdminApprovalUpdate)(nil), // 100: signal.backup.GroupInviteLinkAdminApprovalUpdate + (*GroupInviteLinkDisabledUpdate)(nil), // 101: signal.backup.GroupInviteLinkDisabledUpdate + (*GroupMemberJoinedByLinkUpdate)(nil), // 102: signal.backup.GroupMemberJoinedByLinkUpdate + (*GroupV2MigrationUpdate)(nil), // 103: signal.backup.GroupV2MigrationUpdate + (*GroupV2MigrationSelfInvitedUpdate)(nil), // 104: signal.backup.GroupV2MigrationSelfInvitedUpdate + (*GroupV2MigrationInvitedMembersUpdate)(nil), // 105: signal.backup.GroupV2MigrationInvitedMembersUpdate + (*GroupV2MigrationDroppedMembersUpdate)(nil), // 106: signal.backup.GroupV2MigrationDroppedMembersUpdate + (*GroupExpirationTimerUpdate)(nil), // 107: signal.backup.GroupExpirationTimerUpdate + (*PollTerminateUpdate)(nil), // 108: signal.backup.PollTerminateUpdate + (*StickerPack)(nil), // 109: signal.backup.StickerPack + (*ChatStyle)(nil), // 110: signal.backup.ChatStyle + (*NotificationProfile)(nil), // 111: signal.backup.NotificationProfile + (*ChatFolder)(nil), // 112: signal.backup.ChatFolder + (*AccountData_UsernameLink)(nil), // 113: signal.backup.AccountData.UsernameLink + (*AccountData_AccountSettings)(nil), // 114: signal.backup.AccountData.AccountSettings + (*AccountData_SubscriberData)(nil), // 115: signal.backup.AccountData.SubscriberData + (*AccountData_IAPSubscriberData)(nil), // 116: signal.backup.AccountData.IAPSubscriberData + (*Contact_Registered)(nil), // 117: signal.backup.Contact.Registered + (*Contact_NotRegistered)(nil), // 118: signal.backup.Contact.NotRegistered + (*Contact_Name)(nil), // 119: signal.backup.Contact.Name + (*Group_GroupSnapshot)(nil), // 120: signal.backup.Group.GroupSnapshot + (*Group_GroupAttributeBlob)(nil), // 121: signal.backup.Group.GroupAttributeBlob + (*Group_Member)(nil), // 122: signal.backup.Group.Member + (*Group_MemberPendingProfileKey)(nil), // 123: signal.backup.Group.MemberPendingProfileKey + (*Group_MemberPendingAdminApproval)(nil), // 124: signal.backup.Group.MemberPendingAdminApproval + (*Group_MemberBanned)(nil), // 125: signal.backup.Group.MemberBanned + (*Group_AccessControl)(nil), // 126: signal.backup.Group.AccessControl + (*ChatItem_IncomingMessageDetails)(nil), // 127: signal.backup.ChatItem.IncomingMessageDetails + (*ChatItem_OutgoingMessageDetails)(nil), // 128: signal.backup.ChatItem.OutgoingMessageDetails + (*ChatItem_DirectionlessMessageDetails)(nil), // 129: signal.backup.ChatItem.DirectionlessMessageDetails + (*SendStatus_Pending)(nil), // 130: signal.backup.SendStatus.Pending + (*SendStatus_Sent)(nil), // 131: signal.backup.SendStatus.Sent + (*SendStatus_Delivered)(nil), // 132: signal.backup.SendStatus.Delivered + (*SendStatus_Read)(nil), // 133: signal.backup.SendStatus.Read + (*SendStatus_Viewed)(nil), // 134: signal.backup.SendStatus.Viewed + (*SendStatus_Skipped)(nil), // 135: signal.backup.SendStatus.Skipped + (*SendStatus_Failed)(nil), // 136: signal.backup.SendStatus.Failed + (*DirectStoryReplyMessage_TextReply)(nil), // 137: signal.backup.DirectStoryReplyMessage.TextReply + (*PaymentNotification_TransactionDetails)(nil), // 138: signal.backup.PaymentNotification.TransactionDetails + (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification)(nil), // 139: signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification + (*PaymentNotification_TransactionDetails_FailedTransaction)(nil), // 140: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction + (*PaymentNotification_TransactionDetails_Transaction)(nil), // 141: signal.backup.PaymentNotification.TransactionDetails.Transaction + (*ContactAttachment_Name)(nil), // 142: signal.backup.ContactAttachment.Name + (*ContactAttachment_Phone)(nil), // 143: signal.backup.ContactAttachment.Phone + (*ContactAttachment_Email)(nil), // 144: signal.backup.ContactAttachment.Email + (*ContactAttachment_PostalAddress)(nil), // 145: signal.backup.ContactAttachment.PostalAddress + (*FilePointer_LocatorInfo)(nil), // 146: signal.backup.FilePointer.LocatorInfo + (*Quote_QuotedAttachment)(nil), // 147: signal.backup.Quote.QuotedAttachment + (*Poll_PollOption)(nil), // 148: signal.backup.Poll.PollOption + (*Poll_PollOption_PollVote)(nil), // 149: signal.backup.Poll.PollOption.PollVote + (*GroupChangeChatUpdate_Update)(nil), // 150: signal.backup.GroupChangeChatUpdate.Update + (*GroupInvitationRevokedUpdate_Invitee)(nil), // 151: signal.backup.GroupInvitationRevokedUpdate.Invitee + (*ChatStyle_Gradient)(nil), // 152: signal.backup.ChatStyle.Gradient + (*ChatStyle_CustomChatColor)(nil), // 153: signal.backup.ChatStyle.CustomChatColor + (*ChatStyle_AutomaticBubbleColor)(nil), // 154: signal.backup.ChatStyle.AutomaticBubbleColor } var file_backuppb_Backup_proto_depIdxs = []int32{ 33, // 0: signal.backup.Frame.account:type_name -> signal.backup.AccountData 34, // 1: signal.backup.Frame.recipient:type_name -> signal.backup.Recipient 39, // 2: signal.backup.Frame.chat:type_name -> signal.backup.Chat 44, // 3: signal.backup.Frame.chatItem:type_name -> signal.backup.ChatItem - 107, // 4: signal.backup.Frame.stickerPack:type_name -> signal.backup.StickerPack + 109, // 4: signal.backup.Frame.stickerPack:type_name -> signal.backup.StickerPack 41, // 5: signal.backup.Frame.adHocCall:type_name -> signal.backup.AdHocCall - 109, // 6: signal.backup.Frame.notificationProfile:type_name -> signal.backup.NotificationProfile - 110, // 7: signal.backup.Frame.chatFolder:type_name -> signal.backup.ChatFolder - 111, // 8: signal.backup.AccountData.usernameLink:type_name -> signal.backup.AccountData.UsernameLink - 113, // 9: signal.backup.AccountData.donationSubscriberData:type_name -> signal.backup.AccountData.SubscriberData - 112, // 10: signal.backup.AccountData.accountSettings:type_name -> signal.backup.AccountData.AccountSettings - 114, // 11: signal.backup.AccountData.backupsSubscriberData:type_name -> signal.backup.AccountData.IAPSubscriberData + 111, // 6: signal.backup.Frame.notificationProfile:type_name -> signal.backup.NotificationProfile + 112, // 7: signal.backup.Frame.chatFolder:type_name -> signal.backup.ChatFolder + 113, // 8: signal.backup.AccountData.usernameLink:type_name -> signal.backup.AccountData.UsernameLink + 115, // 9: signal.backup.AccountData.donationSubscriberData:type_name -> signal.backup.AccountData.SubscriberData + 114, // 10: signal.backup.AccountData.accountSettings:type_name -> signal.backup.AccountData.AccountSettings + 116, // 11: signal.backup.AccountData.backupsSubscriberData:type_name -> signal.backup.AccountData.IAPSubscriberData 35, // 12: signal.backup.Recipient.contact:type_name -> signal.backup.Contact 36, // 13: signal.backup.Recipient.group:type_name -> signal.backup.Group 42, // 14: signal.backup.Recipient.distributionList:type_name -> signal.backup.DistributionListItem @@ -12362,165 +12644,169 @@ var file_backuppb_Backup_proto_depIdxs = []int32{ 38, // 16: signal.backup.Recipient.releaseNotes:type_name -> signal.backup.ReleaseNotes 40, // 17: signal.backup.Recipient.callLink:type_name -> signal.backup.CallLink 5, // 18: signal.backup.Contact.visibility:type_name -> signal.backup.Contact.Visibility - 115, // 19: signal.backup.Contact.registered:type_name -> signal.backup.Contact.Registered - 116, // 20: signal.backup.Contact.notRegistered:type_name -> signal.backup.Contact.NotRegistered + 117, // 19: signal.backup.Contact.registered:type_name -> signal.backup.Contact.Registered + 118, // 20: signal.backup.Contact.notRegistered:type_name -> signal.backup.Contact.NotRegistered 4, // 21: signal.backup.Contact.identityState:type_name -> signal.backup.Contact.IdentityState - 117, // 22: signal.backup.Contact.nickname:type_name -> signal.backup.Contact.Name + 119, // 22: signal.backup.Contact.nickname:type_name -> signal.backup.Contact.Name 0, // 23: signal.backup.Contact.avatarColor:type_name -> signal.backup.AvatarColor 6, // 24: signal.backup.Group.storySendMode:type_name -> signal.backup.Group.StorySendMode - 118, // 25: signal.backup.Group.snapshot:type_name -> signal.backup.Group.GroupSnapshot + 120, // 25: signal.backup.Group.snapshot:type_name -> signal.backup.Group.GroupSnapshot 0, // 26: signal.backup.Group.avatarColor:type_name -> signal.backup.AvatarColor 0, // 27: signal.backup.Self.avatarColor:type_name -> signal.backup.AvatarColor - 108, // 28: signal.backup.Chat.style:type_name -> signal.backup.ChatStyle + 110, // 28: signal.backup.Chat.style:type_name -> signal.backup.ChatStyle 9, // 29: signal.backup.CallLink.restrictions:type_name -> signal.backup.CallLink.Restrictions 10, // 30: signal.backup.AdHocCall.state:type_name -> signal.backup.AdHocCall.State 43, // 31: signal.backup.DistributionListItem.distributionList:type_name -> signal.backup.DistributionList 11, // 32: signal.backup.DistributionList.privacyMode:type_name -> signal.backup.DistributionList.PrivacyMode 44, // 33: signal.backup.ChatItem.revisions:type_name -> signal.backup.ChatItem - 125, // 34: signal.backup.ChatItem.incoming:type_name -> signal.backup.ChatItem.IncomingMessageDetails - 126, // 35: signal.backup.ChatItem.outgoing:type_name -> signal.backup.ChatItem.OutgoingMessageDetails - 127, // 36: signal.backup.ChatItem.directionless:type_name -> signal.backup.ChatItem.DirectionlessMessageDetails + 127, // 34: signal.backup.ChatItem.incoming:type_name -> signal.backup.ChatItem.IncomingMessageDetails + 128, // 35: signal.backup.ChatItem.outgoing:type_name -> signal.backup.ChatItem.OutgoingMessageDetails + 129, // 36: signal.backup.ChatItem.directionless:type_name -> signal.backup.ChatItem.DirectionlessMessageDetails 47, // 37: signal.backup.ChatItem.standardMessage:type_name -> signal.backup.StandardMessage 48, // 38: signal.backup.ChatItem.contactMessage:type_name -> signal.backup.ContactMessage 54, // 39: signal.backup.ChatItem.stickerMessage:type_name -> signal.backup.StickerMessage 55, // 40: signal.backup.ChatItem.remoteDeletedMessage:type_name -> signal.backup.RemoteDeletedMessage - 63, // 41: signal.backup.ChatItem.updateMessage:type_name -> signal.backup.ChatUpdateMessage + 64, // 41: signal.backup.ChatItem.updateMessage:type_name -> signal.backup.ChatUpdateMessage 50, // 42: signal.backup.ChatItem.paymentNotification:type_name -> signal.backup.PaymentNotification 51, // 43: signal.backup.ChatItem.giftBadge:type_name -> signal.backup.GiftBadge 52, // 44: signal.backup.ChatItem.viewOnceMessage:type_name -> signal.backup.ViewOnceMessage 49, // 45: signal.backup.ChatItem.directStoryReplyMessage:type_name -> signal.backup.DirectStoryReplyMessage - 128, // 46: signal.backup.SendStatus.pending:type_name -> signal.backup.SendStatus.Pending - 129, // 47: signal.backup.SendStatus.sent:type_name -> signal.backup.SendStatus.Sent - 130, // 48: signal.backup.SendStatus.delivered:type_name -> signal.backup.SendStatus.Delivered - 131, // 49: signal.backup.SendStatus.read:type_name -> signal.backup.SendStatus.Read - 132, // 50: signal.backup.SendStatus.viewed:type_name -> signal.backup.SendStatus.Viewed - 133, // 51: signal.backup.SendStatus.skipped:type_name -> signal.backup.SendStatus.Skipped - 134, // 52: signal.backup.SendStatus.failed:type_name -> signal.backup.SendStatus.Failed - 61, // 53: signal.backup.Text.bodyRanges:type_name -> signal.backup.BodyRange - 60, // 54: signal.backup.StandardMessage.quote:type_name -> signal.backup.Quote - 46, // 55: signal.backup.StandardMessage.text:type_name -> signal.backup.Text - 58, // 56: signal.backup.StandardMessage.attachments:type_name -> signal.backup.MessageAttachment - 57, // 57: signal.backup.StandardMessage.linkPreview:type_name -> signal.backup.LinkPreview - 59, // 58: signal.backup.StandardMessage.longText:type_name -> signal.backup.FilePointer - 62, // 59: signal.backup.StandardMessage.reactions:type_name -> signal.backup.Reaction - 53, // 60: signal.backup.ContactMessage.contact:type_name -> signal.backup.ContactAttachment - 62, // 61: signal.backup.ContactMessage.reactions:type_name -> signal.backup.Reaction - 135, // 62: signal.backup.DirectStoryReplyMessage.textReply:type_name -> signal.backup.DirectStoryReplyMessage.TextReply - 62, // 63: signal.backup.DirectStoryReplyMessage.reactions:type_name -> signal.backup.Reaction - 136, // 64: signal.backup.PaymentNotification.transactionDetails:type_name -> signal.backup.PaymentNotification.TransactionDetails - 15, // 65: signal.backup.GiftBadge.state:type_name -> signal.backup.GiftBadge.State - 58, // 66: signal.backup.ViewOnceMessage.attachment:type_name -> signal.backup.MessageAttachment - 62, // 67: signal.backup.ViewOnceMessage.reactions:type_name -> signal.backup.Reaction - 140, // 68: signal.backup.ContactAttachment.name:type_name -> signal.backup.ContactAttachment.Name - 141, // 69: signal.backup.ContactAttachment.number:type_name -> signal.backup.ContactAttachment.Phone - 142, // 70: signal.backup.ContactAttachment.email:type_name -> signal.backup.ContactAttachment.Email - 143, // 71: signal.backup.ContactAttachment.address:type_name -> signal.backup.ContactAttachment.PostalAddress - 59, // 72: signal.backup.ContactAttachment.avatar:type_name -> signal.backup.FilePointer - 56, // 73: signal.backup.StickerMessage.sticker:type_name -> signal.backup.Sticker - 62, // 74: signal.backup.StickerMessage.reactions:type_name -> signal.backup.Reaction - 59, // 75: signal.backup.Sticker.data:type_name -> signal.backup.FilePointer - 59, // 76: signal.backup.LinkPreview.image:type_name -> signal.backup.FilePointer - 59, // 77: signal.backup.MessageAttachment.pointer:type_name -> signal.backup.FilePointer - 19, // 78: signal.backup.MessageAttachment.flag:type_name -> signal.backup.MessageAttachment.Flag - 144, // 79: signal.backup.FilePointer.locatorInfo:type_name -> signal.backup.FilePointer.LocatorInfo - 46, // 80: signal.backup.Quote.text:type_name -> signal.backup.Text - 145, // 81: signal.backup.Quote.attachments:type_name -> signal.backup.Quote.QuotedAttachment - 20, // 82: signal.backup.Quote.type:type_name -> signal.backup.Quote.Type - 21, // 83: signal.backup.BodyRange.style:type_name -> signal.backup.BodyRange.Style - 66, // 84: signal.backup.ChatUpdateMessage.simpleUpdate:type_name -> signal.backup.SimpleChatUpdate - 72, // 85: signal.backup.ChatUpdateMessage.groupChange:type_name -> signal.backup.GroupChangeChatUpdate - 67, // 86: signal.backup.ChatUpdateMessage.expirationTimerChange:type_name -> signal.backup.ExpirationTimerChatUpdate - 68, // 87: signal.backup.ChatUpdateMessage.profileChange:type_name -> signal.backup.ProfileChangeChatUpdate - 70, // 88: signal.backup.ChatUpdateMessage.threadMerge:type_name -> signal.backup.ThreadMergeChatUpdate - 71, // 89: signal.backup.ChatUpdateMessage.sessionSwitchover:type_name -> signal.backup.SessionSwitchoverChatUpdate - 64, // 90: signal.backup.ChatUpdateMessage.individualCall:type_name -> signal.backup.IndividualCall - 65, // 91: signal.backup.ChatUpdateMessage.groupCall:type_name -> signal.backup.GroupCall - 69, // 92: signal.backup.ChatUpdateMessage.learnedProfileChange:type_name -> signal.backup.LearnedProfileChatUpdate - 22, // 93: signal.backup.IndividualCall.type:type_name -> signal.backup.IndividualCall.Type - 23, // 94: signal.backup.IndividualCall.direction:type_name -> signal.backup.IndividualCall.Direction - 24, // 95: signal.backup.IndividualCall.state:type_name -> signal.backup.IndividualCall.State - 25, // 96: signal.backup.GroupCall.state:type_name -> signal.backup.GroupCall.State - 26, // 97: signal.backup.SimpleChatUpdate.type:type_name -> signal.backup.SimpleChatUpdate.Type - 146, // 98: signal.backup.GroupChangeChatUpdate.updates:type_name -> signal.backup.GroupChangeChatUpdate.Update - 1, // 99: signal.backup.GroupMembershipAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel - 1, // 100: signal.backup.GroupAttributesAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel - 147, // 101: signal.backup.GroupInvitationRevokedUpdate.invitees:type_name -> signal.backup.GroupInvitationRevokedUpdate.Invitee - 27, // 102: signal.backup.ChatStyle.wallpaperPreset:type_name -> signal.backup.ChatStyle.WallpaperPreset - 59, // 103: signal.backup.ChatStyle.wallpaperPhoto:type_name -> signal.backup.FilePointer - 150, // 104: signal.backup.ChatStyle.autoBubbleColor:type_name -> signal.backup.ChatStyle.AutomaticBubbleColor - 28, // 105: signal.backup.ChatStyle.bubbleColorPreset:type_name -> signal.backup.ChatStyle.BubbleColorPreset - 29, // 106: signal.backup.NotificationProfile.scheduleDaysEnabled:type_name -> signal.backup.NotificationProfile.DayOfWeek - 30, // 107: signal.backup.ChatFolder.folderType:type_name -> signal.backup.ChatFolder.FolderType - 3, // 108: signal.backup.AccountData.UsernameLink.color:type_name -> signal.backup.AccountData.UsernameLink.Color - 2, // 109: signal.backup.AccountData.AccountSettings.phoneNumberSharingMode:type_name -> signal.backup.AccountData.PhoneNumberSharingMode - 108, // 110: signal.backup.AccountData.AccountSettings.defaultChatStyle:type_name -> signal.backup.ChatStyle - 149, // 111: signal.backup.AccountData.AccountSettings.customChatColors:type_name -> signal.backup.ChatStyle.CustomChatColor - 119, // 112: signal.backup.Group.GroupSnapshot.title:type_name -> signal.backup.Group.GroupAttributeBlob - 119, // 113: signal.backup.Group.GroupSnapshot.description:type_name -> signal.backup.Group.GroupAttributeBlob - 119, // 114: signal.backup.Group.GroupSnapshot.disappearingMessagesTimer:type_name -> signal.backup.Group.GroupAttributeBlob - 124, // 115: signal.backup.Group.GroupSnapshot.accessControl:type_name -> signal.backup.Group.AccessControl - 120, // 116: signal.backup.Group.GroupSnapshot.members:type_name -> signal.backup.Group.Member - 121, // 117: signal.backup.Group.GroupSnapshot.membersPendingProfileKey:type_name -> signal.backup.Group.MemberPendingProfileKey - 122, // 118: signal.backup.Group.GroupSnapshot.membersPendingAdminApproval:type_name -> signal.backup.Group.MemberPendingAdminApproval - 123, // 119: signal.backup.Group.GroupSnapshot.members_banned:type_name -> signal.backup.Group.MemberBanned - 7, // 120: signal.backup.Group.Member.role:type_name -> signal.backup.Group.Member.Role - 120, // 121: signal.backup.Group.MemberPendingProfileKey.member:type_name -> signal.backup.Group.Member - 8, // 122: signal.backup.Group.AccessControl.attributes:type_name -> signal.backup.Group.AccessControl.AccessRequired - 8, // 123: signal.backup.Group.AccessControl.members:type_name -> signal.backup.Group.AccessControl.AccessRequired - 8, // 124: signal.backup.Group.AccessControl.addFromInviteLink:type_name -> signal.backup.Group.AccessControl.AccessRequired - 45, // 125: signal.backup.ChatItem.OutgoingMessageDetails.sendStatus:type_name -> signal.backup.SendStatus - 12, // 126: signal.backup.SendStatus.Failed.reason:type_name -> signal.backup.SendStatus.Failed.FailureReason - 46, // 127: signal.backup.DirectStoryReplyMessage.TextReply.text:type_name -> signal.backup.Text - 59, // 128: signal.backup.DirectStoryReplyMessage.TextReply.longText:type_name -> signal.backup.FilePointer - 139, // 129: signal.backup.PaymentNotification.TransactionDetails.transaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction - 138, // 130: signal.backup.PaymentNotification.TransactionDetails.failedTransaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction - 13, // 131: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.reason:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason - 14, // 132: signal.backup.PaymentNotification.TransactionDetails.Transaction.status:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction.Status - 137, // 133: signal.backup.PaymentNotification.TransactionDetails.Transaction.mobileCoinIdentification:type_name -> signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification - 16, // 134: signal.backup.ContactAttachment.Phone.type:type_name -> signal.backup.ContactAttachment.Phone.Type - 17, // 135: signal.backup.ContactAttachment.Email.type:type_name -> signal.backup.ContactAttachment.Email.Type - 18, // 136: signal.backup.ContactAttachment.PostalAddress.type:type_name -> signal.backup.ContactAttachment.PostalAddress.Type - 58, // 137: signal.backup.Quote.QuotedAttachment.thumbnail:type_name -> signal.backup.MessageAttachment - 73, // 138: signal.backup.GroupChangeChatUpdate.Update.genericGroupUpdate:type_name -> signal.backup.GenericGroupUpdate - 74, // 139: signal.backup.GroupChangeChatUpdate.Update.groupCreationUpdate:type_name -> signal.backup.GroupCreationUpdate - 75, // 140: signal.backup.GroupChangeChatUpdate.Update.groupNameUpdate:type_name -> signal.backup.GroupNameUpdate - 76, // 141: signal.backup.GroupChangeChatUpdate.Update.groupAvatarUpdate:type_name -> signal.backup.GroupAvatarUpdate - 77, // 142: signal.backup.GroupChangeChatUpdate.Update.groupDescriptionUpdate:type_name -> signal.backup.GroupDescriptionUpdate - 78, // 143: signal.backup.GroupChangeChatUpdate.Update.groupMembershipAccessLevelChangeUpdate:type_name -> signal.backup.GroupMembershipAccessLevelChangeUpdate - 79, // 144: signal.backup.GroupChangeChatUpdate.Update.groupAttributesAccessLevelChangeUpdate:type_name -> signal.backup.GroupAttributesAccessLevelChangeUpdate - 80, // 145: signal.backup.GroupChangeChatUpdate.Update.groupAnnouncementOnlyChangeUpdate:type_name -> signal.backup.GroupAnnouncementOnlyChangeUpdate - 81, // 146: signal.backup.GroupChangeChatUpdate.Update.groupAdminStatusUpdate:type_name -> signal.backup.GroupAdminStatusUpdate - 82, // 147: signal.backup.GroupChangeChatUpdate.Update.groupMemberLeftUpdate:type_name -> signal.backup.GroupMemberLeftUpdate - 83, // 148: signal.backup.GroupChangeChatUpdate.Update.groupMemberRemovedUpdate:type_name -> signal.backup.GroupMemberRemovedUpdate - 84, // 149: signal.backup.GroupChangeChatUpdate.Update.selfInvitedToGroupUpdate:type_name -> signal.backup.SelfInvitedToGroupUpdate - 85, // 150: signal.backup.GroupChangeChatUpdate.Update.selfInvitedOtherUserToGroupUpdate:type_name -> signal.backup.SelfInvitedOtherUserToGroupUpdate - 86, // 151: signal.backup.GroupChangeChatUpdate.Update.groupUnknownInviteeUpdate:type_name -> signal.backup.GroupUnknownInviteeUpdate - 87, // 152: signal.backup.GroupChangeChatUpdate.Update.groupInvitationAcceptedUpdate:type_name -> signal.backup.GroupInvitationAcceptedUpdate - 88, // 153: signal.backup.GroupChangeChatUpdate.Update.groupInvitationDeclinedUpdate:type_name -> signal.backup.GroupInvitationDeclinedUpdate - 89, // 154: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedUpdate:type_name -> signal.backup.GroupMemberJoinedUpdate - 90, // 155: signal.backup.GroupChangeChatUpdate.Update.groupMemberAddedUpdate:type_name -> signal.backup.GroupMemberAddedUpdate - 91, // 156: signal.backup.GroupChangeChatUpdate.Update.groupSelfInvitationRevokedUpdate:type_name -> signal.backup.GroupSelfInvitationRevokedUpdate - 92, // 157: signal.backup.GroupChangeChatUpdate.Update.groupInvitationRevokedUpdate:type_name -> signal.backup.GroupInvitationRevokedUpdate - 93, // 158: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestUpdate:type_name -> signal.backup.GroupJoinRequestUpdate - 94, // 159: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestApprovalUpdate:type_name -> signal.backup.GroupJoinRequestApprovalUpdate - 95, // 160: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestCanceledUpdate:type_name -> signal.backup.GroupJoinRequestCanceledUpdate - 97, // 161: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkResetUpdate:type_name -> signal.backup.GroupInviteLinkResetUpdate - 98, // 162: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkEnabledUpdate:type_name -> signal.backup.GroupInviteLinkEnabledUpdate - 99, // 163: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkAdminApprovalUpdate:type_name -> signal.backup.GroupInviteLinkAdminApprovalUpdate - 100, // 164: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkDisabledUpdate:type_name -> signal.backup.GroupInviteLinkDisabledUpdate - 101, // 165: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedByLinkUpdate:type_name -> signal.backup.GroupMemberJoinedByLinkUpdate - 102, // 166: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationUpdate:type_name -> signal.backup.GroupV2MigrationUpdate - 103, // 167: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationSelfInvitedUpdate:type_name -> signal.backup.GroupV2MigrationSelfInvitedUpdate - 104, // 168: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationInvitedMembersUpdate:type_name -> signal.backup.GroupV2MigrationInvitedMembersUpdate - 105, // 169: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationDroppedMembersUpdate:type_name -> signal.backup.GroupV2MigrationDroppedMembersUpdate - 96, // 170: signal.backup.GroupChangeChatUpdate.Update.groupSequenceOfRequestsAndCancelsUpdate:type_name -> signal.backup.GroupSequenceOfRequestsAndCancelsUpdate - 106, // 171: signal.backup.GroupChangeChatUpdate.Update.groupExpirationTimerUpdate:type_name -> signal.backup.GroupExpirationTimerUpdate - 148, // 172: signal.backup.ChatStyle.CustomChatColor.gradient:type_name -> signal.backup.ChatStyle.Gradient - 173, // [173:173] is the sub-list for method output_type - 173, // [173:173] is the sub-list for method input_type - 173, // [173:173] is the sub-list for extension type_name - 173, // [173:173] is the sub-list for extension extendee - 0, // [0:173] is the sub-list for field type_name + 63, // 46: signal.backup.ChatItem.poll:type_name -> signal.backup.Poll + 130, // 47: signal.backup.SendStatus.pending:type_name -> signal.backup.SendStatus.Pending + 131, // 48: signal.backup.SendStatus.sent:type_name -> signal.backup.SendStatus.Sent + 132, // 49: signal.backup.SendStatus.delivered:type_name -> signal.backup.SendStatus.Delivered + 133, // 50: signal.backup.SendStatus.read:type_name -> signal.backup.SendStatus.Read + 134, // 51: signal.backup.SendStatus.viewed:type_name -> signal.backup.SendStatus.Viewed + 135, // 52: signal.backup.SendStatus.skipped:type_name -> signal.backup.SendStatus.Skipped + 136, // 53: signal.backup.SendStatus.failed:type_name -> signal.backup.SendStatus.Failed + 61, // 54: signal.backup.Text.bodyRanges:type_name -> signal.backup.BodyRange + 60, // 55: signal.backup.StandardMessage.quote:type_name -> signal.backup.Quote + 46, // 56: signal.backup.StandardMessage.text:type_name -> signal.backup.Text + 58, // 57: signal.backup.StandardMessage.attachments:type_name -> signal.backup.MessageAttachment + 57, // 58: signal.backup.StandardMessage.linkPreview:type_name -> signal.backup.LinkPreview + 59, // 59: signal.backup.StandardMessage.longText:type_name -> signal.backup.FilePointer + 62, // 60: signal.backup.StandardMessage.reactions:type_name -> signal.backup.Reaction + 53, // 61: signal.backup.ContactMessage.contact:type_name -> signal.backup.ContactAttachment + 62, // 62: signal.backup.ContactMessage.reactions:type_name -> signal.backup.Reaction + 137, // 63: signal.backup.DirectStoryReplyMessage.textReply:type_name -> signal.backup.DirectStoryReplyMessage.TextReply + 62, // 64: signal.backup.DirectStoryReplyMessage.reactions:type_name -> signal.backup.Reaction + 138, // 65: signal.backup.PaymentNotification.transactionDetails:type_name -> signal.backup.PaymentNotification.TransactionDetails + 15, // 66: signal.backup.GiftBadge.state:type_name -> signal.backup.GiftBadge.State + 58, // 67: signal.backup.ViewOnceMessage.attachment:type_name -> signal.backup.MessageAttachment + 62, // 68: signal.backup.ViewOnceMessage.reactions:type_name -> signal.backup.Reaction + 142, // 69: signal.backup.ContactAttachment.name:type_name -> signal.backup.ContactAttachment.Name + 143, // 70: signal.backup.ContactAttachment.number:type_name -> signal.backup.ContactAttachment.Phone + 144, // 71: signal.backup.ContactAttachment.email:type_name -> signal.backup.ContactAttachment.Email + 145, // 72: signal.backup.ContactAttachment.address:type_name -> signal.backup.ContactAttachment.PostalAddress + 59, // 73: signal.backup.ContactAttachment.avatar:type_name -> signal.backup.FilePointer + 56, // 74: signal.backup.StickerMessage.sticker:type_name -> signal.backup.Sticker + 62, // 75: signal.backup.StickerMessage.reactions:type_name -> signal.backup.Reaction + 59, // 76: signal.backup.Sticker.data:type_name -> signal.backup.FilePointer + 59, // 77: signal.backup.LinkPreview.image:type_name -> signal.backup.FilePointer + 59, // 78: signal.backup.MessageAttachment.pointer:type_name -> signal.backup.FilePointer + 19, // 79: signal.backup.MessageAttachment.flag:type_name -> signal.backup.MessageAttachment.Flag + 146, // 80: signal.backup.FilePointer.locatorInfo:type_name -> signal.backup.FilePointer.LocatorInfo + 46, // 81: signal.backup.Quote.text:type_name -> signal.backup.Text + 147, // 82: signal.backup.Quote.attachments:type_name -> signal.backup.Quote.QuotedAttachment + 20, // 83: signal.backup.Quote.type:type_name -> signal.backup.Quote.Type + 21, // 84: signal.backup.BodyRange.style:type_name -> signal.backup.BodyRange.Style + 148, // 85: signal.backup.Poll.options:type_name -> signal.backup.Poll.PollOption + 67, // 86: signal.backup.ChatUpdateMessage.simpleUpdate:type_name -> signal.backup.SimpleChatUpdate + 73, // 87: signal.backup.ChatUpdateMessage.groupChange:type_name -> signal.backup.GroupChangeChatUpdate + 68, // 88: signal.backup.ChatUpdateMessage.expirationTimerChange:type_name -> signal.backup.ExpirationTimerChatUpdate + 69, // 89: signal.backup.ChatUpdateMessage.profileChange:type_name -> signal.backup.ProfileChangeChatUpdate + 71, // 90: signal.backup.ChatUpdateMessage.threadMerge:type_name -> signal.backup.ThreadMergeChatUpdate + 72, // 91: signal.backup.ChatUpdateMessage.sessionSwitchover:type_name -> signal.backup.SessionSwitchoverChatUpdate + 65, // 92: signal.backup.ChatUpdateMessage.individualCall:type_name -> signal.backup.IndividualCall + 66, // 93: signal.backup.ChatUpdateMessage.groupCall:type_name -> signal.backup.GroupCall + 70, // 94: signal.backup.ChatUpdateMessage.learnedProfileChange:type_name -> signal.backup.LearnedProfileChatUpdate + 108, // 95: signal.backup.ChatUpdateMessage.pollTerminate:type_name -> signal.backup.PollTerminateUpdate + 22, // 96: signal.backup.IndividualCall.type:type_name -> signal.backup.IndividualCall.Type + 23, // 97: signal.backup.IndividualCall.direction:type_name -> signal.backup.IndividualCall.Direction + 24, // 98: signal.backup.IndividualCall.state:type_name -> signal.backup.IndividualCall.State + 25, // 99: signal.backup.GroupCall.state:type_name -> signal.backup.GroupCall.State + 26, // 100: signal.backup.SimpleChatUpdate.type:type_name -> signal.backup.SimpleChatUpdate.Type + 150, // 101: signal.backup.GroupChangeChatUpdate.updates:type_name -> signal.backup.GroupChangeChatUpdate.Update + 1, // 102: signal.backup.GroupMembershipAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel + 1, // 103: signal.backup.GroupAttributesAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel + 151, // 104: signal.backup.GroupInvitationRevokedUpdate.invitees:type_name -> signal.backup.GroupInvitationRevokedUpdate.Invitee + 27, // 105: signal.backup.ChatStyle.wallpaperPreset:type_name -> signal.backup.ChatStyle.WallpaperPreset + 59, // 106: signal.backup.ChatStyle.wallpaperPhoto:type_name -> signal.backup.FilePointer + 154, // 107: signal.backup.ChatStyle.autoBubbleColor:type_name -> signal.backup.ChatStyle.AutomaticBubbleColor + 28, // 108: signal.backup.ChatStyle.bubbleColorPreset:type_name -> signal.backup.ChatStyle.BubbleColorPreset + 29, // 109: signal.backup.NotificationProfile.scheduleDaysEnabled:type_name -> signal.backup.NotificationProfile.DayOfWeek + 30, // 110: signal.backup.ChatFolder.folderType:type_name -> signal.backup.ChatFolder.FolderType + 3, // 111: signal.backup.AccountData.UsernameLink.color:type_name -> signal.backup.AccountData.UsernameLink.Color + 2, // 112: signal.backup.AccountData.AccountSettings.phoneNumberSharingMode:type_name -> signal.backup.AccountData.PhoneNumberSharingMode + 110, // 113: signal.backup.AccountData.AccountSettings.defaultChatStyle:type_name -> signal.backup.ChatStyle + 153, // 114: signal.backup.AccountData.AccountSettings.customChatColors:type_name -> signal.backup.ChatStyle.CustomChatColor + 121, // 115: signal.backup.Group.GroupSnapshot.title:type_name -> signal.backup.Group.GroupAttributeBlob + 121, // 116: signal.backup.Group.GroupSnapshot.description:type_name -> signal.backup.Group.GroupAttributeBlob + 121, // 117: signal.backup.Group.GroupSnapshot.disappearingMessagesTimer:type_name -> signal.backup.Group.GroupAttributeBlob + 126, // 118: signal.backup.Group.GroupSnapshot.accessControl:type_name -> signal.backup.Group.AccessControl + 122, // 119: signal.backup.Group.GroupSnapshot.members:type_name -> signal.backup.Group.Member + 123, // 120: signal.backup.Group.GroupSnapshot.membersPendingProfileKey:type_name -> signal.backup.Group.MemberPendingProfileKey + 124, // 121: signal.backup.Group.GroupSnapshot.membersPendingAdminApproval:type_name -> signal.backup.Group.MemberPendingAdminApproval + 125, // 122: signal.backup.Group.GroupSnapshot.members_banned:type_name -> signal.backup.Group.MemberBanned + 7, // 123: signal.backup.Group.Member.role:type_name -> signal.backup.Group.Member.Role + 122, // 124: signal.backup.Group.MemberPendingProfileKey.member:type_name -> signal.backup.Group.Member + 8, // 125: signal.backup.Group.AccessControl.attributes:type_name -> signal.backup.Group.AccessControl.AccessRequired + 8, // 126: signal.backup.Group.AccessControl.members:type_name -> signal.backup.Group.AccessControl.AccessRequired + 8, // 127: signal.backup.Group.AccessControl.addFromInviteLink:type_name -> signal.backup.Group.AccessControl.AccessRequired + 45, // 128: signal.backup.ChatItem.OutgoingMessageDetails.sendStatus:type_name -> signal.backup.SendStatus + 12, // 129: signal.backup.SendStatus.Failed.reason:type_name -> signal.backup.SendStatus.Failed.FailureReason + 46, // 130: signal.backup.DirectStoryReplyMessage.TextReply.text:type_name -> signal.backup.Text + 59, // 131: signal.backup.DirectStoryReplyMessage.TextReply.longText:type_name -> signal.backup.FilePointer + 141, // 132: signal.backup.PaymentNotification.TransactionDetails.transaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction + 140, // 133: signal.backup.PaymentNotification.TransactionDetails.failedTransaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction + 13, // 134: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.reason:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason + 14, // 135: signal.backup.PaymentNotification.TransactionDetails.Transaction.status:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction.Status + 139, // 136: signal.backup.PaymentNotification.TransactionDetails.Transaction.mobileCoinIdentification:type_name -> signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification + 16, // 137: signal.backup.ContactAttachment.Phone.type:type_name -> signal.backup.ContactAttachment.Phone.Type + 17, // 138: signal.backup.ContactAttachment.Email.type:type_name -> signal.backup.ContactAttachment.Email.Type + 18, // 139: signal.backup.ContactAttachment.PostalAddress.type:type_name -> signal.backup.ContactAttachment.PostalAddress.Type + 58, // 140: signal.backup.Quote.QuotedAttachment.thumbnail:type_name -> signal.backup.MessageAttachment + 149, // 141: signal.backup.Poll.PollOption.votes:type_name -> signal.backup.Poll.PollOption.PollVote + 74, // 142: signal.backup.GroupChangeChatUpdate.Update.genericGroupUpdate:type_name -> signal.backup.GenericGroupUpdate + 75, // 143: signal.backup.GroupChangeChatUpdate.Update.groupCreationUpdate:type_name -> signal.backup.GroupCreationUpdate + 76, // 144: signal.backup.GroupChangeChatUpdate.Update.groupNameUpdate:type_name -> signal.backup.GroupNameUpdate + 77, // 145: signal.backup.GroupChangeChatUpdate.Update.groupAvatarUpdate:type_name -> signal.backup.GroupAvatarUpdate + 78, // 146: signal.backup.GroupChangeChatUpdate.Update.groupDescriptionUpdate:type_name -> signal.backup.GroupDescriptionUpdate + 79, // 147: signal.backup.GroupChangeChatUpdate.Update.groupMembershipAccessLevelChangeUpdate:type_name -> signal.backup.GroupMembershipAccessLevelChangeUpdate + 80, // 148: signal.backup.GroupChangeChatUpdate.Update.groupAttributesAccessLevelChangeUpdate:type_name -> signal.backup.GroupAttributesAccessLevelChangeUpdate + 81, // 149: signal.backup.GroupChangeChatUpdate.Update.groupAnnouncementOnlyChangeUpdate:type_name -> signal.backup.GroupAnnouncementOnlyChangeUpdate + 82, // 150: signal.backup.GroupChangeChatUpdate.Update.groupAdminStatusUpdate:type_name -> signal.backup.GroupAdminStatusUpdate + 83, // 151: signal.backup.GroupChangeChatUpdate.Update.groupMemberLeftUpdate:type_name -> signal.backup.GroupMemberLeftUpdate + 84, // 152: signal.backup.GroupChangeChatUpdate.Update.groupMemberRemovedUpdate:type_name -> signal.backup.GroupMemberRemovedUpdate + 85, // 153: signal.backup.GroupChangeChatUpdate.Update.selfInvitedToGroupUpdate:type_name -> signal.backup.SelfInvitedToGroupUpdate + 86, // 154: signal.backup.GroupChangeChatUpdate.Update.selfInvitedOtherUserToGroupUpdate:type_name -> signal.backup.SelfInvitedOtherUserToGroupUpdate + 87, // 155: signal.backup.GroupChangeChatUpdate.Update.groupUnknownInviteeUpdate:type_name -> signal.backup.GroupUnknownInviteeUpdate + 88, // 156: signal.backup.GroupChangeChatUpdate.Update.groupInvitationAcceptedUpdate:type_name -> signal.backup.GroupInvitationAcceptedUpdate + 89, // 157: signal.backup.GroupChangeChatUpdate.Update.groupInvitationDeclinedUpdate:type_name -> signal.backup.GroupInvitationDeclinedUpdate + 90, // 158: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedUpdate:type_name -> signal.backup.GroupMemberJoinedUpdate + 91, // 159: signal.backup.GroupChangeChatUpdate.Update.groupMemberAddedUpdate:type_name -> signal.backup.GroupMemberAddedUpdate + 92, // 160: signal.backup.GroupChangeChatUpdate.Update.groupSelfInvitationRevokedUpdate:type_name -> signal.backup.GroupSelfInvitationRevokedUpdate + 93, // 161: signal.backup.GroupChangeChatUpdate.Update.groupInvitationRevokedUpdate:type_name -> signal.backup.GroupInvitationRevokedUpdate + 94, // 162: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestUpdate:type_name -> signal.backup.GroupJoinRequestUpdate + 95, // 163: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestApprovalUpdate:type_name -> signal.backup.GroupJoinRequestApprovalUpdate + 96, // 164: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestCanceledUpdate:type_name -> signal.backup.GroupJoinRequestCanceledUpdate + 98, // 165: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkResetUpdate:type_name -> signal.backup.GroupInviteLinkResetUpdate + 99, // 166: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkEnabledUpdate:type_name -> signal.backup.GroupInviteLinkEnabledUpdate + 100, // 167: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkAdminApprovalUpdate:type_name -> signal.backup.GroupInviteLinkAdminApprovalUpdate + 101, // 168: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkDisabledUpdate:type_name -> signal.backup.GroupInviteLinkDisabledUpdate + 102, // 169: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedByLinkUpdate:type_name -> signal.backup.GroupMemberJoinedByLinkUpdate + 103, // 170: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationUpdate:type_name -> signal.backup.GroupV2MigrationUpdate + 104, // 171: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationSelfInvitedUpdate:type_name -> signal.backup.GroupV2MigrationSelfInvitedUpdate + 105, // 172: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationInvitedMembersUpdate:type_name -> signal.backup.GroupV2MigrationInvitedMembersUpdate + 106, // 173: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationDroppedMembersUpdate:type_name -> signal.backup.GroupV2MigrationDroppedMembersUpdate + 97, // 174: signal.backup.GroupChangeChatUpdate.Update.groupSequenceOfRequestsAndCancelsUpdate:type_name -> signal.backup.GroupSequenceOfRequestsAndCancelsUpdate + 107, // 175: signal.backup.GroupChangeChatUpdate.Update.groupExpirationTimerUpdate:type_name -> signal.backup.GroupExpirationTimerUpdate + 152, // 176: signal.backup.ChatStyle.CustomChatColor.gradient:type_name -> signal.backup.ChatStyle.Gradient + 177, // [177:177] is the sub-list for method output_type + 177, // [177:177] is the sub-list for method input_type + 177, // [177:177] is the sub-list for extension type_name + 177, // [177:177] is the sub-list for extension extendee + 0, // [0:177] is the sub-list for field type_name } func init() { file_backuppb_Backup_proto_init() } @@ -12572,6 +12858,7 @@ func file_backuppb_Backup_proto_init() { (*ChatItem_GiftBadge)(nil), (*ChatItem_ViewOnceMessage)(nil), (*ChatItem_DirectStoryReplyMessage)(nil), + (*ChatItem_Poll)(nil), } file_backuppb_Backup_proto_msgTypes[14].OneofWrappers = []any{ (*SendStatus_Pending_)(nil), @@ -12598,7 +12885,7 @@ func file_backuppb_Backup_proto_init() { (*BodyRange_MentionAci)(nil), (*BodyRange_Style_)(nil), } - file_backuppb_Backup_proto_msgTypes[32].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[33].OneofWrappers = []any{ (*ChatUpdateMessage_SimpleUpdate)(nil), (*ChatUpdateMessage_GroupChange)(nil), (*ChatUpdateMessage_ExpirationTimerChange)(nil), @@ -12608,14 +12895,14 @@ func file_backuppb_Backup_proto_init() { (*ChatUpdateMessage_IndividualCall)(nil), (*ChatUpdateMessage_GroupCall)(nil), (*ChatUpdateMessage_LearnedProfileChange)(nil), + (*ChatUpdateMessage_PollTerminate)(nil), } - file_backuppb_Backup_proto_msgTypes[33].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[34].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[38].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[35].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[39].OneofWrappers = []any{ (*LearnedProfileChatUpdate_E164)(nil), (*LearnedProfileChatUpdate_Username)(nil), } - file_backuppb_Backup_proto_msgTypes[42].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[43].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[44].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[45].OneofWrappers = []any{} @@ -12624,51 +12911,52 @@ func file_backuppb_Backup_proto_init() { file_backuppb_Backup_proto_msgTypes[48].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[49].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[50].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[52].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[51].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[53].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[55].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[54].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[56].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[57].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[59].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[58].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[60].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[61].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[63].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[66].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[62].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[64].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[67].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[68].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[69].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[75].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[77].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[70].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[76].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[79].OneofWrappers = []any{ (*ChatStyle_WallpaperPreset_)(nil), (*ChatStyle_WallpaperPhoto)(nil), (*ChatStyle_AutoBubbleColor)(nil), (*ChatStyle_BubbleColorPreset_)(nil), (*ChatStyle_CustomColorId)(nil), } - file_backuppb_Backup_proto_msgTypes[78].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[81].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[83].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[80].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[83].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[85].OneofWrappers = []any{ (*AccountData_IAPSubscriberData_PurchaseToken)(nil), (*AccountData_IAPSubscriberData_OriginalTransactionId)(nil), } - file_backuppb_Backup_proto_msgTypes[88].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[90].OneofWrappers = []any{ (*Group_GroupAttributeBlob_Title)(nil), (*Group_GroupAttributeBlob_Avatar)(nil), (*Group_GroupAttributeBlob_DisappearingMessagesDuration)(nil), (*Group_GroupAttributeBlob_DescriptionText)(nil), } - file_backuppb_Backup_proto_msgTypes[94].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[105].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[96].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[107].OneofWrappers = []any{ (*PaymentNotification_TransactionDetails_Transaction_)(nil), (*PaymentNotification_TransactionDetails_FailedTransaction_)(nil), } - file_backuppb_Backup_proto_msgTypes[108].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[113].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[110].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[115].OneofWrappers = []any{ (*FilePointer_LocatorInfo_PlaintextHash)(nil), (*FilePointer_LocatorInfo_EncryptedDigest)(nil), } - file_backuppb_Backup_proto_msgTypes[114].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[115].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[116].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[119].OneofWrappers = []any{ (*GroupChangeChatUpdate_Update_GenericGroupUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupCreationUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupNameUpdate)(nil), @@ -12704,8 +12992,8 @@ func file_backuppb_Backup_proto_init() { (*GroupChangeChatUpdate_Update_GroupSequenceOfRequestsAndCancelsUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupExpirationTimerUpdate)(nil), } - file_backuppb_Backup_proto_msgTypes[116].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[118].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[120].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[122].OneofWrappers = []any{ (*ChatStyle_CustomChatColor_Solid)(nil), (*ChatStyle_CustomChatColor_Gradient)(nil), } @@ -12715,7 +13003,7 @@ func file_backuppb_Backup_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_backuppb_Backup_proto_rawDesc), len(file_backuppb_Backup_proto_rawDesc)), NumEnums: 31, - NumMessages: 120, + NumMessages: 124, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/signalmeow/protobuf/backuppb/Backup.proto b/pkg/signalmeow/protobuf/backuppb/Backup.proto index 464301d..66125fc 100644 --- a/pkg/signalmeow/protobuf/backuppb/Backup.proto +++ b/pkg/signalmeow/protobuf/backuppb/Backup.proto @@ -428,6 +428,7 @@ message ChatItem { GiftBadge giftBadge = 17; ViewOnceMessage viewOnceMessage = 18; DirectStoryReplyMessage directStoryReplyMessage = 19; // group story reply messages are not backed up + Poll poll = 20; } } @@ -759,6 +760,7 @@ message Quote { NORMAL = 1; GIFT_BADGE = 2; VIEW_ONCE = 3; + POLL = 4; } message QuotedAttachment { @@ -805,6 +807,25 @@ message Reaction { uint64 sortOrder = 4; } +message Poll { + + message PollOption { + + message PollVote { + uint64 voterId = 1; // A direct reference to Recipient proto id. Must be self or contact. + uint32 voteCount = 2; // Tracks how many times you voted. + } + + string option = 1; // Between 1-100 characters + repeated PollVote votes = 2; + } + + string question = 1; // Between 1-100 characters + bool allowMultiple = 2; + repeated PollOption options = 3; // At least two + bool hasEnded = 4; +} + message ChatUpdateMessage { // If unset, importers should ignore the update message without throwing an error. oneof update { @@ -817,6 +838,7 @@ message ChatUpdateMessage { IndividualCall individualCall = 7; GroupCall groupCall = 8; LearnedProfileChatUpdate learnedProfileChange = 9; + PollTerminateUpdate pollTerminate = 10; } } @@ -1182,6 +1204,11 @@ message GroupExpirationTimerUpdate { optional bytes updaterAci = 2; } +message PollTerminateUpdate { + uint64 targetSentTimestamp = 1; + string question = 2; // Between 1-100 characters +} + message StickerPack { bytes packId = 1; bytes packKey = 2; diff --git a/pkg/signalmeow/protobuf/update-protos.sh b/pkg/signalmeow/protobuf/update-protos.sh index bcdd71b..d8fea17 100755 --- a/pkg/signalmeow/protobuf/update-protos.sh +++ b/pkg/signalmeow/protobuf/update-protos.sh @@ -1,8 +1,8 @@ #!/bin/bash set -euo pipefail -ANDROID_GIT_REVISION=${1:-62fdf3d1aa9f637729ae67b55aadcc24f38f0117} -DESKTOP_GIT_REVISION=${1:-203a1cc5e3f9c1533a58caff72e13aa6eaeeddc7} +ANDROID_GIT_REVISION=${1:-d261f3ebf51864da067b968ee3366ed3e7369c78} +DESKTOP_GIT_REVISION=${1:-fb566c48e0fa146dfe0bea077ecdb3ff846ef80a} update_proto() { case "$1" in @@ -38,6 +38,7 @@ update_proto Signal-Android-App Backup.proto mv Backup.proto backuppb/Backup.proto update_proto Signal-Desktop DeviceName.proto -update_proto Signal-Desktop UnidentifiedDelivery.proto +# TODO this was moved to libsignal only +#update_proto Signal-Desktop UnidentifiedDelivery.proto # Android has CDSI.proto too, but the types have more generic names (since android uses a different package name) update_proto Signal-Desktop ContactDiscovery.proto From c9303dcd6dd89353d9b98fb31bf7a6491edc56c5 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 29 Oct 2025 14:36:15 +0200 Subject: [PATCH 030/170] msgconv/from-signal: add support for polls --- ROADMAP.md | 6 +- pkg/connector/backfill.go | 2 +- pkg/connector/config.go | 2 + pkg/connector/connector.go | 1 + pkg/connector/example-config.yaml | 2 + pkg/connector/handlesignal.go | 4 +- pkg/msgconv/from-signal-backup.go | 10 +++ pkg/msgconv/from-signal.go | 139 +++++++++++++++++++++++++++++- pkg/msgconv/msgconv.go | 1 + pkg/signalid/dbmeta.go | 3 +- 10 files changed, 163 insertions(+), 7 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 1695ea0..7f6db0d 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -5,6 +5,7 @@ * [x] Text * [x] Formatting * [x] Mentions + * [ ] Polls * [x] Media * [x] Images * [x] Audio files @@ -34,6 +35,7 @@ * [x] Text * [x] Formatting * [x] Mentions + * [x] Polls * [ ] Media * [x] Images * [x] Voice notes @@ -65,8 +67,8 @@ * [ ] Delivery receipts (there's no good way to bridge these) * [x] Disappearing messages * Misc - * [ ] Automatic portal creation - * [ ] After login + * [x] Automatic portal creation + * [x] After login * [x] When receiving message * [x] Linking as secondary device * [ ] Registering as primary device diff --git a/pkg/connector/backfill.go b/pkg/connector/backfill.go index 2dde03f..3f9a611 100644 --- a/pkg/connector/backfill.go +++ b/pkg/connector/backfill.go @@ -151,7 +151,7 @@ func (s *SignalClient) FetchMessages(ctx context.Context, params bridgev2.FetchM if dm == nil { continue } - cm := s.Main.MsgConv.ToMatrix(ctx, s.Client, params.Portal, s.Main.Bridge.Bot, dm, attMap) + cm := s.Main.MsgConv.ToMatrix(ctx, s.Client, params.Portal, senderACI, s.Main.Bridge.Bot, dm, attMap) convertedReactions := make([]*bridgev2.BackfillReaction, 0, len(reactions)) for _, reaction := range reactions { reactionSenderACI, err := getRecipientACI(reaction.AuthorId) diff --git a/pkg/connector/config.go b/pkg/connector/config.go index 4e42186..232571f 100644 --- a/pkg/connector/config.go +++ b/pkg/connector/config.go @@ -42,6 +42,7 @@ type SignalConfig struct { NoteToSelfAvatar id.ContentURIString `yaml:"note_to_self_avatar"` LocationFormat string `yaml:"location_format"` DisappearViewOnce bool `yaml:"disappear_view_once"` + ExtEvPolls bool `yaml:"extev_polls"` displaynameTemplate *template.Template `yaml:"-"` } @@ -103,6 +104,7 @@ func upgradeConfig(helper up.Helper) { helper.Copy(up.Str, "note_to_self_avatar") helper.Copy(up.Str, "location_format") helper.Copy(up.Bool, "disappear_view_once") + helper.Copy(up.Bool, "extev_polls") } func (s *SignalConnector) GetConfig() (string, any, up.Upgrader) { diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go index e81ef7a..30be4a4 100644 --- a/pkg/connector/connector.go +++ b/pkg/connector/connector.go @@ -63,6 +63,7 @@ func (s *SignalConnector) Init(bridge *bridgev2.Bridge) { s.MsgConv = msgconv.NewMessageConverter(bridge) s.MsgConv.LocationFormat = s.Config.LocationFormat s.MsgConv.DisappearViewOnce = s.Config.DisappearViewOnce + s.MsgConv.ExtEvPolls = s.Config.ExtEvPolls } func (s *SignalConnector) SetMaxFileSize(maxSize int64) { diff --git a/pkg/connector/example-config.yaml b/pkg/connector/example-config.yaml index e9ff6b4..25fe035 100644 --- a/pkg/connector/example-config.yaml +++ b/pkg/connector/example-config.yaml @@ -24,3 +24,5 @@ note_to_self_avatar: mxc://maunium.net/REBIVrqjZwmaWpssCZpBlmlL location_format: 'https://www.google.com/maps/place/%[1]s,%[2]s' # Should view-once messages disappear shortly after sending a read receipt on Matrix? disappear_view_once: false +# Should polls be sent using unstable MSC3381 event types? +extev_polls: false diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index d60acc0..6a2f3b5 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -327,7 +327,7 @@ func (evt *Bv2ChatEvent) ConvertMessage(ctx context.Context, portal *bridgev2.Po if !ok { return nil, fmt.Errorf("ConvertMessage() called for non-DataMessage event") } - converted := evt.s.Main.MsgConv.ToMatrix(ctx, evt.s.Client, portal, intent, dataMsg, nil) + converted := evt.s.Main.MsgConv.ToMatrix(ctx, evt.s.Client, portal, evt.Info.Sender, intent, dataMsg, nil) if converted.Disappear.Type != "" { evtTS := evt.GetTimestamp() if !dataMsg.GetIsViewOnce() { @@ -352,7 +352,7 @@ func (evt *Bv2ChatEvent) ConvertEdit(ctx context.Context, portal *bridgev2.Porta return nil, fmt.Errorf("ConvertEdit() called for non-EditMessage event") } // TODO tell converter about existing parts to avoid reupload? - converted := evt.s.Main.MsgConv.ToMatrix(ctx, evt.s.Client, portal, intent, editMsg.GetDataMessage(), nil) + converted := evt.s.Main.MsgConv.ToMatrix(ctx, evt.s.Client, portal, evt.Info.Sender, intent, editMsg.GetDataMessage(), nil) // TODO can anything other than the text be edited? editPart := converted.Parts[len(converted.Parts)-1].ToEditPart(existing[len(existing)-1]) editPart.Part.EditCount++ diff --git a/pkg/msgconv/from-signal-backup.go b/pkg/msgconv/from-signal-backup.go index 7e8d4e1..97f756c 100644 --- a/pkg/msgconv/from-signal-backup.go +++ b/pkg/msgconv/from-signal-backup.go @@ -81,6 +81,16 @@ func BackupToDataMessage(ci *backuppb.ChatItem, attMap AttachmentMap) (*signalpb Emoji: ti.StickerMessage.Sticker.Emoji, Data: backupToSignalAttachment(ti.StickerMessage.Sticker.Data, 0, uuid.New(), attMap), } + case *backuppb.ChatItem_Poll: + dm.PollCreate = &signalpb.DataMessage_PollCreate{ + Question: &ti.Poll.Question, + AllowMultiple: &ti.Poll.AllowMultiple, + Options: exslices.CastFunc(ti.Poll.Options, func(from *backuppb.Poll_PollOption) string { + return from.Option + }), + } + // TODO handle votes + // TODO handle hasEnded somehow? case *backuppb.ChatItem_RemoteDeletedMessage: // TODO handle some other way? (also disappeared view-once messages) return nil, nil diff --git a/pkg/msgconv/from-signal.go b/pkg/msgconv/from-signal.go index ac3fe65..9392616 100644 --- a/pkg/msgconv/from-signal.go +++ b/pkg/msgconv/from-signal.go @@ -23,6 +23,7 @@ import ( "errors" "fmt" "net/http" + "strconv" "strings" "time" @@ -51,7 +52,7 @@ func calculateLength(dm *signalpb.DataMessage) int { if dm.GetFlags()&uint32(signalpb.DataMessage_EXPIRATION_TIMER_UPDATE) != 0 { return 1 } - if dm.Sticker != nil { + if dm.Sticker != nil || dm.PollVote != nil || dm.PollCreate != nil || dm.PollTerminate != nil { return 1 } length := len(dm.Attachments) + len(dm.Contact) @@ -80,6 +81,7 @@ func (mc *MessageConverter) ToMatrix( ctx context.Context, client *signalmeow.Client, portal *bridgev2.Portal, + sender uuid.UUID, intent bridgev2.MatrixAPI, dm *signalpb.DataMessage, attMap AttachmentMap, @@ -108,6 +110,18 @@ func (mc *MessageConverter) ToMatrix( // Don't allow any other parts in a sticker message return cm } + if dm.PollVote != nil { + cm.Parts = append(cm.Parts, mc.convertPollVoteToMatrix(ctx, dm.PollVote)) + return cm + } + if dm.PollCreate != nil { + cm.Parts = append(cm.Parts, mc.convertPollCreateToMatrix(dm.PollCreate)) + return cm + } + if dm.PollTerminate != nil { + cm.Parts = append(cm.Parts, mc.convertPollTerminateToMatrix(ctx, sender, dm.PollTerminate)) + return cm + } for i, att := range dm.GetAttachments() { if att.GetContentType() != "text/x-signal-plain" { cm.Parts = append(cm.Parts, mc.convertAttachmentToMatrix(ctx, i, att, attMap)) @@ -602,3 +616,126 @@ func (mc *MessageConverter) reuploadAttachment(ctx context.Context, att *signalp Extra: extra, }, nil } + +func (mc *MessageConverter) convertPollCreateToMatrix(create *signalpb.DataMessage_PollCreate) *bridgev2.ConvertedMessagePart { + evtType := event.EventMessage + if mc.ExtEvPolls { + evtType = event.EventUnstablePollStart + } + maxChoices := 1 + if create.GetAllowMultiple() { + maxChoices = len(create.GetOptions()) + } + msc3381Answers := make([]map[string]any, len(create.GetOptions())) + optionsListText := make([]string, len(create.GetOptions())) + optionsListHTML := make([]string, len(create.GetOptions())) + for i, option := range create.GetOptions() { + msc3381Answers[i] = map[string]any{ + "id": strconv.Itoa(i), + "org.matrix.msc1767.text": option, + } + optionsListText[i] = fmt.Sprintf("%d. %s\n", i+1, option) + optionsListHTML[i] = fmt.Sprintf("
  • %s
  • ", event.TextToHTML(option)) + } + body := fmt.Sprintf("%s\n\n%s\n\n(This message is a poll. Please open Signal to vote.)", create.GetQuestion(), strings.Join(optionsListText, "\n")) + formattedBody := fmt.Sprintf("

    %s

      %s

    (This message is a poll. Please open Signal to vote.)

    ", event.TextToHTML(create.GetQuestion()), strings.Join(optionsListHTML, "")) + return &bridgev2.ConvertedMessagePart{ + Type: evtType, + Content: &event.MessageEventContent{ + MsgType: event.MsgText, + Body: body, + Format: event.FormatHTML, + FormattedBody: formattedBody, + }, + Extra: map[string]any{ + "fi.mau.signal.poll": map[string]any{ + "question": create.GetQuestion(), + "allow_multiple": create.GetAllowMultiple(), + "options": create.GetOptions(), + }, + "org.matrix.msc1767.message": []map[string]any{ + {"mimetype": "text/html", "body": formattedBody}, + {"mimetype": "text/plain", "body": body}, + }, + "org.matrix.msc3381.poll.start": map[string]any{ + "kind": "org.matrix.msc3381.poll.disclosed", + "max_selections": maxChoices, + "question": map[string]any{ + "org.matrix.msc1767.text": create.GetQuestion(), + }, + "answers": msc3381Answers, + }, + }, + DBMetadata: nil, + DontBridge: false, + } +} + +func (mc *MessageConverter) convertPollTerminateToMatrix(ctx context.Context, senderACI uuid.UUID, terminate *signalpb.DataMessage_PollTerminate) *bridgev2.ConvertedMessagePart { + pollMessageID := signalid.MakeMessageID(senderACI, terminate.GetTargetSentTimestamp()) + pollMessage, err := mc.Bridge.DB.Message.GetPartByID(ctx, getPortal(ctx).Receiver, pollMessageID, "") + if err != nil { + zerolog.Ctx(ctx).Err(err).Msg("Failed to get poll terminate target message") + return &bridgev2.ConvertedMessagePart{ + Type: event.EventUnstablePollEnd, + Content: &event.MessageEventContent{}, + DontBridge: true, + } + } + return &bridgev2.ConvertedMessagePart{ + Type: event.EventUnstablePollEnd, + Content: &event.MessageEventContent{ + RelatesTo: &event.RelatesTo{ + Type: event.RelReference, + EventID: pollMessage.MXID, + }, + }, + Extra: map[string]any{ + "org.matrix.msc3381.poll.end": map[string]any{}, + }, + } +} + +var invalidPollVote = &bridgev2.ConvertedMessagePart{ + Type: event.EventUnstablePollResponse, + Content: &event.MessageEventContent{}, + DontBridge: true, +} + +func (mc *MessageConverter) convertPollVoteToMatrix(ctx context.Context, vote *signalpb.DataMessage_PollVote) *bridgev2.ConvertedMessagePart { + if len(vote.GetTargetAuthorAciBinary()) != 16 { + zerolog.Ctx(ctx).Debug(). + Str("author_aci_b64", base64.StdEncoding.EncodeToString(vote.GetTargetAuthorAciBinary())). + Msg("Invalid author ACI in poll vote") + return invalidPollVote + } + pollMessageID := signalid.MakeMessageID(uuid.UUID(vote.GetTargetAuthorAciBinary()), vote.GetTargetSentTimestamp()) + pollMessage, err := mc.Bridge.DB.Message.GetPartByID(ctx, getPortal(ctx).Receiver, pollMessageID, "") + if err != nil { + zerolog.Ctx(ctx).Err(err).Msg("Failed to get poll vote target message") + return invalidPollVote + } + mxOptionIDs := pollMessage.Metadata.(*signalid.MessageMetadata).MatrixPollOptionIDs + optionIDs := make([]string, len(vote.GetOptionIndexes())) + for i, optionIndex := range vote.GetOptionIndexes() { + if int(optionIndex) < len(mxOptionIDs) { + optionIDs[i] = mxOptionIDs[optionIndex] + } else { + optionIDs[i] = strconv.Itoa(int(optionIndex)) + } + } + return &bridgev2.ConvertedMessagePart{ + Type: event.EventUnstablePollResponse, + Content: &event.MessageEventContent{ + RelatesTo: &event.RelatesTo{ + Type: event.RelReference, + EventID: pollMessage.MXID, + }, + }, + Extra: map[string]any{ + "org.matrix.msc3381.poll.response": map[string]any{ + "answers": optionIDs, + }, + }, + } +} diff --git a/pkg/msgconv/msgconv.go b/pkg/msgconv/msgconv.go index 86e7e2d..1b8564a 100644 --- a/pkg/msgconv/msgconv.go +++ b/pkg/msgconv/msgconv.go @@ -48,6 +48,7 @@ type MessageConverter struct { LocationFormat string DisappearViewOnce bool DirectMedia bool + ExtEvPolls bool } func NewMessageConverter(br *bridgev2.Bridge) *MessageConverter { diff --git a/pkg/signalid/dbmeta.go b/pkg/signalid/dbmeta.go index 72112a8..bbbcc92 100644 --- a/pkg/signalid/dbmeta.go +++ b/pkg/signalid/dbmeta.go @@ -28,7 +28,8 @@ type PortalMetadata struct { } type MessageMetadata struct { - ContainsAttachments bool `json:"contains_attachments,omitempty"` + ContainsAttachments bool `json:"contains_attachments,omitempty"` + MatrixPollOptionIDs []string `json:"matrix_poll_option_ids,omitempty"` } type UserLoginMetadata struct { From 71e2e221f79e359bcffc48b6d90ba0f3e73cceb2 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 29 Oct 2025 14:50:26 +0200 Subject: [PATCH 031/170] handlematrix: add support for polls --- ROADMAP.md | 2 +- pkg/connector/handlematrix.go | 74 +++++++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 7f6db0d..228b271 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -5,7 +5,7 @@ * [x] Text * [x] Formatting * [x] Mentions - * [ ] Polls + * [x] Polls * [x] Media * [x] Images * [x] Audio files diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 65e7b7c..3aa266b 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -21,6 +21,7 @@ import ( "crypto/sha256" "errors" "fmt" + "slices" "strconv" "time" @@ -52,6 +53,7 @@ var ( _ bridgev2.RoomTopicHandlingNetworkAPI = (*SignalClient)(nil) _ bridgev2.ChatViewingNetworkAPI = (*SignalClient)(nil) _ bridgev2.DisappearTimerChangingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.PollHandlingNetworkAPI = (*SignalClient)(nil) ) func (s *SignalClient) sendMessage(ctx context.Context, portalID networkid.PortalID, content *signalpb.Content) error { @@ -116,9 +118,27 @@ func (s *SignalClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2.Ma if err != nil { return nil, err } + return s.doSendMessage(ctx, ts, msg, converted, &signalid.MessageMetadata{ + ContainsAttachments: len(converted.Attachments) > 0, + }) +} + +func (s *SignalClient) doSendMessage( + ctx context.Context, + ts uint64, + msg *bridgev2.MatrixMessage, + converted *signalpb.DataMessage, + meta *signalid.MessageMetadata, +) (*bridgev2.MatrixMessageResponse, error) { + if ts == 0 { + ts = getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) + } + if meta == nil { + meta = &signalid.MessageMetadata{} + } msgID := signalid.MakeMessageID(s.Client.Store.ACI, ts) msg.AddPendingToIgnore(networkid.TransactionID(msgID)) - err = s.sendMessage(ctx, msg.Portal.ID, &signalpb.Content{DataMessage: converted}) + err := s.sendMessage(ctx, msg.Portal.ID, &signalpb.Content{DataMessage: converted}) if err != nil { return nil, bridgev2.WrapErrorInStatus(err).WithSendNotice(true) } @@ -126,9 +146,7 @@ func (s *SignalClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2.Ma ID: msgID, SenderID: signalid.MakeUserID(s.Client.Store.ACI), Timestamp: time.UnixMilli(int64(ts)), - Metadata: &signalid.MessageMetadata{ - ContainsAttachments: len(converted.Attachments) > 0, - }, + Metadata: meta, } return &bridgev2.MatrixMessageResponse{ DB: dbMsg, @@ -679,3 +697,51 @@ func (s *SignalClient) HandleMatrixDisappearingTimer(ctx context.Context, msg *b return true, nil } } + +func (s *SignalClient) HandleMatrixPollStart(ctx context.Context, msg *bridgev2.MatrixPollStart) (*bridgev2.MatrixMessageResponse, error) { + optionNames := make([]string, len(msg.Content.PollStart.Answers)) + optionIDs := make([]string, len(msg.Content.PollStart.Answers)) + for i, option := range msg.Content.PollStart.Answers { + optionNames[i] = option.Text + optionIDs[i] = option.ID + } + converted := &signalpb.DataMessage{ + PollCreate: &signalpb.DataMessage_PollCreate{ + Question: ptr.Ptr(msg.Content.PollStart.Question.Text), + AllowMultiple: ptr.Ptr(msg.Content.PollStart.MaxSelections != 1), + Options: optionNames, + }, + RequiredProtocolVersion: ptr.Ptr(uint32(signalpb.DataMessage_POLLS)), + } + return s.doSendMessage(ctx, 0, &msg.MatrixMessage, converted, &signalid.MessageMetadata{ + MatrixPollOptionIDs: optionIDs, + }) +} + +func (s *SignalClient) HandleMatrixPollVote(ctx context.Context, msg *bridgev2.MatrixPollVote) (*bridgev2.MatrixMessageResponse, error) { + senderACI, msgTS, err := signalid.ParseMessageID(msg.VoteTo.ID) + if err != nil { + return nil, err + } + mxOptions := msg.VoteTo.Metadata.(*signalid.MessageMetadata).MatrixPollOptionIDs + optionIndexes := make([]uint32, len(msg.Content.Response.Answers)) + for i, answer := range msg.Content.Response.Answers { + if idx := slices.Index(mxOptions, answer); idx >= 0 { + optionIndexes[i] = uint32(idx) + } else if idx, err = strconv.Atoi(answer); err == nil && idx >= 0 { + optionIndexes[i] = uint32(idx) + } else { + return nil, fmt.Errorf("unknown poll answer ID: %s", answer) + } + } + converted := &signalpb.DataMessage{ + PollVote: &signalpb.DataMessage_PollVote{ + TargetAuthorAciBinary: senderACI[:], + TargetSentTimestamp: &msgTS, + OptionIndexes: optionIndexes, + VoteCount: nil, // TODO + }, + RequiredProtocolVersion: ptr.Ptr(uint32(signalpb.DataMessage_POLLS)), + } + return s.doSendMessage(ctx, 0, &msg.MatrixMessage, converted, nil) +} From e3d058732adc0325674991dabf2fc65883a39024 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 30 Oct 2025 22:35:49 +0200 Subject: [PATCH 032/170] libsignal: update to v0.85.2 --- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 88 +++++++++++++++++++++++++++++++++ pkg/libsignalgo/version.go | 2 +- 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index c02859f..57f2254 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit c02859f57552477680fb7928c3c3426193040313 +Subproject commit 57f2254605086b0bf0c7d274ed8eaa6fafa84ee2 diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index a516a23..157f642 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -255,6 +255,8 @@ typedef enum { SignalErrorCodeRegistrationLock = 201, SignalErrorCodeKeyTransparencyError = 210, SignalErrorCodeKeyTransparencyVerificationFailed = 211, + SignalErrorCodeRequestUnauthorized = 220, + SignalErrorCodeMismatchedDevices = 221, } SignalErrorCode; enum SignalSvr2CredentialsResult { @@ -897,6 +899,35 @@ typedef struct { uint32_t second; } SignalPairOfc_charu32; +/** + * A representation of a array allocated on the Rust heap for use in C code. + */ +typedef struct { + uint32_t *base; + /** + * The number of elements in the buffer (not necessarily the number of bytes). + */ + size_t length; +} SignalOwnedBufferOfu32; + +typedef struct { + SignalServiceIdFixedWidthBinaryBytes account; + SignalOwnedBufferOfu32 missing_devices; + SignalOwnedBufferOfu32 extra_devices; + SignalOwnedBufferOfu32 stale_devices; +} SignalFfiMismatchedDevicesError; + +/** + * A representation of a array allocated on the Rust heap for use in C code. + */ +typedef struct { + SignalFfiMismatchedDevicesError *base; + /** + * The number of elements in the buffer (not necessarily the number of bytes). + */ + size_t length; +} SignalOwnedBufferOfFfiMismatchedDevicesError; + typedef struct { const char *first; SignalOwnedBuffer second; @@ -941,6 +972,17 @@ typedef struct { size_t length; } SignalOwnedBufferOfFfiRegisterResponseBadge; +/** + * A representation of a array allocated on the Rust heap for use in C code. + */ +typedef struct { + SignalServiceIdFixedWidthBinaryBytes *base; + /** + * The number of elements in the buffer (not necessarily the number of bytes). + */ + size_t length; +} SignalOwnedBufferOfServiceIdFixedWidthBinaryBytes; + typedef struct { SignalSenderKeyRecord *raw; } SignalMutPointerSenderKeyRecord; @@ -1418,6 +1460,42 @@ typedef struct { SignalCancellationId cancellation_id; } SignalCPromiseOptionalUuid; +typedef struct { + bool present; + const char *first; + uint8_t second[32]; +} SignalOptionalPairOfc_charu832; + +/** + * A C callback used to report the results of Rust futures. + * + * cbindgen will produce independent C types like `SignalCPromisei32` and + * `SignalCPromiseProtocolAddress`. + * + * This derives Copy because it behaves like a C type; nevertheless, a promise should still only be + * completed once. + */ +typedef struct { + void (*complete)(SignalFfiError *error, const SignalOptionalPairOfc_charu832 *result, const void *context); + const void *context; + SignalCancellationId cancellation_id; +} SignalCPromiseOptionalPairOfc_charu832; + +/** + * A C callback used to report the results of Rust futures. + * + * cbindgen will produce independent C types like `SignalCPromisei32` and + * `SignalCPromiseProtocolAddress`. + * + * This derives Copy because it behaves like a C type; nevertheless, a promise should still only be + * completed once. + */ +typedef struct { + void (*complete)(SignalFfiError *error, const SignalOwnedBufferOfServiceIdFixedWidthBinaryBytes *result, const void *context); + const void *context; + SignalCancellationId cancellation_id; +} SignalCPromiseOwnedBufferOfServiceIdFixedWidthBinaryBytes; + typedef struct { SignalValidatingMac *raw; } SignalMutPointerValidatingMac; @@ -1704,6 +1782,8 @@ SignalFfiError *signal_error_get_invalid_protocol_address(SignalPairOfc_charu32 SignalFfiError *signal_error_get_message(const char **out, SignalUnwindSafeArgSignalFfiError err); +SignalFfiError *signal_error_get_mismatched_device_errors(SignalOwnedBufferOfFfiMismatchedDevicesError *out, SignalUnwindSafeArgSignalFfiError err); + SignalFfiError *signal_error_get_our_fingerprint_version(uint32_t *out, SignalUnwindSafeArgSignalFfiError err); SignalFfiError *signal_error_get_rate_limit_challenge(SignalPairOfc_charOwnedBufferOfc_uchar *out, SignalUnwindSafeArgSignalFfiError err); @@ -1746,8 +1826,12 @@ void signal_free_buffer(const unsigned char *buf, size_t buf_len); void signal_free_bytestring_array(SignalBytestringArray array); +void signal_free_list_of_mismatched_device_errors(SignalOwnedBufferOfFfiMismatchedDevicesError buffer); + void signal_free_list_of_register_response_badges(SignalOwnedBufferOfFfiRegisterResponseBadge buffer); +void signal_free_list_of_service_ids(SignalOwnedBufferOfServiceIdFixedWidthBinaryBytes buffer); + void signal_free_list_of_strings(SignalOwnedBufferOfCStringPtr buffer); void signal_free_lookup_response_entry_list(SignalOwnedBufferOfFfiCdsiLookupResponseEntry buffer); @@ -2516,8 +2600,12 @@ SignalFfiError *signal_unauthenticated_chat_connection_init_listener(SignalConst SignalFfiError *signal_unauthenticated_chat_connection_look_up_username_hash(SignalCPromiseOptionalUuid *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer hash); +SignalFfiError *signal_unauthenticated_chat_connection_look_up_username_link(SignalCPromiseOptionalPairOfc_charu832 *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, const uint8_t (*uuid)[16], SignalBorrowedBuffer entropy); + SignalFfiError *signal_unauthenticated_chat_connection_send(SignalCPromiseFfiChatResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalConstPointerHttpRequest http_request, uint32_t timeout_millis); +SignalFfiError *signal_unauthenticated_chat_connection_send_multi_recipient_message(SignalCPromiseOwnedBufferOfServiceIdFixedWidthBinaryBytes *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer payload, uint64_t timestamp, SignalBorrowedBuffer auth, bool online_only, bool is_urgent); + SignalFfiError *signal_unidentified_sender_message_content_deserialize(SignalMutPointerUnidentifiedSenderMessageContent *out, SignalBorrowedBuffer data); SignalFfiError *signal_unidentified_sender_message_content_destroy(SignalMutPointerUnidentifiedSenderMessageContent p); diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index b859d49..b04d73b 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.84.0" +const Version = "v0.85.2" From f01415c61add68c6dca86ca04eb98118dc8f4c84 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 9 Nov 2025 11:41:52 +0200 Subject: [PATCH 033/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f61bdd1..464486c 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.46.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.3-0.20251028130646-bea28c1381cd + maunium.net/go/mautrix v0.25.3-0.20251109094010-14e16a3a8190 ) require ( diff --git a/go.sum b/go.sum index fa344cc..f89121c 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.3-0.20251028130646-bea28c1381cd h1:4OfgnwTd71vgHGc+kBwhWsb92ePZVvsDbyTLJiy+PKU= -maunium.net/go/mautrix v0.25.3-0.20251028130646-bea28c1381cd/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= +maunium.net/go/mautrix v0.25.3-0.20251109094010-14e16a3a8190 h1:5v25ZS99ilLXHjYX3uMiyHGBNhFPXgOgGfr9GkakRTg= +maunium.net/go/mautrix v0.25.3-0.20251109094010-14e16a3a8190/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= From 6987023492df81563d535ddc9ca73207a4059b9d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 11 Nov 2025 13:30:22 +0200 Subject: [PATCH 034/170] libsignal: update to v0.86.2 --- CHANGELOG.md | 4 ++++ pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 2 ++ pkg/libsignalgo/version.go | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e38aa4..858c3bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,12 @@ # v25.11 (unreleased) +* Updated libsignal to v0.86.2. * Added support for bridging invite state in groups for phone number invites. +* Added support for polls. * Fixed PNI signature not being sent when replying to message requests. * Fixed unnecessary repeating error notices when Signal is down. +* Fixed sticker size metadata on Matrix not matching how native Signal Desktop + renders them. # v25.10 diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index 57f2254..2dcd1e0 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit 57f2254605086b0bf0c7d274ed8eaa6fafa84ee2 +Subproject commit 2dcd1e0b793469013043d3a0d37dc55f95b0babd diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index 157f642..26cbb6b 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -1510,6 +1510,8 @@ typedef uint8_t SignalRandomnessBytes[SignalRANDOMNESS_LEN]; typedef uint8_t SignalUnidentifiedAccessKey[SignalACCESS_KEY_LEN]; + + SignalFfiError *signal_account_entropy_pool_derive_backup_key(uint8_t (*out)[SignalBACKUP_KEY_LEN], const char *account_entropy); SignalFfiError *signal_account_entropy_pool_derive_svr_key(uint8_t (*out)[SignalSVR_KEY_LEN], const char *account_entropy); diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index b04d73b..b202516 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.85.2" +const Version = "v0.86.2" From f4aa0847651cff4fe7d28ca9ec975133f7715bfc Mon Sep 17 00:00:00 2001 From: Conan Date: Sat, 15 Nov 2025 04:21:29 +0800 Subject: [PATCH 035/170] handlematrix: implement DeleteChatHandlingNetworkAPI (#616) Co-authored-by: Tulir Asokan --- pkg/connector/capabilities.go | 4 +- pkg/connector/handlematrix.go | 87 +++++++++++++++++++++++++++++++++++ pkg/signalmeow/sending.go | 2 + 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/pkg/connector/capabilities.go b/pkg/connector/capabilities.go index b9cb632..ca2975c 100644 --- a/pkg/connector/capabilities.go +++ b/pkg/connector/capabilities.go @@ -38,7 +38,7 @@ func supportedIfFFmpeg() event.CapabilitySupportLevel { } func capID() string { - base := "fi.mau.signal.capabilities.2025_10_27" + base := "fi.mau.signal.capabilities.2025_10_28" if ffmpeg.Supported() { return base + "+ffmpeg" } @@ -169,6 +169,8 @@ var signalCaps = &event.RoomFeatures{ CustomEmojiReactions: false, ReadReceipts: true, TypingNotifications: true, + + DeleteChat: true, } var signalDisappearingCap = &event.DisappearingTimerCapability{ diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 3aa266b..deb52e3 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -53,6 +53,7 @@ var ( _ bridgev2.RoomTopicHandlingNetworkAPI = (*SignalClient)(nil) _ bridgev2.ChatViewingNetworkAPI = (*SignalClient)(nil) _ bridgev2.DisappearTimerChangingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.DeleteChatHandlingNetworkAPI = (*SignalClient)(nil) _ bridgev2.PollHandlingNetworkAPI = (*SignalClient)(nil) ) @@ -698,6 +699,92 @@ func (s *SignalClient) HandleMatrixDisappearingTimer(ctx context.Context, msg *b } } +func (s *SignalClient) HandleMatrixDeleteChat(ctx context.Context, msg *bridgev2.MatrixDeleteChat) error { + userID, groupID, err := signalid.ParsePortalID(msg.Portal.ID) + if err != nil { + return fmt.Errorf("failed to parse portal ID: %w", err) + } + + // Build ConversationIdentifier based on portal type + var conversationID *signalpb.ConversationIdentifier + if groupID == "" { + conversationID = &signalpb.ConversationIdentifier{ + Identifier: &signalpb.ConversationIdentifier_ThreadServiceId{ + ThreadServiceId: userID.String(), + }, + } + } else { + gid, err := groupID.Bytes() + if err != nil { + return fmt.Errorf("failed to parse group ID: %w", err) + } + conversationID = &signalpb.ConversationIdentifier{ + Identifier: &signalpb.ConversationIdentifier_ThreadGroupId{ + ThreadGroupId: gid[:], + }, + } + } + + // Retrieve most recent messages from the portal + var mostRecentMessages []*signalpb.AddressableMessage + dbMessages, err := s.Main.Bridge.DB.Message.GetMessagesBetweenTimeQuery( + ctx, + msg.Portal.PortalKey, + time.Now().Add(-30*24*time.Hour), // Last 30 days + time.Now(), + ) + if err != nil { + zerolog.Ctx(ctx).Warn().Err(err).Msg("Failed to get recent messages for conversation delete") + } else if len(dbMessages) > 0 { + // Limit to the 5 most recent messages overall + limit := 5 + startIdx := 0 + if len(dbMessages) > limit { + startIdx = len(dbMessages) - limit + } + + // Create AddressableMessage for most recent messages + for _, dbMsg := range dbMessages[startIdx:] { + senderACI, timestamp, err := signalid.ParseMessageID(dbMsg.ID) + if err != nil { + continue + } + + mostRecentMessages = append(mostRecentMessages, &signalpb.AddressableMessage{ + Author: &signalpb.AddressableMessage_AuthorServiceId{ + AuthorServiceId: senderACI.String(), + }, + SentTimestamp: proto.Uint64(timestamp), + }) + } + } + + recipientID := s.Client.Store.ACIServiceID() + // Send DeleteForMe sync message to self + result := s.Client.SendMessage(ctx, recipientID, &signalpb.Content{ + SyncMessage: &signalpb.SyncMessage{ + DeleteForMe: &signalpb.SyncMessage_DeleteForMe{ + ConversationDeletes: []*signalpb.SyncMessage_DeleteForMe_ConversationDelete{{ + Conversation: conversationID, + MostRecentMessages: mostRecentMessages, + IsFullDelete: proto.Bool(true), + }}, + }, + }, + }) + + zerolog.Ctx(ctx).Debug(). + Str("portal_id", string(msg.Portal.ID)). + Int("recent_messages_count", len(mostRecentMessages)). + Msg("Sent conversation deletion to Signal") + + if !result.WasSuccessful { + return fmt.Errorf("failed to send delete conversation sync message: %w %s %s", result.Error, userID, groupID) + } + + return nil +} + func (s *SignalClient) HandleMatrixPollStart(ctx context.Context, msg *bridgev2.MatrixPollStart) (*bridgev2.MatrixMessageResponse, error) { optionNames := make([]string, len(msg.Content.PollStart.Answers)) optionIDs := make([]string, len(msg.Content.PollStart.Answers)) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index c1b2016..8bfc5a5 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -660,6 +660,8 @@ func (cli *Client) sendSyncCopy(ctx context.Context, content *signalpb.Content, syncContent = syncMessageFromSoloEditMessage(content.EditMessage, *result) } else if content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_READ { syncContent = syncMessageFromReadReceiptMessage(ctx, content.ReceiptMessage, result.Recipient) + } else if content.GetSyncMessage() != nil { + syncContent = content } if syncContent != nil { _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTS, syncContent, 0, true, false) From 12808bbe8a3ecb2d274436a8c198778162f71d4b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 15 Nov 2025 18:40:57 +0200 Subject: [PATCH 036/170] libsignal: update to v0.86.4 --- CHANGELOG.md | 2 +- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/version.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 858c3bc..a3a256c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # v25.11 (unreleased) -* Updated libsignal to v0.86.2. +* Updated libsignal to v0.86.4. * Added support for bridging invite state in groups for phone number invites. * Added support for polls. * Fixed PNI signature not being sent when replying to message requests. diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index 2dcd1e0..5a64e17 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit 2dcd1e0b793469013043d3a0d37dc55f95b0babd +Subproject commit 5a64e17ed4450eaf5fe29bfa611c9838736ac1a6 diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index b202516..dbb024d 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.86.2" +const Version = "v0.86.4" From 74d9ebb371d9d5b48458f967e7fade4589f8e905 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 15 Nov 2025 18:59:21 +0200 Subject: [PATCH 037/170] signalmeow/attachments: update group avatar upload url --- pkg/signalmeow/attachments.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/attachments.go b/pkg/signalmeow/attachments.go index ea03c21..67a55c8 100644 --- a/pkg/signalmeow/attachments.go +++ b/pkg/signalmeow/attachments.go @@ -305,7 +305,7 @@ func (cli *Client) UploadGroupAvatar(ctx context.Context, avatarBytes []byte, gi } // Get upload form from Signal server - formPath := "/v1/groups/avatar/form" + formPath := "/v2/groups/avatar/form" opts := &web.HTTPReqOpt{Username: &groupAuth.Username, Password: &groupAuth.Password, ContentType: web.ContentTypeProtobuf, Host: web.StorageHostname} resp, err := web.SendHTTPRequest(ctx, http.MethodGet, formPath, opts) if err != nil { From a3cab68309d741214c876eee0962ad2756a09604 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 16 Nov 2025 13:43:08 +0200 Subject: [PATCH 038/170] Bump version to v25.11 --- CHANGELOG.md | 2 +- cmd/mautrix-signal/main.go | 2 +- go.mod | 18 +++++++++--------- go.sum | 32 ++++++++++++++++---------------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3a256c..4f147c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# v25.11 (unreleased) +# v25.11 * Updated libsignal to v0.86.4. * Added support for bridging invite state in groups for phone number invites. diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index 73a2921..522834f 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -34,7 +34,7 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "25.10", + Version: "25.11", SemCalVer: true, Connector: &connector.SignalConnector{}, diff --git a/go.mod b/go.mod index 464486c..e2700a0 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-signal go 1.24.0 -toolchain go1.25.3 +toolchain go1.25.4 require ( github.com/coder/websocket v1.8.14 @@ -12,13 +12,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.2 - golang.org/x/crypto v0.43.0 - golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b - golang.org/x/net v0.46.0 + go.mau.fi/util v0.9.3 + golang.org/x/crypto v0.44.0 + golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 + golang.org/x/net v0.47.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.25.3-0.20251109094010-14e16a3a8190 + maunium.net/go/mautrix v0.26.0 ) require ( @@ -40,9 +40,9 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/goldmark v1.7.13 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect - golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.37.0 // indirect - golang.org/x/text v0.30.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index f89121c..9b47a04 100644 --- a/go.sum +++ b/go.sum @@ -65,25 +65,25 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.2 h1:+S4Z03iCsGqU2WY8X2gySFsFjaLlUHFRDVCYvVwynKM= -go.mau.fi/util v0.9.2/go.mod h1:055elBBCJSdhRsmub7ci9hXZPgGr1U6dYg44cSgRgoU= +go.mau.fi/util v0.9.3 h1:aqNF8KDIN8bFpFbybSk+mEBil7IHeBwlujfyTnvP0uU= +go.mau.fi/util v0.9.3/go.mod h1:krWWfBM1jWTb5f8NCa2TLqWMQuM81X7TGQjhMjBeXmQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= -golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= -golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b h1:18qgiDvlvH7kk8Ioa8Ov+K6xCi0GMvmGfGW0sgd/SYA= -golang.org/x/exp v0.0.0-20251009144603-d2f985daa21b/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= -golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= -golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= +golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc= +golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 h1:zfMcR1Cs4KNuomFFgGefv5N0czO2XZpUbxGUy8i8ug0= +golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.25.3-0.20251109094010-14e16a3a8190 h1:5v25ZS99ilLXHjYX3uMiyHGBNhFPXgOgGfr9GkakRTg= -maunium.net/go/mautrix v0.25.3-0.20251109094010-14e16a3a8190/go.mod h1:EWgYyp2iFZP7pnSm+rufHlO8YVnA2KnoNBDpwekiAwI= +maunium.net/go/mautrix v0.26.0 h1:valc2VmZF+oIY4bMq4Cd5H9cEKMRe8eP4FM7iiaYLxI= +maunium.net/go/mautrix v0.26.0/go.mod h1:NWMv+243NX/gDrLofJ2nNXJPrG8vzoM+WUCWph85S6Q= From 8afd786108ef8b59303231ffb31408ecf20dd5a7 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 17 Nov 2025 15:40:36 +0200 Subject: [PATCH 039/170] signalmeow/provisioning: fix link capabilities --- pkg/signalmeow/provisioning.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/provisioning.go b/pkg/signalmeow/provisioning.go index 8e87738..d877276 100644 --- a/pkg/signalmeow/provisioning.go +++ b/pkg/signalmeow/provisioning.go @@ -299,7 +299,7 @@ func startProvisioning(ctx context.Context, ws *websocket.Conn, provisioningCiph return "", fmt.Errorf("failed to unmarshal provisioning UUID: %w", err) } - linkCapabilities := []string{"backup4", "backup5"} + linkCapabilities := []string{"backup4,backup5"} if !allowBackup { linkCapabilities = []string{} } From f9adb1641599b74228e5292842a9ce983f00d9f5 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 19 Nov 2025 15:07:15 +0200 Subject: [PATCH 040/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e2700a0..e25aa3b 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.47.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.0 + maunium.net/go/mautrix v0.26.1-0.20251119111538-57657d54eeac ) require ( diff --git a/go.sum b/go.sum index 9b47a04..a96f394 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.0 h1:valc2VmZF+oIY4bMq4Cd5H9cEKMRe8eP4FM7iiaYLxI= -maunium.net/go/mautrix v0.26.0/go.mod h1:NWMv+243NX/gDrLofJ2nNXJPrG8vzoM+WUCWph85S6Q= +maunium.net/go/mautrix v0.26.1-0.20251119111538-57657d54eeac h1:zRQXrl+c9Isc1pJ7/MAdov8OKt+MVPGh5qjTzefxb+k= +maunium.net/go/mautrix v0.26.1-0.20251119111538-57657d54eeac/go.mod h1:NWMv+243NX/gDrLofJ2nNXJPrG8vzoM+WUCWph85S6Q= From 75653b339261db938e57ace37fd838bc9865d0d1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 19 Nov 2025 23:15:02 +0200 Subject: [PATCH 041/170] dependencies: update mautrix-go again --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e25aa3b..1d83420 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.47.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.1-0.20251119111538-57657d54eeac + maunium.net/go/mautrix v0.26.1-0.20251119211341-fa56255a06be ) require ( diff --git a/go.sum b/go.sum index a96f394..dbd972c 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.1-0.20251119111538-57657d54eeac h1:zRQXrl+c9Isc1pJ7/MAdov8OKt+MVPGh5qjTzefxb+k= -maunium.net/go/mautrix v0.26.1-0.20251119111538-57657d54eeac/go.mod h1:NWMv+243NX/gDrLofJ2nNXJPrG8vzoM+WUCWph85S6Q= +maunium.net/go/mautrix v0.26.1-0.20251119211341-fa56255a06be h1:RoTQW/g3Upum3RSzdbOlpxhphDsA7+FtFzmF3Obe0o0= +maunium.net/go/mautrix v0.26.1-0.20251119211341-fa56255a06be/go.mod h1:NWMv+243NX/gDrLofJ2nNXJPrG8vzoM+WUCWph85S6Q= From bc47e22ae4a2f7138f96a9fb79873a8b3900075f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 19 Nov 2025 23:22:24 +0200 Subject: [PATCH 042/170] dependencies: update mautrix-go again --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1d83420..9cd9dbb 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( golang.org/x/net v0.47.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.1-0.20251119211341-fa56255a06be + maunium.net/go/mautrix v0.26.1-0.20251119212156-1fac8ceb6653 ) require ( diff --git a/go.sum b/go.sum index dbd972c..835ede2 100644 --- a/go.sum +++ b/go.sum @@ -95,5 +95,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.1-0.20251119211341-fa56255a06be h1:RoTQW/g3Upum3RSzdbOlpxhphDsA7+FtFzmF3Obe0o0= -maunium.net/go/mautrix v0.26.1-0.20251119211341-fa56255a06be/go.mod h1:NWMv+243NX/gDrLofJ2nNXJPrG8vzoM+WUCWph85S6Q= +maunium.net/go/mautrix v0.26.1-0.20251119212156-1fac8ceb6653 h1:z62cPre4V+NGIonN5qlvt1ZtZH5/93ix9DR7KR8yImU= +maunium.net/go/mautrix v0.26.1-0.20251119212156-1fac8ceb6653/go.mod h1:NWMv+243NX/gDrLofJ2nNXJPrG8vzoM+WUCWph85S6Q= From b9061c2aa01cd1625a527092e33acc30ffa45fb0 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 20 Nov 2025 13:16:20 +0200 Subject: [PATCH 043/170] signalmeow/receiving: split sync message handling to new function --- pkg/signalmeow/receiving.go | 271 +++++++++++++++++++----------------- 1 file changed, 140 insertions(+), 131 deletions(-) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index d630386..dc678e4 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -417,6 +417,22 @@ func (cli *Client) handleDecryptedResult( }() } + theirServiceID, err := result.SenderAddress.NameServiceID() + if err != nil { + log.Warn(). + Uint64("server_ts", envelope.GetServerTimestamp()). + Uint64("client_ts", envelope.GetTimestamp()). + Msg("Failed to get sender name as service ID") + return fmt.Errorf("failed to get sender name as service ID: %w", err) + } else if theirServiceID.Type != libsignalgo.ServiceIDTypeACI { + log.Warn(). + Any("their_service_id", theirServiceID). + Uint64("server_ts", envelope.GetServerTimestamp()). + Uint64("client_ts", envelope.GetTimestamp()). + Msg("Dropping message from non-ACI sender") + return nil + } + handlerSuccess := true // result.Err is set if there was an error during decryption and we // should notifiy the user that the message could not be decrypted @@ -430,12 +446,6 @@ func (cli *Client) handleDecryptedResult( logEvt.Msg("Decryption error with unknown sender") return nil } - theirServiceID, err := result.SenderAddress.NameServiceID() - if err != nil { - log.Err(err).Msg("Name error handling decryption error") - } else if theirServiceID.Type != libsignalgo.ServiceIDTypeACI { - log.Warn().Any("their_service_id", theirServiceID).Msg("Sender ServiceID is not an ACI") - } if errors.Is(result.Err, EventAlreadyProcessed) { logEvt.Discard().Msg("") log.Debug().Err(result.Err). @@ -471,12 +481,11 @@ func (cli *Client) handleDecryptedResult( return nil } - name, _ := result.SenderAddress.Name() - deviceId, _ := result.SenderAddress.DeviceID() - log.Trace().Any("raw_data", content).Str("sender", name).Uint("sender_device", deviceId).Msg("Raw event data") + deviceID, _ := result.SenderAddress.DeviceID() + log.Trace().Any("raw_data", content).Stringer("sender", theirServiceID).Uint("sender_device", deviceID).Msg("Raw event data") newLog := log.With(). - Str("sender_name", name). - Uint("sender_device_id", deviceId). + Stringer("sender_name", theirServiceID). + Uint("sender_device_id", deviceID). Str("destination_service_id", destinationServiceID.String()). Logger() log = &newLog @@ -507,15 +516,6 @@ func (cli *Client) handleDecryptedResult( } } - theirServiceID, err := result.SenderAddress.NameServiceID() - if err != nil { - log.Err(err).Msg("Name error") - return err - } else if theirServiceID.Type != libsignalgo.ServiceIDTypeACI { - log.Warn().Any("their_service_id", theirServiceID).Msg("Sender ServiceID is not an ACI") - return nil - } - if destinationServiceID == cli.Store.PNIServiceID() { _, err = cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, theirServiceID.UUID, uuid.Nil, func(recipient *types.Recipient) (changed bool, err error) { if !recipient.NeedsPNISignature { @@ -541,118 +541,11 @@ func (cli *Client) handleDecryptedResult( } } - // TODO: handle more sync messages - if content.SyncMessage != nil { - if content.SyncMessage.Keys != nil { - aep := libsignalgo.AccountEntropyPool(content.SyncMessage.Keys.GetAccountEntropyPool()) - cli.Store.MasterKey = content.SyncMessage.Keys.GetMaster() - if aep != "" { - aepMasterKey, err := aep.DeriveSVRKey() - if err != nil { - log.Err(err).Msg("Failed to derive master key from account entropy pool") - } else if cli.Store.MasterKey == nil { - cli.Store.MasterKey = aepMasterKey - log.Debug().Msg("Derived master key from account entropy pool (no master key in sync message)") - } else if !bytes.Equal(aepMasterKey, cli.Store.MasterKey) { - log.Warn().Msg("Derived master key doesn't match one in sync message") - } else { - log.Debug().Msg("Derived master key matches one in sync message") - } - } else { - log.Debug().Msg("No account entropy pool in sync message") - } - err = cli.Store.DeviceStore.PutDevice(ctx, &cli.Store.DeviceData) - if err != nil { - log.Err(err).Msg("Failed to save device after receiving master key") - } else { - log.Info().Msg("Received master key") - go cli.SyncStorage(ctx) - } - } else if content.SyncMessage.GetFetchLatest().GetType() == signalpb.SyncMessage_FetchLatest_STORAGE_MANIFEST { - log.Debug().Msg("Received storage manifest fetch latest notice") - go cli.SyncStorage(ctx) + if content.SyncMessage != nil && theirServiceID == cli.Store.ACIServiceID() { + handlerSuccess, err = cli.handleSyncMessage(ctx, content.SyncMessage, envelope) + if err != nil { + return err } - syncSent := content.SyncMessage.GetSent() - if syncSent.GetMessage() != nil || syncSent.GetEditMessage() != nil { - destination := syncSent.DestinationServiceId - var syncDestinationServiceID libsignalgo.ServiceID - if destination != nil { - syncDestinationServiceID, err = libsignalgo.ServiceIDFromString(*destination) - if err != nil { - log.Err(err).Msg("Sync message destination parse error") - return err - } - if syncSent.GetDestinationE164() != "" { - aci, pni := syncDestinationServiceID.ToACIAndPNI() - _, err = cli.Store.RecipientStore.UpdateRecipientE164(ctx, aci, pni, syncSent.GetDestinationE164()) - if err != nil { - log.Err(err).Msg("Failed to update recipient E164 after receiving sync message") - } - } - } - if destination == nil && syncSent.GetMessage().GetGroupV2() == nil && syncSent.GetEditMessage().GetDataMessage().GetGroupV2() == nil { - log.Warn().Msg("sync message sent destination is nil") - } else if content.SyncMessage.Sent.Message != nil { - // TODO handle expiration start ts, and maybe the sync message ts? - cli.incomingDataMessage(ctx, content.SyncMessage.Sent.Message, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp()) - } else if content.SyncMessage.Sent.EditMessage != nil { - cli.incomingEditMessage(ctx, content.SyncMessage.Sent.EditMessage, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp()) - } - } - if content.SyncMessage.Contacts != nil { - log.Debug().Msg("Recieved sync message contacts") - blob := content.SyncMessage.Contacts.Blob - if blob != nil { - contactsBytes, err := DownloadAttachmentWithPointer(ctx, blob, nil) - if err != nil { - log.Err(err).Msg("Contacts Sync DownloadAttachment error") - } - // unmarshall contacts - contacts, avatars, err := unmarshalContactDetailsMessages(contactsBytes) - if err != nil { - log.Err(err).Msg("Contacts Sync unmarshalContactDetailsMessages error") - } - log.Debug().Int("contact_count", len(contacts)).Msg("Contacts Sync received contacts") - convertedContacts := make([]*types.Recipient, 0, len(contacts)) - err = cli.Store.DoContactTxn(ctx, func(ctx context.Context) error { - for i, signalContact := range contacts { - if signalContact.Aci == nil || *signalContact.Aci == "" { - // TODO lookup PNI via CDSI and store that when ACI is missing? - log.Info(). - Any("contact", signalContact). - Msg("Signal Contact UUID is nil, skipping") - continue - } - contact, err := cli.StoreContactDetailsAsContact(ctx, signalContact, &avatars[i]) - if err != nil { - return err - } - convertedContacts = append(convertedContacts, contact) - } - return nil - }) - if err != nil { - log.Err(err).Msg("Error storing contacts") - } else { - handlerSuccess = cli.handleEvent(&events.ContactList{ - Contacts: convertedContacts, - }) - } - } - } - if content.SyncMessage.Read != nil { - handlerSuccess = cli.handleEvent(&events.ReadSelf{ - Timestamp: envelope.GetTimestamp(), - Messages: content.SyncMessage.GetRead(), - }) - } - if content.SyncMessage.DeleteForMe != nil { - handlerSuccess = cli.handleEvent(&events.DeleteForMe{ - Timestamp: envelope.GetTimestamp(), - SyncMessage_DeleteForMe: content.SyncMessage.DeleteForMe, - }) - } - } sendDeliveryReceipt := true @@ -725,6 +618,122 @@ func groupOrUserID(groupID types.GroupIdentifier, userID libsignalgo.ServiceID) return string(groupID) } +func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMessage, envelope *signalpb.Envelope) (handlerSuccess bool, err error) { + // TODO: handle more sync messages + handlerSuccess = true + log := zerolog.Ctx(ctx) + if msg.Keys != nil { + aep := libsignalgo.AccountEntropyPool(msg.Keys.GetAccountEntropyPool()) + cli.Store.MasterKey = msg.Keys.GetMaster() + if aep != "" { + aepMasterKey, err := aep.DeriveSVRKey() + if err != nil { + log.Err(err).Msg("Failed to derive master key from account entropy pool") + } else if cli.Store.MasterKey == nil { + cli.Store.MasterKey = aepMasterKey + log.Debug().Msg("Derived master key from account entropy pool (no master key in sync message)") + } else if !bytes.Equal(aepMasterKey, cli.Store.MasterKey) { + log.Warn().Msg("Derived master key doesn't match one in sync message") + } else { + log.Debug().Msg("Derived master key matches one in sync message") + } + } else { + log.Debug().Msg("No account entropy pool in sync message") + } + err = cli.Store.DeviceStore.PutDevice(ctx, &cli.Store.DeviceData) + if err != nil { + log.Err(err).Msg("Failed to save device after receiving master key") + } else { + log.Info().Msg("Received master key") + go cli.SyncStorage(ctx) + } + } else if msg.GetFetchLatest().GetType() == signalpb.SyncMessage_FetchLatest_STORAGE_MANIFEST { + log.Debug().Msg("Received storage manifest fetch latest notice") + go cli.SyncStorage(ctx) + } + syncSent := msg.GetSent() + if syncSent.GetMessage() != nil || syncSent.GetEditMessage() != nil { + destination := syncSent.DestinationServiceId + var syncDestinationServiceID libsignalgo.ServiceID + if destination != nil { + syncDestinationServiceID, err = libsignalgo.ServiceIDFromString(*destination) + if err != nil { + log.Err(err).Msg("Sync message destination parse error") + return + } + if syncSent.GetDestinationE164() != "" { + aci, pni := syncDestinationServiceID.ToACIAndPNI() + _, err = cli.Store.RecipientStore.UpdateRecipientE164(ctx, aci, pni, syncSent.GetDestinationE164()) + if err != nil { + log.Err(err).Msg("Failed to update recipient E164 after receiving sync message") + } + } + } + if destination == nil && syncSent.GetMessage().GetGroupV2() == nil && syncSent.GetEditMessage().GetDataMessage().GetGroupV2() == nil { + log.Warn().Msg("sync message sent destination is nil") + } else if msg.Sent.Message != nil { + // TODO handle expiration start ts, and maybe the sync message ts? + cli.incomingDataMessage(ctx, msg.Sent.Message, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp()) + } else if msg.Sent.EditMessage != nil { + cli.incomingEditMessage(ctx, msg.Sent.EditMessage, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp()) + } + } + if msg.Contacts != nil { + log.Debug().Msg("Recieved sync message contacts") + blob := msg.Contacts.Blob + if blob != nil { + contactsBytes, err := DownloadAttachmentWithPointer(ctx, blob, nil) + if err != nil { + log.Err(err).Msg("Contacts Sync DownloadAttachment error") + } + // unmarshall contacts + contacts, avatars, err := unmarshalContactDetailsMessages(contactsBytes) + if err != nil { + log.Err(err).Msg("Contacts Sync unmarshalContactDetailsMessages error") + } + log.Debug().Int("contact_count", len(contacts)).Msg("Contacts Sync received contacts") + convertedContacts := make([]*types.Recipient, 0, len(contacts)) + err = cli.Store.DoContactTxn(ctx, func(ctx context.Context) error { + for i, signalContact := range contacts { + if signalContact.Aci == nil || *signalContact.Aci == "" { + // TODO lookup PNI via CDSI and store that when ACI is missing? + log.Info(). + Any("contact", signalContact). + Msg("Signal Contact UUID is nil, skipping") + continue + } + contact, err := cli.StoreContactDetailsAsContact(ctx, signalContact, &avatars[i]) + if err != nil { + return err + } + convertedContacts = append(convertedContacts, contact) + } + return nil + }) + if err != nil { + log.Err(err).Msg("Error storing contacts") + } else { + handlerSuccess = cli.handleEvent(&events.ContactList{ + Contacts: convertedContacts, + }) + } + } + } + if msg.Read != nil { + handlerSuccess = cli.handleEvent(&events.ReadSelf{ + Timestamp: envelope.GetTimestamp(), + Messages: msg.GetRead(), + }) + } + if msg.DeleteForMe != nil { + handlerSuccess = cli.handleEvent(&events.DeleteForMe{ + Timestamp: envelope.GetTimestamp(), + SyncMessage_DeleteForMe: msg.DeleteForMe, + }) + } + return +} + func (cli *Client) handlePNISignatureMessage(ctx context.Context, sender libsignalgo.ServiceID, msg *signalpb.PniSignatureMessage) error { if sender.Type != libsignalgo.ServiceIDTypeACI { return fmt.Errorf("PNI signature message sender is not an ACI") From aab8af046c60c826d471fd17f88fde838b069cd6 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 20 Nov 2025 13:29:38 +0200 Subject: [PATCH 044/170] signalmeow: drop DMs from blocked contacts on signal --- pkg/signalmeow/receiving.go | 61 +++++++++++++------ pkg/signalmeow/storageservice.go | 4 ++ pkg/signalmeow/store/backup_store.go | 4 +- pkg/signalmeow/store/container.go | 2 +- pkg/signalmeow/store/device.go | 3 + pkg/signalmeow/store/recipient_store.go | 38 ++++++++++-- pkg/signalmeow/store/upgrades/00-latest.sql | 3 +- .../store/upgrades/23-recipient-blocked.sql | 2 + pkg/signalmeow/types/contact.go | 1 + 9 files changed, 94 insertions(+), 24 deletions(-) create mode 100644 pkg/signalmeow/store/upgrades/23-recipient-blocked.sql diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index dc678e4..9e035ce 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -548,13 +548,20 @@ func (cli *Client) handleDecryptedResult( } } - sendDeliveryReceipt := true + isBlocked, err := cli.Store.RecipientStore.IsBlocked(ctx, theirServiceID.UUID) + if err != nil { + log.Err(err).Stringer("sender", theirServiceID).Msg("Failed to check if sender is blocked") + } + + var sendDeliveryReceipt bool if content.DataMessage != nil { - handlerSuccess = cli.incomingDataMessage(ctx, content.DataMessage, theirServiceID.UUID, theirServiceID, envelope.GetServerTimestamp()) + handlerSuccess, sendDeliveryReceipt = cli.incomingDataMessage( + ctx, content.DataMessage, theirServiceID.UUID, theirServiceID, envelope.GetServerTimestamp(), isBlocked, + ) } else if content.EditMessage != nil { - handlerSuccess = cli.incomingEditMessage(ctx, content.EditMessage, theirServiceID.UUID, theirServiceID, envelope.GetServerTimestamp()) - } else { - sendDeliveryReceipt = false + handlerSuccess, sendDeliveryReceipt = cli.incomingEditMessage( + ctx, content.EditMessage, theirServiceID.UUID, theirServiceID, envelope.GetServerTimestamp(), isBlocked, + ) } if sendDeliveryReceipt && handlerSuccess { err = cli.sendDeliveryReceipts(ctx, []uint64{content.DataMessage.GetTimestamp()}, theirServiceID.UUID) @@ -563,7 +570,7 @@ func (cli *Client) handleDecryptedResult( } } - if content.TypingMessage != nil { + if content.TypingMessage != nil && (!isBlocked || content.TypingMessage.GetGroupId() != nil) { var groupID types.GroupIdentifier if content.TypingMessage.GetGroupId() != nil { gidBytes := content.TypingMessage.GetGroupId() @@ -581,7 +588,7 @@ func (cli *Client) handleDecryptedResult( } // DM call message (group call is an opaque callMessage and a groupCallUpdate in a dataMessage) - if content.CallMessage != nil && (content.CallMessage.Offer != nil || content.CallMessage.Hangup != nil) { + if content.CallMessage != nil && (content.CallMessage.Offer != nil || content.CallMessage.Hangup != nil) && !isBlocked { handlerSuccess = cli.handleEvent(&events.Call{ Info: events.MessageInfo{ Sender: theirServiceID.UUID, @@ -673,9 +680,9 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess log.Warn().Msg("sync message sent destination is nil") } else if msg.Sent.Message != nil { // TODO handle expiration start ts, and maybe the sync message ts? - cli.incomingDataMessage(ctx, msg.Sent.Message, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp()) + cli.incomingDataMessage(ctx, msg.Sent.Message, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp(), false) } else if msg.Sent.EditMessage != nil { - cli.incomingEditMessage(ctx, msg.Sent.EditMessage, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp()) + cli.incomingEditMessage(ctx, msg.Sent.EditMessage, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp(), false) } } if msg.Contacts != nil { @@ -784,7 +791,14 @@ func (cli *Client) handlePNISignatureMessage(ctx context.Context, sender libsign return nil } -func (cli *Client) incomingEditMessage(ctx context.Context, editMessage *signalpb.EditMessage, messageSenderACI uuid.UUID, chatRecipient libsignalgo.ServiceID, serverTimestamp uint64) bool { +func (cli *Client) incomingEditMessage( + ctx context.Context, + editMessage *signalpb.EditMessage, + messageSenderACI uuid.UUID, + chatRecipient libsignalgo.ServiceID, + serverTimestamp uint64, + isBlocked bool, +) (handlerSuccess, sendDeliveryReceipt bool) { // If it's a group message, get the ID and invalidate cache if necessary var groupID types.GroupIdentifier var groupRevision uint32 @@ -796,9 +810,12 @@ func (cli *Client) incomingEditMessage(ctx context.Context, editMessage *signalp groupID, err = cli.StoreMasterKey(ctx, masterKey) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("StoreMasterKey error") - return false + return } groupRevision = editMessage.GetDataMessage().GetGroupV2().GetRevision() + } else if isBlocked { + zerolog.Ctx(ctx).Debug().Msg("Dropping direct message from blocked user") + return true, false } return cli.handleEvent(&events.ChatEvent{ Info: events.MessageInfo{ @@ -808,17 +825,24 @@ func (cli *Client) incomingEditMessage(ctx context.Context, editMessage *signalp ServerTimestamp: serverTimestamp, }, Event: editMessage, - }) + }), true } -func (cli *Client) incomingDataMessage(ctx context.Context, dataMessage *signalpb.DataMessage, messageSenderACI uuid.UUID, chatRecipient libsignalgo.ServiceID, serverTimestamp uint64) bool { +func (cli *Client) incomingDataMessage( + ctx context.Context, + dataMessage *signalpb.DataMessage, + messageSenderACI uuid.UUID, + chatRecipient libsignalgo.ServiceID, + serverTimestamp uint64, + isBlocked bool, +) (handlerSuccess, sendDeliveryReceipt bool) { // If there's a profile key, save it if dataMessage.ProfileKey != nil { profileKey := libsignalgo.ProfileKey(dataMessage.ProfileKey) err := cli.Store.RecipientStore.StoreProfileKey(ctx, messageSenderACI, profileKey) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("StoreProfileKey error") - return false + return } } @@ -833,9 +857,12 @@ func (cli *Client) incomingDataMessage(ctx context.Context, dataMessage *signalp groupID, err = cli.StoreMasterKey(ctx, masterKey) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("StoreMasterKey error") - return false + return } groupRevision = dataMessage.GetGroupV2().GetRevision() + } else if isBlocked { + zerolog.Ctx(ctx).Debug().Msg("Dropping direct message from blocked user") + return true, false } evtInfo := events.MessageInfo{ @@ -851,12 +878,12 @@ func (cli *Client) incomingDataMessage(ctx context.Context, dataMessage *signalp Info: evtInfo, Timestamp: dataMessage.GetTimestamp(), IsRinging: isRinging, - }) + }), true } else { return cli.handleEvent(&events.ChatEvent{ Info: evtInfo, Event: dataMessage, - }) + }), true } } diff --git a/pkg/signalmeow/storageservice.go b/pkg/signalmeow/storageservice.go index 06b0283..7c35dec 100644 --- a/pkg/signalmeow/storageservice.go +++ b/pkg/signalmeow/storageservice.go @@ -99,6 +99,10 @@ func (cli *Client) processStorageInTxn(ctx context.Context, update *StorageUpdat changed = changed || recipient.E164 != contact.E164 recipient.E164 = contact.E164 } + if contact.Blocked != recipient.Blocked { + changed = true + recipient.Blocked = contact.Blocked + } topLevelChanged = changed return }) diff --git a/pkg/signalmeow/store/backup_store.go b/pkg/signalmeow/store/backup_store.go index 4575b05..fb5d5ff 100644 --- a/pkg/signalmeow/store/backup_store.go +++ b/pkg/signalmeow/store/backup_store.go @@ -161,9 +161,11 @@ func (s *sqlStore) AddBackupRecipient(ctx context.Context, recipient *backuppb.R if dest.Contact.ProfileGivenName != nil || dest.Contact.ProfileFamilyName != nil { recipient.Profile.Name = strings.TrimSpace(fmt.Sprintf("%s %s", dest.Contact.GetProfileGivenName(), dest.Contact.GetProfileFamilyName())) } + recipient.Blocked = dest.Contact.Blocked changed = oldRecipient.E164 != recipient.E164 || oldRecipient.Profile.Key != recipient.Profile.Key || - oldRecipient.Profile.Name != recipient.Profile.Name + oldRecipient.Profile.Name != recipient.Profile.Name || + oldRecipient.Blocked != recipient.Blocked return }) if err != nil { diff --git a/pkg/signalmeow/store/container.go b/pkg/signalmeow/store/container.go index f6842ac..e6335e5 100644 --- a/pkg/signalmeow/store/container.go +++ b/pkg/signalmeow/store/container.go @@ -85,7 +85,7 @@ func (c *Container) scanDevice(row dbutil.Scannable) (*Device, error) { device.AccountEntropyPool = libsignalgo.AccountEntropyPool(accountEntropyPool.String) device.EphemeralBackupKey = libsignalgo.BytesToBackupKey(ephemeralBackupKey) device.MediaRootBackupKey = libsignalgo.BytesToBackupKey(mediaRootBackupKey) - baseStore := &sqlStore{Container: c, AccountID: device.ACI} + baseStore := &sqlStore{Container: c, AccountID: device.ACI, blockCache: make(map[uuid.UUID]bool)} aciStore := &scopedSQLStore{Container: c, AccountID: device.ACI, ServiceID: device.ACIServiceID()} pniStore := &scopedSQLStore{Container: c, AccountID: device.ACI, ServiceID: device.PNIServiceID()} device.ACIPreKeyStore = aciStore diff --git a/pkg/signalmeow/store/device.go b/pkg/signalmeow/store/device.go index aabee03..8843ddf 100644 --- a/pkg/signalmeow/store/device.go +++ b/pkg/signalmeow/store/device.go @@ -18,6 +18,9 @@ type sqlStore struct { AccountID uuid.UUID contactLock sync.Mutex + + blockCacheLock sync.RWMutex + blockCache map[uuid.UUID]bool } type scopedSQLStore struct { diff --git a/pkg/signalmeow/store/recipient_store.go b/pkg/signalmeow/store/recipient_store.go index 9e2bb8e..00646df 100644 --- a/pkg/signalmeow/store/recipient_store.go +++ b/pkg/signalmeow/store/recipient_store.go @@ -38,6 +38,7 @@ type RecipientStore interface { MyProfileKey(ctx context.Context) (*libsignalgo.ProfileKey, error) LoadAndUpdateRecipient(ctx context.Context, aci, pni uuid.UUID, updater RecipientUpdaterFunc) (*types.Recipient, error) + IsBlocked(ctx context.Context, aci uuid.UUID) (bool, error) LoadRecipientByE164(ctx context.Context, e164 string) (*types.Recipient, error) StoreRecipient(ctx context.Context, recipient *types.Recipient) error UpdateRecipientE164(ctx context.Context, aci, pni uuid.UUID, e164 string) (*types.Recipient, error) @@ -62,7 +63,8 @@ const ( profile_about_emoji, profile_avatar_path, profile_fetched_at, - needs_pni_signature + needs_pni_signature, + blocked FROM signalmeow_recipients WHERE account_id = $1 ` @@ -87,9 +89,10 @@ const ( profile_about_emoji, profile_avatar_path, profile_fetched_at, - needs_pni_signature + needs_pni_signature, + blocked ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) ON CONFLICT (account_id, aci_uuid) DO UPDATE SET pni_uuid = excluded.pni_uuid, e164_number = excluded.e164_number, @@ -102,7 +105,8 @@ const ( profile_about_emoji = excluded.profile_about_emoji, profile_avatar_path = excluded.profile_avatar_path, profile_fetched_at = excluded.profile_fetched_at, - needs_pni_signature = excluded.needs_pni_signature + needs_pni_signature = excluded.needs_pni_signature, + blocked = excluded.blocked ` upsertPNIRecipientQuery = ` INSERT INTO signalmeow_recipients ( @@ -139,6 +143,7 @@ func scanRecipient(row dbutil.Scannable) (*types.Recipient, error) { &recipient.Profile.AvatarPath, &profileFetchedAt, &recipient.NeedsPNISignature, + &recipient.Blocked, ) if errors.Is(err, sql.ErrNoRows) { return nil, nil @@ -208,6 +213,13 @@ func (s *sqlStore) LoadAndUpdateRecipient(ctx context.Context, aci, pni uuid.UUI return false, nil } } + defer func() { + if outRecipient != nil && outRecipient.ACI != uuid.Nil && outErr == nil { + s.blockCacheLock.Lock() + s.blockCache[outRecipient.ACI] = outRecipient.Blocked + s.blockCacheLock.Unlock() + } + }() if ctx.Value(contextKeyContactLock) == nil { s.contactLock.Lock() defer s.contactLock.Unlock() @@ -295,6 +307,20 @@ func (s *sqlStore) LoadAndUpdateRecipient(ctx context.Context, aci, pni uuid.UUI return } +func (s *sqlStore) IsBlocked(ctx context.Context, aci uuid.UUID) (bool, error) { + s.blockCacheLock.RLock() + cachedVal, ok := s.blockCache[aci] + s.blockCacheLock.RUnlock() + if ok { + return cachedVal, nil + } + recipient, err := s.LoadAndUpdateRecipient(ctx, aci, uuid.Nil, nil) + if err != nil { + return false, err + } + return recipient.Blocked, nil +} + func (s *sqlStore) UpdateRecipientE164(ctx context.Context, aci, pni uuid.UUID, e164 string) (*types.Recipient, error) { return s.LoadAndUpdateRecipient(ctx, aci, pni, func(recipient *types.Recipient) (bool, error) { if recipient.E164 != e164 { @@ -341,7 +367,11 @@ func (s *sqlStore) StoreRecipient(ctx context.Context, recipient *types.Recipien recipient.Profile.AvatarPath, dbutil.UnixMilliPtr(recipient.Profile.FetchedAt), recipient.NeedsPNISignature, + recipient.Blocked, ) + s.blockCacheLock.Lock() + s.blockCache[recipient.ACI] = recipient.Blocked + s.blockCacheLock.Unlock() } else if recipient.PNI != uuid.Nil { _, err = s.db.Exec( ctx, diff --git a/pkg/signalmeow/store/upgrades/00-latest.sql b/pkg/signalmeow/store/upgrades/00-latest.sql index 2c550c9..ddf871a 100644 --- a/pkg/signalmeow/store/upgrades/00-latest.sql +++ b/pkg/signalmeow/store/upgrades/00-latest.sql @@ -1,4 +1,4 @@ --- v0 -> v22 (compatible with v13+): Latest revision +-- v0 -> v23 (compatible with v13+): Latest revision CREATE TABLE signalmeow_device ( aci_uuid TEXT PRIMARY KEY, @@ -117,6 +117,7 @@ CREATE TABLE signalmeow_recipients ( profile_avatar_path TEXT NOT NULL DEFAULT '', profile_fetched_at BIGINT, needs_pni_signature BOOLEAN NOT NULL DEFAULT false, + blocked BOOLEAN NOT NULL DEFAULT false, CONSTRAINT signalmeow_contacts_account_id_fkey FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE, diff --git a/pkg/signalmeow/store/upgrades/23-recipient-blocked.sql b/pkg/signalmeow/store/upgrades/23-recipient-blocked.sql new file mode 100644 index 0000000..3a9654a --- /dev/null +++ b/pkg/signalmeow/store/upgrades/23-recipient-blocked.sql @@ -0,0 +1,2 @@ +-- v23 (compatible with v13+): Store block status for recipients +ALTER TABLE signalmeow_recipients ADD COLUMN blocked BOOLEAN NOT NULL DEFAULT false; diff --git a/pkg/signalmeow/types/contact.go b/pkg/signalmeow/types/contact.go index 53852aa..bed25ac 100644 --- a/pkg/signalmeow/types/contact.go +++ b/pkg/signalmeow/types/contact.go @@ -55,6 +55,7 @@ type Recipient struct { Profile Profile NeedsPNISignature bool + Blocked bool } type ContactAvatar struct { From 67f53eb68ff633f87b2f0df43271bb6c0aaa0278 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 20 Nov 2025 17:15:32 +0200 Subject: [PATCH 045/170] signalmeow/receiving: fix handling missing sender address --- pkg/signalmeow/receiving.go | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 9e035ce..12a360f 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -417,8 +417,17 @@ func (cli *Client) handleDecryptedResult( }() } - theirServiceID, err := result.SenderAddress.NameServiceID() - if err != nil { + var theirServiceID libsignalgo.ServiceID + var err error + if result.SenderAddress == nil { + log.Err(result.Err). + Bool("urgent", envelope.GetUrgent()). + Stringer("content_hint", result.ContentHint). + Uint64("server_ts", envelope.GetServerTimestamp()). + Uint64("client_ts", envelope.GetTimestamp()). + Msg("No sender address received") + return nil + } else if theirServiceID, err = result.SenderAddress.NameServiceID(); err != nil { log.Warn(). Uint64("server_ts", envelope.GetServerTimestamp()). Uint64("client_ts", envelope.GetTimestamp()). @@ -437,17 +446,7 @@ func (cli *Client) handleDecryptedResult( // result.Err is set if there was an error during decryption and we // should notifiy the user that the message could not be decrypted if result.Err != nil { - logEvt := log.Err(result.Err). - Bool("urgent", envelope.GetUrgent()). - Stringer("content_hint", result.ContentHint). - Uint64("server_ts", envelope.GetServerTimestamp()). - Uint64("client_ts", envelope.GetTimestamp()) - if result.SenderAddress == nil { - logEvt.Msg("Decryption error with unknown sender") - return nil - } if errors.Is(result.Err, EventAlreadyProcessed) { - logEvt.Discard().Msg("") log.Debug().Err(result.Err). Bool("urgent", envelope.GetUrgent()). Stringer("content_hint", result.ContentHint). @@ -457,7 +456,13 @@ func (cli *Client) handleDecryptedResult( Msg("Ignoring already processed event") return nil } - logEvt.Stringer("sender", theirServiceID).Msg("Decryption error with known sender") + log.Err(result.Err). + Bool("urgent", envelope.GetUrgent()). + Stringer("content_hint", result.ContentHint). + Uint64("server_ts", envelope.GetServerTimestamp()). + Uint64("client_ts", envelope.GetTimestamp()). + Stringer("sender", theirServiceID). + Msg("Decryption error with known sender") // Only send decryption error event if the message was urgent, // to prevent spamming errors for typing notifications and whatnot if envelope.GetUrgent() && From 2d7eec319f09a0e9e150399250c3d29fb867ccde Mon Sep 17 00:00:00 2001 From: Nick Mills-Barrett Date: Mon, 24 Nov 2025 15:20:48 +0000 Subject: [PATCH 046/170] signalmeow/web: use exsync.Map for response channels (#621) Co-authored-by: Tulir Asokan --- go.mod | 2 +- go.sum | 4 ++-- pkg/signalmeow/web/signalwebsocket.go | 16 ++++++---------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 9cd9dbb..a1be9e8 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.3 + go.mau.fi/util v0.9.4-0.20251124151504-71e0e3476592 golang.org/x/crypto v0.44.0 golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 golang.org/x/net v0.47.0 diff --git a/go.sum b/go.sum index 835ede2..aeb8cf5 100644 --- a/go.sum +++ b/go.sum @@ -65,8 +65,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.3 h1:aqNF8KDIN8bFpFbybSk+mEBil7IHeBwlujfyTnvP0uU= -go.mau.fi/util v0.9.3/go.mod h1:krWWfBM1jWTb5f8NCa2TLqWMQuM81X7TGQjhMjBeXmQ= +go.mau.fi/util v0.9.4-0.20251124151504-71e0e3476592 h1:qSGoV3kSle4DJIFNTK7AdA3NP5MuA6tlTvQrCKsY9iU= +go.mau.fi/util v0.9.4-0.20251124151504-71e0e3476592/go.mod h1:krWWfBM1jWTb5f8NCa2TLqWMQuM81X7TGQjhMjBeXmQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index ca09208..e062c43 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -305,7 +305,7 @@ func (s *SignalWebsocket) connectLoop( retrying = false backoff = initialBackoff - responseChannels := make(map[uint64]chan *signalpb.WebSocketResponseMessage) + responseChannels := exsync.NewMap[uint64, chan *signalpb.WebSocketResponseMessage]() loopCtx, loopCancel := context.WithCancelCause(ctx) var wg sync.WaitGroup wg.Add(3) @@ -388,7 +388,7 @@ func (s *SignalWebsocket) connectLoop( // Clean up ws.Close(websocket.StatusGoingAway, "Going away") - for _, responseChannel := range responseChannels { + for _, responseChannel := range responseChannels.SwapData(nil) { close(responseChannel) } loopCancel(nil) @@ -407,7 +407,7 @@ func readLoop( ctx context.Context, ws *websocket.Conn, incomingRequestChan chan *signalpb.WebSocketRequestMessage, - responseChannels map[uint64]chan *signalpb.WebSocketResponseMessage, + responseChannels *exsync.Map[uint64, chan *signalpb.WebSocketResponseMessage], ) error { log := zerolog.Ctx(ctx).With(). Str("loop", "signal_websocket_read_loop"). @@ -447,7 +447,7 @@ func readLoop( if msg.Response.Id == nil { log.Fatal().Msg("Received response with no id") } - responseChannel, ok := responseChannels[*msg.Response.Id] + responseChannel, ok := responseChannels.Pop(*msg.Response.Id) if !ok { log.Warn(). Uint64("response_id", *msg.Response.Id). @@ -459,10 +459,6 @@ func readLoop( Uint32("response_status", *msg.Response.Status). Msg("Received WS response") responseChannel <- msg.Response - delete(responseChannels, *msg.Response.Id) - log.Debug(). - Uint64("response_id", *msg.Response.Id). - Msg("Deleted response channel for ID") close(responseChannel) } else if *msg.Type == signalpb.WebSocketMessage_UNKNOWN { return fmt.Errorf("received message with unknown type: %v", *msg.Type) @@ -486,7 +482,7 @@ func writeLoop( ctx context.Context, ws *websocket.Conn, sendChannel chan SignalWebsocketSendMessage, - responseChannels map[uint64]chan *signalpb.WebSocketResponseMessage, + responseChannels *exsync.Map[uint64, chan *signalpb.WebSocketResponseMessage], ) error { log := zerolog.Ctx(ctx).With(). Str("loop", "signal_websocket_write_loop"). @@ -509,7 +505,7 @@ func writeLoop( Request: request.RequestMessage, } request.RequestMessage.Id = &i - responseChannels[i] = request.ResponseChannel + responseChannels.Set(i, request.ResponseChannel) path := *request.RequestMessage.Path if len(path) > 30 { path = path[:40] From f8358f6eaf5fc27456bd1fa6ce1226f3e1a6af0e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 24 Nov 2025 14:34:29 +0200 Subject: [PATCH 047/170] signalmeow/web: refactor SendRequest parameters --- pkg/signalmeow/groups.go | 3 +-- pkg/signalmeow/profile.go | 8 ++++---- pkg/signalmeow/sending.go | 9 ++++----- pkg/signalmeow/web/signalwebsocket.go | 19 ++++++++++++++++--- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index d938e10..7a3d64b 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -314,8 +314,7 @@ func (cli *Client) fetchNewGroupCreds(ctx context.Context, today time.Time) (*Gr Logger() sevenDaysOut := today.Add(7 * 24 * time.Hour) path := fmt.Sprintf("/v1/certificate/auth/group?redemptionStartSeconds=%d&redemptionEndSeconds=%d&pniAsServiceId=true", today.Unix(), sevenDaysOut.Unix()) - authRequest := web.CreateWSRequest(http.MethodGet, path, nil, nil, nil) - resp, err := cli.AuthedWS.SendRequest(ctx, authRequest) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, path, nil, nil) if err != nil { return nil, fmt.Errorf("SendRequest error: %w", err) } diff --git a/pkg/signalmeow/profile.go b/pkg/signalmeow/profile.go index 81f1ed8..9510f37 100644 --- a/pkg/signalmeow/profile.go +++ b/pkg/signalmeow/profile.go @@ -218,12 +218,12 @@ func (cli *Client) fetchProfileWithRequestAndKey(ctx context.Context, signalID u path += "/" + string(credentialRequest) path += "?credentialType=expiringProfileKey" } - profileRequest := web.CreateWSRequest(http.MethodGet, path, nil, nil, nil) + headers := http.Header{} if useUnidentified { - profileRequest.Headers = append(profileRequest.Headers, "unidentified-access-key:"+base64AccessKey) - profileRequest.Headers = append(profileRequest.Headers, "accept-language:en-CA") + headers.Set("Unidentified-Access-Key", base64AccessKey) + headers.Set("Accept-Language", "en-US") } - resp, err := cli.UnauthedWS.SendRequest(ctx, profileRequest) + resp, err := cli.UnauthedWS.SendRequest(ctx, http.MethodGet, path, nil, headers) if err != nil { return nil, fmt.Errorf("error sending request: %w", err) } diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 8bfc5a5..11ed08d 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -884,17 +884,16 @@ func (cli *Client) sendContent( return false, err } path := fmt.Sprintf("/v1/messages/%s", recipient) - request := web.CreateWSRequest(http.MethodPut, path, jsonBytes, nil, nil) var response *signalpb.WebSocketResponseMessage if useUnidentifiedSender { log.Trace().Msg("Sending message over unidentified WS") - base64AccessKey := base64.StdEncoding.EncodeToString(accessKey[:]) - request.Headers = append(request.Headers, "unidentified-access-key:"+base64AccessKey) - response, err = cli.UnauthedWS.SendRequest(ctx, request) + response, err = cli.UnauthedWS.SendRequest(ctx, http.MethodPut, path, jsonBytes, http.Header{ + "Unidentified-Access-Key": []string{base64.StdEncoding.EncodeToString(accessKey[:])}, + }) } else { log.Trace().Msg("Sending message over authed WS") - response, err = cli.AuthedWS.SendRequest(ctx, request) + response, err = cli.AuthedWS.SendRequest(ctx, http.MethodPut, path, jsonBytes, nil) } sentUnidentified = useUnidentifiedSender if err != nil { diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index e062c43..75e22e1 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -560,13 +560,26 @@ func writeLoop( func (s *SignalWebsocket) SendRequest( ctx context.Context, - request *signalpb.WebSocketRequestMessage, + method, + path string, + body []byte, + headers http.Header, ) (*signalpb.WebSocketResponseMessage, error) { if s == nil { return nil, errors.New("websocket is nil") } - startTime := time.Now() - return s.sendRequestInternal(ctx, request, startTime, 0) + headerArray := make([]string, len(headers)) + for key, values := range headers { + for _, value := range values { + headerArray = append(headerArray, fmt.Sprintf("%s:%s", strings.ToLower(key), value)) + } + } + return s.sendRequestInternal(ctx, &signalpb.WebSocketRequestMessage{ + Verb: &method, + Path: &path, + Body: body, + Headers: headerArray, + }, time.Now(), 0) } func (s *SignalWebsocket) sendRequestInternal( From bd9b96e3a04575ab5bbae58cc18f67dde49956db Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 24 Nov 2025 15:03:02 +0200 Subject: [PATCH 048/170] signalmeow: move all normal authed requests to websocket --- pkg/connector/client.go | 6 --- pkg/signalmeow/attachments.go | 27 +++++------ pkg/signalmeow/backup.go | 19 +++----- pkg/signalmeow/client.go | 10 ++++ pkg/signalmeow/devicename.go | 13 ++--- pkg/signalmeow/groups.go | 15 ++---- pkg/signalmeow/keys.go | 44 +++++++---------- pkg/signalmeow/profile.go | 5 +- pkg/signalmeow/provisioning.go | 25 ++-------- pkg/signalmeow/pushreg.go | 23 +++------ pkg/signalmeow/receiving.go | 6 +++ pkg/signalmeow/sending.go | 15 +++--- pkg/signalmeow/serviceauth.go | 10 +--- pkg/signalmeow/storageservice.go | 6 +-- pkg/signalmeow/web/signalwebsocket.go | 7 +++ pkg/signalmeow/web/web.go | 69 +++++++++++++++------------ 16 files changed, 129 insertions(+), 171 deletions(-) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 0ff578f..c85ae35 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -298,12 +298,6 @@ func (s *SignalClient) postLoginConnect() { } func (s *SignalClient) tryConnect(ctx context.Context, retryCount int, doSync bool) { - err := s.Client.RegisterCapabilities(ctx) - if err != nil { - zerolog.Ctx(ctx).Err(err).Msg("Failed to register capabilities") - } else { - zerolog.Ctx(ctx).Debug().Msg("Successfully registered capabilities") - } ch, err := s.Client.StartReceiveLoops(ctx) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to start receive loops") diff --git a/pkg/signalmeow/attachments.go b/pkg/signalmeow/attachments.go index 67a55c8..22884fe 100644 --- a/pkg/signalmeow/attachments.go +++ b/pkg/signalmeow/attachments.go @@ -70,8 +70,7 @@ func DownloadAttachmentWithPointer(ctx context.Context, a *signalpb.AttachmentPo } func DownloadAttachment(ctx context.Context, cdnID uint64, cdnKey string, cdnNumber uint32, key, digest []byte, plaintextDigest bool, size uint32) ([]byte, error) { - path := getAttachmentPath(cdnID, cdnKey) - resp, err := web.GetAttachment(ctx, path, cdnNumber, nil) + resp, err := web.GetAttachment(ctx, getAttachmentPath(cdnID, cdnKey), cdnNumber) if err != nil { return nil, err } @@ -174,15 +173,13 @@ func (cli *Client) UploadAttachment(ctx context.Context, body []byte) (*signalpb // Get upload attributes from Signal server attributesPath := "/v4/attachments/form/upload" - username, password := cli.Store.BasicAuthCreds() - opts := &web.HTTPReqOpt{Username: &username, Password: &password} - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, attributesPath, opts) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, attributesPath, nil, nil) if err != nil { log.Err(err).Msg("Failed to request upload attributes") return nil, fmt.Errorf("failed to request upload attributes: %w", err) } var uploadAttributes attachmentV4UploadAttributes - err = web.DecodeHTTPResponseBody(ctx, &uploadAttributes, resp) + err = web.DecodeWSResponseBody(ctx, &uploadAttributes, resp) if err != nil { log.Err(err).Msg("Failed to decode upload attributes") return nil, fmt.Errorf("failed to decode upload attributes: %w", err) @@ -192,7 +189,7 @@ func (cli *Client) UploadAttachment(ctx context.Context, body []byte) (*signalpb err = cli.uploadAttachmentTUS(ctx, uploadAttributes, encryptedWithMAC) } else { log.Trace().Msg("Using legacy upload") - err = cli.uploadAttachmentLegacy(ctx, uploadAttributes, encryptedWithMAC, username, password) + err = cli.uploadAttachmentLegacy(ctx, uploadAttributes, encryptedWithMAC) } if err != nil { log.Err(err).Msg("Failed to upload attachment") @@ -218,11 +215,10 @@ func (cli *Client) uploadAttachmentLegacy( ctx context.Context, uploadAttributes attachmentV4UploadAttributes, encryptedWithMAC []byte, - username string, - password string, ) error { + username, password := cli.Store.BasicAuthCreds() // Allocate attachment on CDN - resp, err := web.SendHTTPRequest(ctx, http.MethodPost, "", &web.HTTPReqOpt{ + resp, err := web.SendHTTPRequest(ctx, "", http.MethodPost, "", &web.HTTPReqOpt{ OverrideURL: uploadAttributes.SignedUploadLocation, ContentType: web.ContentTypeOctetStream, Headers: uploadAttributes.Headers, @@ -236,7 +232,7 @@ func (cli *Client) uploadAttachmentLegacy( } // Upload attachment to CDN - resp, err = web.SendHTTPRequest(ctx, http.MethodPut, "", &web.HTTPReqOpt{ + resp, err = web.SendHTTPRequest(ctx, "", http.MethodPut, "", &web.HTTPReqOpt{ OverrideURL: resp.Header.Get("Location"), Body: encryptedWithMAC, ContentType: web.ContentTypeOctetStream, @@ -260,7 +256,7 @@ func (cli *Client) uploadAttachmentTUS( uploadAttributes.Headers["Upload-Length"] = fmt.Sprintf("%d", len(encryptedWithMAC)) uploadAttributes.Headers["Upload-Metadata"] = "filename " + base64.StdEncoding.EncodeToString([]byte(uploadAttributes.Key)) - resp, err := web.SendHTTPRequest(ctx, http.MethodPost, "", &web.HTTPReqOpt{ + resp, err := web.SendHTTPRequest(ctx, "", http.MethodPost, "", &web.HTTPReqOpt{ OverrideURL: uploadAttributes.SignedUploadLocation, Body: encryptedWithMAC, ContentType: web.ContentTypeOffsetOctetStream, @@ -306,8 +302,8 @@ func (cli *Client) UploadGroupAvatar(ctx context.Context, avatarBytes []byte, gi // Get upload form from Signal server formPath := "/v2/groups/avatar/form" - opts := &web.HTTPReqOpt{Username: &groupAuth.Username, Password: &groupAuth.Password, ContentType: web.ContentTypeProtobuf, Host: web.StorageHostname} - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, formPath, opts) + opts := &web.HTTPReqOpt{Username: &groupAuth.Username, Password: &groupAuth.Password, ContentType: web.ContentTypeProtobuf} + resp, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodGet, formPath, opts) if err != nil { log.Err(err).Msg("Error sending request fetching avatar upload form") return "", err @@ -338,10 +334,9 @@ func (cli *Client) UploadGroupAvatar(ctx context.Context, avatarBytes []byte, gi w.Close() // Upload avatar to CDN - resp, err = web.SendHTTPRequest(ctx, http.MethodPost, "", &web.HTTPReqOpt{ + resp, err = web.SendHTTPRequest(ctx, web.CDN1Hostname, http.MethodPost, "", &web.HTTPReqOpt{ Body: requestBody.Bytes(), ContentType: web.ContentType(w.FormDataContentType()), - Host: web.CDN1Hostname, }) if err != nil { log.Err(err).Msg("Error sending request uploading attachment") diff --git a/pkg/signalmeow/backup.go b/pkg/signalmeow/backup.go index 43c2f78..fcbfff0 100644 --- a/pkg/signalmeow/backup.go +++ b/pkg/signalmeow/backup.go @@ -239,7 +239,7 @@ func (cli *Client) deriveTransferKeys() (aesKey, hmacKey [32]byte, err error) { } func downloadTransferArchive(ctx context.Context, meta *TransferArchiveMetadata, writeTo io.Writer) error { - resp, err := web.GetAttachment(ctx, getAttachmentPath(0, meta.Key), meta.CDN, nil) + resp, err := web.GetAttachment(ctx, getAttachmentPath(0, meta.Key), meta.CDN) if err != nil { return fmt.Errorf("failed to download transfer archive: %w", err) } @@ -291,21 +291,14 @@ func (cli *Client) tryRequestTransferArchive(ctx context.Context, timeout time.D reqCtx, cancel := context.WithTimeout(ctx, timeout+15*time.Second) defer cancel() path := "/v1/devices/transfer_archive?timeout=" + strconv.Itoa(int(timeout.Seconds())) - username, password := cli.Store.BasicAuthCreds() - opts := &web.HTTPReqOpt{Username: &username, Password: &password} - resp, err := web.SendHTTPRequest(reqCtx, http.MethodGet, path, opts) - defer func() { - if resp != nil && resp.Body != nil { - _ = resp.Body.Close() - } - }() + resp, err := cli.AuthedWS.SendRequest(reqCtx, http.MethodGet, path, nil, nil) if err != nil { return nil, err - } else if resp.StatusCode == http.StatusNoContent { + } else if resp.GetStatus() == http.StatusNoContent { return nil, nil - } else if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("unexpected status code %d", resp.StatusCode) - } else if err = json.NewDecoder(resp.Body).Decode(&respBody); err != nil { + } else if resp.GetStatus() != http.StatusOK { + return nil, fmt.Errorf("unexpected status code %d", resp.GetStatus()) + } else if err = json.Unmarshal(resp.Body, &respBody); err != nil { return nil, fmt.Errorf("failed to decode response: %w", err) } else { return respBody, nil diff --git a/pkg/signalmeow/client.go b/pkg/signalmeow/client.go index 42979c1..ea5eb17 100644 --- a/pkg/signalmeow/client.go +++ b/pkg/signalmeow/client.go @@ -18,7 +18,9 @@ package signalmeow import ( "context" + "encoding/json" "errors" + "net/http" "net/url" "sync" "time" @@ -110,3 +112,11 @@ func (cli *Client) connectUnauthedWS(ctx context.Context) (chan web.SignalWebsoc func (cli *Client) IsLoggedIn() bool { return cli.Store != nil && cli.Store.IsDeviceLoggedIn() } + +func (cli *Client) GetRemoteConfig(ctx context.Context) (json.RawMessage, error) { + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, "/v2/config", nil, nil) + if err != nil { + return nil, err + } + return resp.Body, web.DecodeWSResponseBody(ctx, nil, resp) +} diff --git a/pkg/signalmeow/devicename.go b/pkg/signalmeow/devicename.go index c22e94d..ceca1e4 100644 --- a/pkg/signalmeow/devicename.go +++ b/pkg/signalmeow/devicename.go @@ -30,7 +30,6 @@ import ( "go.mau.fi/mautrix-signal/pkg/libsignalgo" signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" - "go.mau.fi/mautrix-signal/pkg/signalmeow/web" ) func hmacSHA256(key, input []byte) []byte { @@ -63,18 +62,12 @@ func (cli *Client) updateDeviceName(ctx context.Context, encryptedName []byte) e if err != nil { return fmt.Errorf("failed to marshal device name update request: %w", err) } - username, password := cli.Store.BasicAuthCreds() - resp, err := web.SendHTTPRequest(ctx, http.MethodPut, "/v1/accounts/name", &web.HTTPReqOpt{ - Body: reqData, - Username: &username, - Password: &password, - }) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodPut, "/v1/accounts/name", reqData, nil) if err != nil { return fmt.Errorf("failed to send device name update request: %w", err) } - defer resp.Body.Close() - if resp.StatusCode < 200 || resp.StatusCode >= 300 { - return fmt.Errorf("device name update request returned status %d", resp.StatusCode) + if resp.GetStatus() < 200 || resp.GetStatus() >= 300 { + return fmt.Errorf("device name update request returned status %d", resp.GetStatus()) } return nil } diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index 7a3d64b..39753bb 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -648,9 +648,8 @@ func (cli *Client) fetchGroupWithMasterKey(ctx context.Context, groupMasterKey t Username: &groupAuth.Username, Password: &groupAuth.Password, ContentType: web.ContentTypeProtobuf, - Host: web.StorageHostname, } - response, err := web.SendHTTPRequest(ctx, http.MethodGet, "/v2/groups", opts) + response, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodGet, "/v2/groups", opts) if err != nil { return nil, err } @@ -695,11 +694,10 @@ func (cli *Client) parseGroupResponse(ctx context.Context, response *http.Respon func (cli *Client) DownloadGroupAvatar(ctx context.Context, avatarPath string, groupMasterKey types.SerializedGroupMasterKey) ([]byte, error) { username, password := cli.Store.BasicAuthCreds() opts := &web.HTTPReqOpt{ - Host: web.CDN1Hostname, Username: &username, Password: &password, } - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, avatarPath, opts) + resp, err := web.SendHTTPRequest(ctx, web.CDN1Hostname, http.MethodGet, avatarPath, opts) if err != nil { return nil, fmt.Errorf("failed to send request: %w", err) } @@ -1503,9 +1501,8 @@ func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupCh Password: &groupAuth.Password, ContentType: web.ContentTypeProtobuf, Body: requestBody, - Host: web.StorageHostname, } - resp, err := web.SendHTTPRequest(ctx, http.MethodPatch, path, opts) + resp, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodPatch, path, opts) if err != nil { return nil, fmt.Errorf("SendRequest error: %w", err) } @@ -1738,9 +1735,8 @@ func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Grou Password: &groupAuth.Password, ContentType: web.ContentTypeProtobuf, Body: requestBody, - Host: web.StorageHostname, } - resp, err := web.SendHTTPRequest(ctx, http.MethodPut, path, opts) + resp, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodPut, path, opts) if err != nil { return nil, fmt.Errorf("SendRequest error: %w", err) } @@ -1803,7 +1799,6 @@ func (cli *Client) GetGroupHistoryPage(ctx context.Context, gid types.GroupIdent Username: &groupAuth.Username, Password: &groupAuth.Password, ContentType: web.ContentTypeProtobuf, - Host: web.StorageHostname, Headers: map[string]string{ // TODO actually cache the data and provide real expiry timestamp "Cached-Send-Endorsements": "0", @@ -1811,7 +1806,7 @@ func (cli *Client) GetGroupHistoryPage(ctx context.Context, gid types.GroupIdent } // highest known epoch seems to always be 5, but that may change in the future. includeLastState is always false path := fmt.Sprintf("/v2/groups/logs/%d?maxSupportedChangeEpoch=%d&includeFirstState=%t&includeLastState=false", fromRevision, 5, includeFirstState) - response, err := web.SendHTTPRequest(ctx, http.MethodGet, path, opts) + response, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodGet, path, opts) if err != nil { return nil, err } diff --git a/pkg/signalmeow/keys.go b/pkg/signalmeow/keys.go index a3f2690..4756514 100644 --- a/pkg/signalmeow/keys.go +++ b/pkg/signalmeow/keys.go @@ -97,10 +97,9 @@ func (cli *Client) RegisterAllPreKeys(ctx context.Context, pks store.PreKeyStore KyberPreKeys: kyberPreKeys, IdentityKey: identityKey, } - preKeyUsername := fmt.Sprintf("%s.%d", cli.Store.ACI, cli.Store.DeviceID) log := zerolog.Ctx(ctx).With().Str("action", "register prekeys").Logger() log.Debug().Int("num_prekeys", len(preKeys)).Int("num_kyber_prekeys", len(kyberPreKeys)).Msg("Registering prekeys") - err = RegisterPreKeys(ctx, &generatedPreKeys, pni, preKeyUsername, cli.Store.Password) + err = cli.RegisterPreKeys(ctx, &generatedPreKeys, pni) if err != nil { return fmt.Errorf("failed to register prekeys: %w", err) } @@ -346,11 +345,11 @@ func KyberPreKeyToJSON(kyberPreKey *libsignalgo.KyberPreKeyRecord) (map[string]i var errPrekeyUpload422 = errors.New("http 422 while registering prekeys") -func RegisterPreKeys(ctx context.Context, generatedPreKeys *GeneratedPreKeys, pni bool, username string, password string) error { +func (cli *Client) RegisterPreKeys(ctx context.Context, generatedPreKeys *GeneratedPreKeys, pni bool) error { log := zerolog.Ctx(ctx).With().Str("action", "register prekeys").Logger() // Convert generated prekeys to JSON - preKeysJson := []map[string]interface{}{} - kyberPreKeysJson := []map[string]interface{}{} + preKeysJson := []map[string]any{} + kyberPreKeysJson := []map[string]any{} for _, preKey := range generatedPreKeys.PreKeys { preKeyJson, err := PreKeyToJSON(preKey) if err != nil { @@ -367,32 +366,27 @@ func RegisterPreKeys(ctx context.Context, generatedPreKeys *GeneratedPreKeys, pn } identityKey := generatedPreKeys.IdentityKey - register_json := map[string]interface{}{ + registerJSON := map[string]any{ "preKeys": preKeysJson, "pqPreKeys": kyberPreKeysJson, "identityKey": base64.StdEncoding.EncodeToString(identityKey), } // Send request - jsonBytes, err := json.Marshal(register_json) + jsonBytes, err := json.Marshal(registerJSON) if err != nil { log.Err(err).Msg("Error marshalling register JSON") return err } - opts := &web.HTTPReqOpt{Body: jsonBytes, Username: &username, Password: &password} - resp, err := web.SendHTTPRequest(ctx, http.MethodPut, keysPath(pni), opts) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodPut, keysPath(pni), jsonBytes, nil) if err != nil { log.Err(err).Msg("Error sending request") return err } - defer resp.Body.Close() - // status code not 2xx - if resp.StatusCode == 422 { + if resp.GetStatus() == 422 { return errPrekeyUpload422 - } else if resp.StatusCode < 200 || resp.StatusCode >= 300 { - return fmt.Errorf("error registering prekeys: %v", resp.Status) } - return err + return web.DecodeWSResponseBody(ctx, nil, resp) } type prekeyResponse struct { @@ -434,18 +428,17 @@ func (cli *Client) FetchAndProcessPreKey(ctx context.Context, theirServiceID lib deviceIDPath = "/" + fmt.Sprint(specificDeviceID) } path := "/v2/keys/" + theirServiceID.String() + deviceIDPath + "?pq=true" - username, password := cli.Store.BasicAuthCreds() - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, path, &web.HTTPReqOpt{Username: &username, Password: &password}) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, path, nil, nil) if err != nil { return fmt.Errorf("error sending request: %w", err) } - var prekeyResponse prekeyResponse - err = web.DecodeHTTPResponseBody(ctx, &prekeyResponse, resp) + var respData prekeyResponse + err = web.DecodeWSResponseBody(ctx, &respData, resp) if err != nil { return fmt.Errorf("error decoding response body: %w", err) } - rawIdentityKey, err := addBase64PaddingAndDecode(prekeyResponse.IdentityKey) + rawIdentityKey, err := addBase64PaddingAndDecode(respData.IdentityKey) if err != nil { return fmt.Errorf("error decoding identity key: %w", err) } @@ -458,7 +451,7 @@ func (cli *Client) FetchAndProcessPreKey(ctx context.Context, theirServiceID lib } // Process each prekey in response (should only be one at the moment) - for _, d := range prekeyResponse.Devices { + for _, d := range respData.Devices { var publicKey *libsignalgo.PublicKey var preKeyID uint32 if d.PreKey != nil { @@ -555,19 +548,18 @@ func keysPath(pni bool) string { func (cli *Client) GetMyKeyCounts(ctx context.Context, pni bool) (int, int, error) { log := zerolog.Ctx(ctx).With().Str("action", "get my key counts").Logger() - username, password := cli.Store.BasicAuthCreds() - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, keysPath(pni), &web.HTTPReqOpt{Username: &username, Password: &password}) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, keysPath(pni), nil, nil) if err != nil { log.Err(err).Msg("Error sending request") return 0, 0, err } - var preKeyCountResponse preKeyCountResponse - err = web.DecodeHTTPResponseBody(ctx, &preKeyCountResponse, resp) + var respData preKeyCountResponse + err = web.DecodeWSResponseBody(ctx, &respData, resp) if err != nil { log.Err(err).Msg("Fetching prekey counts, error with response body") return 0, 0, err } - return preKeyCountResponse.Count, preKeyCountResponse.PQCount, err + return respData.Count, respData.PQCount, err } func (cli *Client) CheckAndUploadNewPreKeys(ctx context.Context, pks store.PreKeyStore) error { diff --git a/pkg/signalmeow/profile.go b/pkg/signalmeow/profile.go index 9510f37..4284a8b 100644 --- a/pkg/signalmeow/profile.go +++ b/pkg/signalmeow/profile.go @@ -229,7 +229,7 @@ func (cli *Client) fetchProfileWithRequestAndKey(ctx context.Context, signalID u } var profile types.Profile profile.FetchedAt = time.Now() - logEvt := log.Trace().Uint32("status_code", resp.GetStatus()) + logEvt := log.Trace().Uint32("status_code", resp.GetStatus()).Str("resp_message", resp.GetMessage()) if logEvt.Enabled() { if json.Valid(resp.Body) { logEvt.RawJSON("response_data", resp.Body) @@ -288,11 +288,10 @@ func (cli *Client) fetchProfileWithRequestAndKey(ctx context.Context, signalID u func (cli *Client) DownloadUserAvatar(ctx context.Context, avatarPath string, profileKey libsignalgo.ProfileKey) ([]byte, error) { username, password := cli.Store.BasicAuthCreds() opts := &web.HTTPReqOpt{ - Host: web.CDN1Hostname, Username: &username, Password: &password, } - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, avatarPath, opts) + resp, err := web.SendHTTPRequest(ctx, web.CDN1Hostname, http.MethodGet, avatarPath, opts) if err != nil { return nil, fmt.Errorf("failed to send request: %w", err) } diff --git a/pkg/signalmeow/provisioning.go b/pkg/signalmeow/provisioning.go index d877276..2343e32 100644 --- a/pkg/signalmeow/provisioning.go +++ b/pkg/signalmeow/provisioning.go @@ -366,36 +366,19 @@ var signalCapabilities = map[string]any{ var signalCapabilitiesBody = exerrors.Must(json.Marshal(signalCapabilities)) func (cli *Client) RegisterCapabilities(ctx context.Context) error { - username, password := cli.Store.BasicAuthCreds() - resp, err := web.SendHTTPRequest(ctx, http.MethodPut, "/v1/devices/capabilities", &web.HTTPReqOpt{ - Body: signalCapabilitiesBody, - Username: &username, - Password: &password, - ContentType: web.ContentTypeJSON, - }) - if resp != nil { - _ = resp.Body.Close() - } + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodPut, "/v1/devices/capabilities", signalCapabilitiesBody, nil) if err != nil { return err - } else if resp.StatusCode >= 400 { - return fmt.Errorf("unexpected status code %d", resp.StatusCode) } - return nil + return web.DecodeWSResponseBody(ctx, nil, resp) } func (cli *Client) Unlink(ctx context.Context) error { - username, password := cli.Store.BasicAuthCreds() - resp, err := web.SendHTTPRequest(ctx, http.MethodDelete, fmt.Sprintf("/v1/devices/%d", cli.Store.DeviceID), &web.HTTPReqOpt{ - Username: &username, - Password: &password, - }) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodDelete, fmt.Sprintf("/v1/devices/%d", cli.Store.DeviceID), nil, nil) if err != nil { return err - } else if resp.StatusCode >= 400 { - return fmt.Errorf("unexpected status code %d", resp.StatusCode) } - return nil + return web.DecodeWSResponseBody(ctx, nil, resp) } func confirmDevice( diff --git a/pkg/signalmeow/pushreg.go b/pkg/signalmeow/pushreg.go index fe45785..79d0318 100644 --- a/pkg/signalmeow/pushreg.go +++ b/pkg/signalmeow/pushreg.go @@ -19,9 +19,9 @@ package signalmeow import ( "context" "encoding/json" - "fmt" "net/http" + signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" "go.mau.fi/mautrix-signal/pkg/signalmeow/web" ) @@ -36,30 +36,21 @@ type ReqRegisterAPNs struct { } func (cli *Client) registerPush(ctx context.Context, pushType string, data any) error { - username, password := cli.Store.BasicAuthCreds() - req := &web.HTTPReqOpt{ - Username: &username, - Password: &password, - } - var method string + var resp *signalpb.WebSocketResponseMessage + var err error if data != nil { - method = http.MethodPut - req.ContentType = web.ContentTypeJSON - var err error - req.Body, err = json.Marshal(data) + body, err := json.Marshal(data) if err != nil { return err } + resp, err = cli.AuthedWS.SendRequest(ctx, http.MethodPut, "/v1/accounts/"+pushType, body, nil) } else { - method = http.MethodDelete + resp, err = cli.AuthedWS.SendRequest(ctx, http.MethodDelete, "/v1/accounts/"+pushType, nil, nil) } - resp, err := web.SendHTTPRequest(ctx, method, "/v1/accounts/"+pushType, req) if err != nil { return err - } else if resp.StatusCode >= 300 || resp.StatusCode < 200 { - return fmt.Errorf("unexpected status code %d", resp.StatusCode) } - return nil + return web.DecodeWSResponseBody(ctx, nil, resp) } func (cli *Client) RegisterFCM(ctx context.Context, token string) error { diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 12a360f..622f18c 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -255,6 +255,12 @@ func (cli *Client) StartReceiveLoops(ctx context.Context) (chan SignalConnection return case <-initialConnectChan: log.Info().Msg("Both websockets connected, sending contacts sync request") + err = cli.RegisterCapabilities(ctx) + if err != nil { + zerolog.Ctx(ctx).Err(err).Msg("Failed to register capabilities") + } else { + zerolog.Ctx(ctx).Debug().Msg("Successfully registered capabilities") + } // TODO hacky if cli.SyncContactsOnConnect { cli.SendContactSyncRequest(loopCtx) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 11ed08d..ee35cd4 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -70,17 +70,15 @@ func (cli *Client) senderCertificate(ctx context.Context, e164 bool) (*libsignal } var r response - username, password := cli.Store.BasicAuthCreds() - opts := &web.HTTPReqOpt{Username: &username, Password: &password} var query string if !e164 { query = "?includeE164=false" } - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, "/v1/certificate/delivery"+query, opts) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, "/v1/certificate/delivery"+query, nil, nil) if err != nil { return nil, err } - err = web.DecodeHTTPResponseBody(ctx, &r, resp) + err = web.DecodeWSResponseBody(ctx, &r, resp) if err != nil { return nil, err } @@ -886,14 +884,15 @@ func (cli *Client) sendContent( path := fmt.Sprintf("/v1/messages/%s", recipient) var response *signalpb.WebSocketResponseMessage + header := http.Header{} + header.Set("Content-Type", string(web.ContentTypeJSON)) if useUnidentifiedSender { log.Trace().Msg("Sending message over unidentified WS") - response, err = cli.UnauthedWS.SendRequest(ctx, http.MethodPut, path, jsonBytes, http.Header{ - "Unidentified-Access-Key": []string{base64.StdEncoding.EncodeToString(accessKey[:])}, - }) + header.Set("Unidentified-Access-Key", base64.StdEncoding.EncodeToString(accessKey[:])) + response, err = cli.UnauthedWS.SendRequest(ctx, http.MethodPut, path, jsonBytes, header) } else { log.Trace().Msg("Sending message over authed WS") - response, err = cli.AuthedWS.SendRequest(ctx, http.MethodPut, path, jsonBytes, nil) + response, err = cli.AuthedWS.SendRequest(ctx, http.MethodPut, path, jsonBytes, header) } sentUnidentified = useUnidentifiedSender if err != nil { diff --git a/pkg/signalmeow/serviceauth.go b/pkg/signalmeow/serviceauth.go index b945f30..5365ded 100644 --- a/pkg/signalmeow/serviceauth.go +++ b/pkg/signalmeow/serviceauth.go @@ -58,20 +58,14 @@ func (cli *Client) getCredentialsWithCache(ctx context.Context, cache **basicExp } func (cli *Client) getCredentialsFromServer(ctx context.Context, path string) (*basicExpiringCredentials, error) { - username, password := cli.Store.BasicAuthCreds() - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, path, &web.HTTPReqOpt{ - Username: &username, - Password: &password, - }) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, path, nil, nil) if err != nil { return nil, err - } else if resp.StatusCode >= 300 || resp.StatusCode < 200 { - return nil, fmt.Errorf("unexpected status code %d", resp.StatusCode) } var auth basicExpiringCredentials auth.CreatedAt = time.Now() - err = web.DecodeHTTPResponseBody(ctx, &auth, resp) + err = web.DecodeWSResponseBody(ctx, &auth, resp) if err != nil { return nil, fmt.Errorf("failed to decode response: %w", err) } diff --git a/pkg/signalmeow/storageservice.go b/pkg/signalmeow/storageservice.go index 7c35dec..45a008e 100644 --- a/pkg/signalmeow/storageservice.go +++ b/pkg/signalmeow/storageservice.go @@ -243,11 +243,10 @@ func (cli *Client) fetchStorageManifest(ctx context.Context, storageKey []byte, } var encryptedManifest signalpb.StorageManifest var manifestRecord signalpb.ManifestRecord - resp, err := web.SendHTTPRequest(ctx, http.MethodGet, path, &web.HTTPReqOpt{ + resp, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodGet, path, &web.HTTPReqOpt{ Username: &storageCreds.Username, Password: &storageCreds.Password, ContentType: web.ContentTypeProtobuf, - Host: web.StorageHostname, }) if err != nil { return nil, fmt.Errorf("failed to fetch storage manifest: %w", err) @@ -349,12 +348,11 @@ func (cli *Client) fetchStorageItemsChunk(ctx context.Context, recordKeys [][]by return nil, fmt.Errorf("failed to marshal read operation: %w", err) } var storageItems signalpb.StorageItems - resp, err := web.SendHTTPRequest(ctx, http.MethodPut, "/v1/storage/read", &web.HTTPReqOpt{ + resp, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodPut, "/v1/storage/read", &web.HTTPReqOpt{ Username: &storageCreds.Username, Password: &storageCreds.Password, Body: body, ContentType: web.ContentTypeProtobuf, - Host: web.StorageHostname, }) if err != nil { return nil, fmt.Errorf("failed to fetch storage records: %w", err) diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index 75e22e1..4c2ac7a 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -569,11 +569,18 @@ func (s *SignalWebsocket) SendRequest( return nil, errors.New("websocket is nil") } headerArray := make([]string, len(headers)) + var hasContentType bool for key, values := range headers { + if strings.ToLower(key) == "content-type" { + hasContentType = true + } for _, value := range values { headerArray = append(headerArray, fmt.Sprintf("%s:%s", strings.ToLower(key), value)) } } + if !hasContentType && body != nil { + headerArray = append(headerArray, "content-type:application/json") + } return s.sendRequestInternal(ctx, &signalpb.WebSocketRequestMessage{ Verb: &method, Path: &path, diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index 3644451..ed3558c 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -34,6 +34,7 @@ import ( "github.com/rs/zerolog" "go.mau.fi/mautrix-signal/pkg/libsignalgo" + signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" ) const proxyUrlStr = "" // Set this to proxy requests @@ -106,25 +107,21 @@ type HTTPReqOpt struct { Username *string Password *string ContentType ContentType - Host string Headers map[string]string OverrideURL string // Override the full URL, if set ignores path and Host } var httpReqCounter = 0 -func SendHTTPRequest(ctx context.Context, method string, path string, opt *HTTPReqOpt) (*http.Response, error) { +func SendHTTPRequest(ctx context.Context, host, method, path string, opt *HTTPReqOpt) (*http.Response, error) { // Set defaults if opt == nil { opt = &HTTPReqOpt{} } - if opt.Host == "" { - opt.Host = APIHostname - } if len(path) > 0 && path[0] != '/' { path = "/" + path } - urlStr := "https://" + opt.Host + path + urlStr := "https://" + host + path if opt.OverrideURL != "" { urlStr = opt.OverrideURL } @@ -169,6 +166,22 @@ func SendHTTPRequest(ctx context.Context, method string, path string, opt *HTTPR return resp, nil } +func DecodeWSResponseBody(ctx context.Context, out any, resp *signalpb.WebSocketResponseMessage) error { + if resp.GetStatus() < 200 || resp.GetStatus() >= 300 { + zerolog.Ctx(ctx).Debug(). + Bytes("body", resp.Body). + Str("resp_message", resp.GetMessage()). + Strs("headers", resp.Headers). + Uint32("status_code", resp.GetStatus()). + Msg("Unexpected status code") + return fmt.Errorf("unexpected response status %d", resp.GetStatus()) + } + if out == nil { + return nil + } + return json.Unmarshal(resp.Body, &out) +} + // DecodeHTTPResponseBody checks status code, reads an http.Response's Body and decodes it into the provided interface. func DecodeHTTPResponseBody(ctx context.Context, out any, resp *http.Response) error { defer resp.Body.Close() @@ -192,37 +205,33 @@ func DecodeHTTPResponseBody(ctx context.Context, out any, resp *http.Response) e return nil } -func GetAttachment(ctx context.Context, path string, cdnNumber uint32, opt *HTTPReqOpt) (*http.Response, error) { +func GetAttachment(ctx context.Context, path string, cdnNumber uint32) (*http.Response, error) { log := zerolog.Ctx(ctx).With(). Str("action", "get_attachment"). Str("path", path). Uint32("cdn_number", cdnNumber). Logger() - if opt == nil { - opt = &HTTPReqOpt{} + var host string + if int(cdnNumber) > len(CDNHosts) { + log.Warn().Msg("Invalid CDN index") + host = CDN1Hostname + } else { + host = CDNHosts[cdnNumber] } - if opt.Host == "" { - if int(cdnNumber) > len(CDNHosts) { - log.Warn().Msg("Invalid CDN index") - opt.Host = CDN1Hostname - } else { - opt.Host = CDNHosts[cdnNumber] - } - if cdnNumber == 0 { - // This is basically a fallback if cdnNumber is not set - // but it also seems to be the right host if cdnNumber == 0 - opt.Host = CDNHosts[0] - } else if cdnNumber > 0 && int(cdnNumber) <= len(CDNHosts) { - // Pull CDN hosts from array (cdnNumber is 1-indexed, but we have a placeholder host at index 0) - // (the 1-indexed is just an assumption, other clients seem to only explicitly handle cdnNumber == 0 and 2) - opt.Host = CDNHosts[cdnNumber] - } else { - opt.Host = CDNHosts[0] - log.Warn().Msg("Invalid CDN index") - } + if cdnNumber == 0 { + // This is basically a fallback if cdnNumber is not set, + // but it also seems to be the right host if cdnNumber == 0 + host = CDNHosts[0] + } else if cdnNumber > 0 && int(cdnNumber) <= len(CDNHosts) { + // Pull CDN hosts from array (cdnNumber is 1-indexed, but we have a placeholder host at index 0) + // (the 1-indexed is just an assumption, other clients seem to only explicitly handle cdnNumber == 0 and 2) + host = CDNHosts[cdnNumber] + } else { + host = CDNHosts[0] + log.Warn().Msg("Invalid CDN index") } - log.Debug().Str("host", opt.Host).Msg("getting attachment") - urlStr := "https://" + opt.Host + path + log.Debug().Str("host", host).Msg("getting attachment") + urlStr := "https://" + host + path req, err := http.NewRequest(http.MethodGet, urlStr, nil) if err != nil { return nil, err From b06ca0eefe590ec05e72636dc9b258c90c21b72e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 24 Nov 2025 16:53:26 +0200 Subject: [PATCH 049/170] handle*: fix bugs with polls --- pkg/connector/handlematrix.go | 24 +++++++++++------------- pkg/connector/handlesignal.go | 2 +- pkg/msgconv/from-matrix.go | 4 +--- pkg/signalmeow/sending.go | 3 ++- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index deb52e3..1dbd48a 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -112,28 +112,25 @@ func getTimestampForEvent(txnID networkid.RawTransactionID, evt *event.Event, or } func (s *SignalClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2.MatrixMessage) (message *bridgev2.MatrixMessageResponse, err error) { - ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) converted, err := s.Main.MsgConv.ToSignal( - ctx, s.Client, msg.Portal, msg.Event, msg.Content, ts, msg.OrigSender != nil, msg.ReplyTo, + ctx, s.Client, msg.Portal, msg.Event, msg.Content, msg.OrigSender != nil, msg.ReplyTo, ) if err != nil { return nil, err } - return s.doSendMessage(ctx, ts, msg, converted, &signalid.MessageMetadata{ + return s.doSendMessage(ctx, msg, converted, &signalid.MessageMetadata{ ContainsAttachments: len(converted.Attachments) > 0, }) } func (s *SignalClient) doSendMessage( ctx context.Context, - ts uint64, msg *bridgev2.MatrixMessage, converted *signalpb.DataMessage, meta *signalid.MessageMetadata, ) (*bridgev2.MatrixMessageResponse, error) { - if ts == 0 { - ts = getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) - } + ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) + converted.Timestamp = &ts if meta == nil { meta = &signalid.MessageMetadata{} } @@ -169,11 +166,12 @@ func (s *SignalClient) HandleMatrixEdit(ctx context.Context, msg *bridgev2.Matri return fmt.Errorf("failed to get message reply target: %w", err) } } - ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) - converted, err := s.Main.MsgConv.ToSignal(ctx, s.Client, msg.Portal, msg.Event, msg.Content, ts, msg.OrigSender != nil, replyTo) + converted, err := s.Main.MsgConv.ToSignal(ctx, s.Client, msg.Portal, msg.Event, msg.Content, msg.OrigSender != nil, replyTo) if err != nil { return err } + ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) + converted.Timestamp = &ts err = s.sendMessage(ctx, msg.Portal.ID, &signalpb.Content{EditMessage: &signalpb.EditMessage{ TargetSentTimestamp: proto.Uint64(targetSentTimestamp), DataMessage: converted, @@ -800,7 +798,7 @@ func (s *SignalClient) HandleMatrixPollStart(ctx context.Context, msg *bridgev2. }, RequiredProtocolVersion: ptr.Ptr(uint32(signalpb.DataMessage_POLLS)), } - return s.doSendMessage(ctx, 0, &msg.MatrixMessage, converted, &signalid.MessageMetadata{ + return s.doSendMessage(ctx, &msg.MatrixMessage, converted, &signalid.MessageMetadata{ MatrixPollOptionIDs: optionIDs, }) } @@ -826,9 +824,9 @@ func (s *SignalClient) HandleMatrixPollVote(ctx context.Context, msg *bridgev2.M TargetAuthorAciBinary: senderACI[:], TargetSentTimestamp: &msgTS, OptionIndexes: optionIndexes, - VoteCount: nil, // TODO + VoteCount: proto.Uint32(1), // TODO }, - RequiredProtocolVersion: ptr.Ptr(uint32(signalpb.DataMessage_POLLS)), + RequiredProtocolVersion: proto.Uint32(0), } - return s.doSendMessage(ctx, 0, &msg.MatrixMessage, converted, nil) + return s.doSendMessage(ctx, &msg.MatrixMessage, converted, nil) } diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index 6a2f3b5..0293a53 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -167,7 +167,7 @@ func (evt *Bv2ChatEvent) GetType() bridgev2.RemoteEventType { case *signalpb.DataMessage: switch { case innerEvt.Body != nil, innerEvt.Attachments != nil, innerEvt.Contact != nil, innerEvt.Sticker != nil, - innerEvt.Payment != nil, innerEvt.GiftBadge != nil, + innerEvt.Payment != nil, innerEvt.GiftBadge != nil, innerEvt.PollCreate != nil, innerEvt.PollVote != nil, innerEvt.GetRequiredProtocolVersion() > uint32(signalpb.DataMessage_CURRENT), innerEvt.GetFlags()&uint32(signalpb.DataMessage_EXPIRATION_TIMER_UPDATE) != 0: return bridgev2.RemoteEventMessage diff --git a/pkg/msgconv/from-matrix.go b/pkg/msgconv/from-matrix.go index 9af4dc5..67352f1 100644 --- a/pkg/msgconv/from-matrix.go +++ b/pkg/msgconv/from-matrix.go @@ -44,7 +44,6 @@ func (mc *MessageConverter) ToSignal( portal *bridgev2.Portal, evt *event.Event, content *event.MessageEventContent, - timestamp uint64, relaybotFormatted bool, replyTo *database.Message, ) (*signalpb.DataMessage, error) { @@ -55,8 +54,7 @@ func (mc *MessageConverter) ToSignal( } dm := &signalpb.DataMessage{ - Timestamp: ×tamp, - Preview: mc.convertURLPreviewToSignal(ctx, content), + Preview: mc.convertURLPreviewToSignal(ctx, content), } if replyTo != nil { authorACI, messageID, err := signalid.ParseMessageID(replyTo.ID) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index ee35cd4..c1c0232 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -824,7 +824,6 @@ func (cli *Client) sendContent( Uint64("timestamp", messageTimestamp). Logger() ctx = log.WithContext(ctx) - log.Trace().Any("raw_content", content).Stringer("recipient", recipient).Msg("Raw data of outgoing message") // If it's a data message, add our profile key if content.DataMessage != nil { @@ -836,6 +835,8 @@ func (cli *Client) sendContent( } } + log.Trace().Any("raw_content", content).Stringer("recipient", recipient).Msg("Raw data of outgoing message") + if retryCount > 3 { log.Error().Int("retry_count", retryCount).Msg("sendContent too many retries") return false, fmt.Errorf("too many retries") From 974259ee3fafd3c2bb2869deeae39ed4a12cd2a2 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 24 Nov 2025 17:38:01 +0200 Subject: [PATCH 050/170] signalmeow/provisioning: remove prekey upload on login They need to be uploaded via the websocket, so easier to let the normal upload flow do it. --- pkg/connector/login.go | 43 ++++--------------------- pkg/signalmeow/keys.go | 57 ++++++++++++++-------------------- pkg/signalmeow/provisioning.go | 31 ++---------------- pkg/signalmeow/receiving.go | 13 ++++---- 4 files changed, 38 insertions(+), 106 deletions(-) diff --git a/pkg/connector/login.go b/pkg/connector/login.go index 12d548d..5cfdae1 100644 --- a/pkg/connector/login.go +++ b/pkg/connector/login.go @@ -52,8 +52,6 @@ type QRLogin struct { cancelChan context.CancelFunc ProvChan chan signalmeow.ProvisioningResponse newQRCount int - - ProvData *store.DeviceData } var _ bridgev2.LoginProcessDisplayAndWait = (*QRLogin)(nil) @@ -112,14 +110,6 @@ func (qr *QRLogin) Wait(ctx context.Context) (*bridgev2.LoginStep, error) { return nil, fmt.Errorf("login not started") } - if qr.ProvData == nil { - return qr.qrWait(ctx) - } else { - return qr.processingWait(ctx) - } -} - -func (qr *QRLogin) qrWait(ctx context.Context) (*bridgev2.LoginStep, error) { select { case resp := <-qr.ProvChan: if resp.Err != nil { @@ -132,15 +122,7 @@ func (qr *QRLogin) qrWait(ctx context.Context) (*bridgev2.LoginStep, error) { qr.cancelChan() return nil, fmt.Errorf("no signal account ID received") } - qr.ProvData = resp.ProvisioningData - return &bridgev2.LoginStep{ - Type: bridgev2.LoginStepTypeDisplayAndWait, - StepID: LoginStepProcess, - Instructions: fmt.Sprintf("Processing login as %s...", resp.ProvisioningData.Number), - DisplayAndWaitParams: &bridgev2.LoginDisplayAndWaitParams{ - Type: bridgev2.LoginDisplayTypeNothing, - }, - }, nil + return qr.loginComplete(ctx, resp.ProvisioningData) // Server will timeout the request after 60 seconds, but Signal Desktop opens // a new socket and gets a new QR code after 45 seconds. We should do the same. @@ -158,26 +140,13 @@ func (qr *QRLogin) qrWait(ctx context.Context) (*bridgev2.LoginStep, error) { } } -func (qr *QRLogin) processingWait(ctx context.Context) (*bridgev2.LoginStep, error) { +func (qr *QRLogin) loginComplete(ctx context.Context, provData *store.DeviceData) (*bridgev2.LoginStep, error) { defer qr.cancelChan() - newLoginID := signalid.MakeUserLoginID(qr.ProvData.ACI) - - select { - case resp := <-qr.ProvChan: - if resp.Err != nil { - return nil, resp.Err - } else if resp.State != signalmeow.StateProvisioningPreKeysRegistered { - return nil, fmt.Errorf("unexpected state %v", resp.State) - } - case <-ctx.Done(): - return nil, ctx.Err() - } - ul, err := qr.User.NewLogin(ctx, &database.UserLogin{ - ID: newLoginID, - RemoteName: qr.ProvData.Number, + ID: signalid.MakeUserLoginID(provData.ACI), + RemoteName: provData.Number, RemoteProfile: status.RemoteProfile{ - Phone: qr.ProvData.Number, + Phone: provData.Number, }, Metadata: &signalid.UserLoginMetadata{}, }, &bridgev2.NewLoginParams{ @@ -190,7 +159,7 @@ func (qr *QRLogin) processingWait(ctx context.Context) (*bridgev2.LoginStep, err return &bridgev2.LoginStep{ Type: bridgev2.LoginStepTypeComplete, StepID: LoginStepComplete, - Instructions: fmt.Sprintf("Successfully logged in as %s / %s", qr.ProvData.Number, qr.ProvData.ACI), + Instructions: fmt.Sprintf("Successfully logged in as %s / %s", provData.Number, provData.ACI), CompleteParams: &bridgev2.LoginCompleteParams{ UserLoginID: ul.ID, UserLogin: ul, diff --git a/pkg/signalmeow/keys.go b/pkg/signalmeow/keys.go index 4756514..19ad1f6 100644 --- a/pkg/signalmeow/keys.go +++ b/pkg/signalmeow/keys.go @@ -22,7 +22,7 @@ import ( "encoding/json" "errors" "fmt" - "math/rand" + "math/rand/v2" "net/http" "strings" "time" @@ -43,25 +43,6 @@ type GeneratedPreKeys struct { IdentityKey []uint8 } -func (cli *Client) GenerateAndRegisterPreKeys(ctx context.Context, pks store.PreKeyStore) error { - _, err := cli.GenerateAndSaveNextPreKeyBatch(ctx, pks, 0) - if err != nil { - return fmt.Errorf("failed to generate and save next prekey batch: %w", err) - } - _, err = cli.GenerateAndSaveNextKyberPreKeyBatch(ctx, pks, 0) - if err != nil { - return fmt.Errorf("failed to generate and save next kyber prekey batch: %w", err) - } - - // We need to upload all currently valid prekeys, not just the ones we just generated - err = cli.RegisterAllPreKeys(ctx, pks) - if err != nil { - return fmt.Errorf("failed to register prekey batches: %w", err) - } - - return err -} - func (cli *Client) RegisterAllPreKeys(ctx context.Context, pks store.PreKeyStore) error { var identityKeyPair *libsignalgo.IdentityKeyPair var pni bool @@ -97,8 +78,10 @@ func (cli *Client) RegisterAllPreKeys(ctx context.Context, pks store.PreKeyStore KyberPreKeys: kyberPreKeys, IdentityKey: identityKey, } - log := zerolog.Ctx(ctx).With().Str("action", "register prekeys").Logger() - log.Debug().Int("num_prekeys", len(preKeys)).Int("num_kyber_prekeys", len(kyberPreKeys)).Msg("Registering prekeys") + zerolog.Ctx(ctx).Debug(). + Int("num_prekeys", len(preKeys)). + Int("num_kyber_prekeys", len(kyberPreKeys)). + Msg("Registering all prekeys") err = cli.RegisterPreKeys(ctx, &generatedPreKeys, pni) if err != nil { return fmt.Errorf("failed to register prekeys: %w", err) @@ -596,23 +579,29 @@ func (cli *Client) keyCheckLoop(ctx context.Context) { log := zerolog.Ctx(ctx).With().Str("action", "start key check loop").Logger() // Do the initial check in 5-10 minutes after starting the loop - window_start := 0 - window_size := 1 + windowStart := 0 + windowSize := 1 + firstRun := true for { - random_minutes_in_window := rand.Intn(window_size) + window_start - check_time := time.Duration(random_minutes_in_window) * time.Minute - log.Debug().Dur("check_time", check_time).Msg("Waiting to check for new prekeys") + randomMinutesInWindow := rand.IntN(windowSize) + windowStart + checkTime := time.Duration(randomMinutesInWindow) * time.Minute + if firstRun { + checkTime = 0 + firstRun = false + } else { + log.Debug().Dur("check_time", checkTime).Msg("Waiting to check for new prekeys") + } select { case <-ctx.Done(): return - case <-time.After(check_time): + case <-time.After(checkTime): err := cli.CheckAndUploadNewPreKeys(ctx, cli.Store.ACIPreKeyStore) if err != nil { log.Err(err).Msg("Error checking and uploading new prekeys for ACI identity") // Retry within half an hour - window_start = 5 - window_size = 25 + windowStart = 5 + windowSize = 25 continue } err = cli.CheckAndUploadNewPreKeys(ctx, cli.Store.PNIPreKeyStore) @@ -628,13 +617,13 @@ func (cli *Client) keyCheckLoop(ctx context.Context) { } log.Err(err).Msg("Error checking and uploading new prekeys for PNI identity") // Retry within half an hour - window_start = 5 - window_size = 25 + windowStart = 5 + windowSize = 25 continue } // After a successful check, check again in 36 to 60 hours - window_start = 36 * 60 - window_size = 24 * 60 + windowStart = 36 * 60 + windowSize = 24 * 60 } } } diff --git a/pkg/signalmeow/provisioning.go b/pkg/signalmeow/provisioning.go index 2343e32..48a8042 100644 --- a/pkg/signalmeow/provisioning.go +++ b/pkg/signalmeow/provisioning.go @@ -22,7 +22,7 @@ import ( "encoding/base64" "encoding/json" "fmt" - mrand "math/rand" + mrand "math/rand/v2" "net/http" "net/url" "time" @@ -54,7 +54,6 @@ const ( StateProvisioningError ProvisioningState = iota StateProvisioningURLReceived StateProvisioningDataReceived - StateProvisioningPreKeysRegistered ) func (s ProvisioningState) String() string { @@ -65,8 +64,6 @@ func (s ProvisioningState) String() string { return "StateProvisioningURLReceived" case StateProvisioningDataReceived: return "StateProvisioningDataReceived" - case StateProvisioningPreKeysRegistered: - return "StateProvisioningPreKeysRegistered" default: return fmt.Sprintf("ProvisioningState(%d)", s) } @@ -128,8 +125,8 @@ func PerformProvisioning(ctx context.Context, deviceStore store.DeviceStore, dev username := *provisioningMessage.Number password := random.String(22) code := provisioningMessage.ProvisioningCode - aciRegistrationID := mrand.Intn(16383) + 1 - pniRegistrationID := mrand.Intn(16383) + 1 + aciRegistrationID := mrand.IntN(16383) + 1 + pniRegistrationID := mrand.IntN(16383) + 1 aciSignedPreKey := GenerateSignedPreKey(1, aciIdentityKeyPair) pniSignedPreKey := GenerateSignedPreKey(1, pniIdentityKeyPair) aciPQLastResortPreKey := GenerateKyberPreKeys(1, 1, aciIdentityKeyPair)[0] @@ -250,28 +247,6 @@ func PerformProvisioning(ctx context.Context, deviceStore store.DeviceStore, dev // Return the provisioning data c <- ProvisioningResponse{State: StateProvisioningDataReceived, ProvisioningData: data} - - // Generate, store, and register prekeys - // TODO hacky client construction - cli := &Client{Store: device} - err = cli.GenerateAndRegisterPreKeys(ctx, device.ACIPreKeyStore) - if err != nil { - c <- ProvisioningResponse{ - State: StateProvisioningError, - Err: fmt.Errorf("error generating and registering ACI prekeys: %w", err), - } - return - } - err = cli.GenerateAndRegisterPreKeys(ctx, device.PNIPreKeyStore) - if err != nil { - c <- ProvisioningResponse{ - State: StateProvisioningError, - Err: fmt.Errorf("error generating and registering PNI prekeys: %w", err), - } - return - } - - c <- ProvisioningResponse{State: StateProvisioningPreKeysRegistered} }() return c } diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 622f18c..7267d0b 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -261,6 +261,12 @@ func (cli *Client) StartReceiveLoops(ctx context.Context) (chan SignalConnection } else { zerolog.Ctx(ctx).Debug().Msg("Successfully registered capabilities") } + // Start loop to check for and upload more prekeys + cli.loopWg.Add(1) + go func() { + defer cli.loopWg.Done() + cli.keyCheckLoop(loopCtx) + }() // TODO hacky if cli.SyncContactsOnConnect { cli.SendContactSyncRequest(loopCtx) @@ -273,13 +279,6 @@ func (cli *Client) StartReceiveLoops(ctx context.Context) (chan SignalConnection } }() - // Start loop to check for and upload more prekeys - cli.loopWg.Add(1) - go func() { - defer cli.loopWg.Done() - cli.keyCheckLoop(loopCtx) - }() - return statusChan, nil } From 7a72795f5d1b2038d30c50d735785371393e84c7 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 24 Nov 2025 17:43:32 +0200 Subject: [PATCH 051/170] signalmeow/receiving: remove redundant loop waiting for websocket connect --- pkg/signalmeow/receiving.go | 49 +++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 7267d0b..2a023ca 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -249,32 +249,29 @@ func (cli *Client) StartReceiveLoops(ctx context.Context) (chan SignalConnection cli.loopWg.Add(1) go func() { defer cli.loopWg.Done() - for { - select { - case <-loopCtx.Done(): - return - case <-initialConnectChan: - log.Info().Msg("Both websockets connected, sending contacts sync request") - err = cli.RegisterCapabilities(ctx) - if err != nil { - zerolog.Ctx(ctx).Err(err).Msg("Failed to register capabilities") - } else { - zerolog.Ctx(ctx).Debug().Msg("Successfully registered capabilities") - } - // Start loop to check for and upload more prekeys - cli.loopWg.Add(1) - go func() { - defer cli.loopWg.Done() - cli.keyCheckLoop(loopCtx) - }() - // TODO hacky - if cli.SyncContactsOnConnect { - cli.SendContactSyncRequest(loopCtx) - } - if cli.Store.MasterKey == nil { - cli.SendStorageMasterKeyRequest(loopCtx) - } - return + select { + case <-loopCtx.Done(): + return + case <-initialConnectChan: + log.Info().Msg("Both websockets connected, sending contacts sync request") + err = cli.RegisterCapabilities(ctx) + if err != nil { + zerolog.Ctx(ctx).Err(err).Msg("Failed to register capabilities") + } else { + zerolog.Ctx(ctx).Debug().Msg("Successfully registered capabilities") + } + // Start loop to check for and upload more prekeys + cli.loopWg.Add(1) + go func() { + defer cli.loopWg.Done() + cli.keyCheckLoop(loopCtx) + }() + // TODO hacky + if cli.SyncContactsOnConnect { + cli.SendContactSyncRequest(loopCtx) + } + if cli.Store.MasterKey == nil { + cli.SendStorageMasterKeyRequest(loopCtx) } } }() From cd598b872197522bdea96c5b6a28af66364232a2 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 24 Nov 2025 17:57:18 +0200 Subject: [PATCH 052/170] signalmeow/web: include server response content in logs --- pkg/signalmeow/web/signalwebsocket.go | 18 ++++++++++++++---- pkg/signalmeow/web/web.go | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index 4c2ac7a..c4172aa 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -19,6 +19,7 @@ package web import ( "context" "encoding/base64" + "encoding/json" "errors" "fmt" "net/http" @@ -454,10 +455,19 @@ func readLoop( Msg("Received response with unknown id") continue } - log.Debug(). - Uint64("response_id", *msg.Response.Id). - Uint32("response_status", *msg.Response.Status). - Msg("Received WS response") + logEvt := log.Debug(). + Uint64("response_id", msg.Response.GetId()). + Uint32("response_status", msg.Response.GetStatus()). + Str("response_message", msg.Response.GetMessage()) + if log.GetLevel() == zerolog.TraceLevel { + logEvt.Strs("response_headers", msg.Response.Headers) + if json.Valid(msg.Response.Body) { + logEvt.RawJSON("response_body", msg.Response.Body) + } else { + logEvt.Str("response_body", base64.StdEncoding.EncodeToString(msg.Response.Body)) + } + } + logEvt.Msg("Received WS response") responseChannel <- msg.Response close(responseChannel) } else if *msg.Type == signalpb.WebSocketMessage_UNKNOWN { diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index ed3558c..cb1efa7 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -168,7 +168,7 @@ func SendHTTPRequest(ctx context.Context, host, method, path string, opt *HTTPRe func DecodeWSResponseBody(ctx context.Context, out any, resp *signalpb.WebSocketResponseMessage) error { if resp.GetStatus() < 200 || resp.GetStatus() >= 300 { - zerolog.Ctx(ctx).Debug(). + zerolog.Ctx(ctx).Warn(). Bytes("body", resp.Body). Str("resp_message", resp.GetMessage()). Strs("headers", resp.Headers). From c54b104b2ec67615f1f6a080646ac9879a26f86b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 24 Nov 2025 18:16:46 +0200 Subject: [PATCH 053/170] signalmeow/sending: remove incorrect check for sync messages --- pkg/signalmeow/sending.go | 50 ++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index c1c0232..d919546 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -623,14 +623,13 @@ func (cli *Client) sendToGroup(ctx context.Context, recipients []*libsignalgo.Se } } - // No need to send to ourselves if we don't have any other devices - if cli.howManyOtherDevicesDoWeHave(ctx) > 0 { - var syncContent *signalpb.Content - if content.GetDataMessage() != nil { - syncContent = syncMessageFromGroupDataMessage(content.DataMessage, result.SuccessfullySentTo) - } else if content.GetEditMessage() != nil { - syncContent = syncMessageFromGroupEditMessage(content.EditMessage, result.SuccessfullySentTo) - } + var syncContent *signalpb.Content + if content.GetDataMessage() != nil { + syncContent = syncMessageFromGroupDataMessage(content.DataMessage, result.SuccessfullySentTo) + } else if content.GetEditMessage() != nil { + syncContent = syncMessageFromGroupEditMessage(content.EditMessage, result.SuccessfullySentTo) + } + if syncContent != nil { _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTimestamp, syncContent, 0, true, true) if selfSendErr != nil { zerolog.Ctx(ctx).Err(selfSendErr).Msg("Failed to send sync message to myself") @@ -649,25 +648,22 @@ func (cli *Client) sendToGroup(ctx context.Context, recipients []*libsignalgo.Se } func (cli *Client) sendSyncCopy(ctx context.Context, content *signalpb.Content, messageTS uint64, result *SuccessfulSendResult) bool { - // If we have other devices, send Sync messages to them too - if cli.howManyOtherDevicesDoWeHave(ctx) > 0 { - var syncContent *signalpb.Content - if content.GetDataMessage() != nil { - syncContent = syncMessageFromSoloDataMessage(content.DataMessage, *result) - } else if content.GetEditMessage() != nil { - syncContent = syncMessageFromSoloEditMessage(content.EditMessage, *result) - } else if content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_READ { - syncContent = syncMessageFromReadReceiptMessage(ctx, content.ReceiptMessage, result.Recipient) - } else if content.GetSyncMessage() != nil { - syncContent = content - } - if syncContent != nil { - _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTS, syncContent, 0, true, false) - if selfSendErr != nil { - zerolog.Ctx(ctx).Err(selfSendErr).Msg("Failed to send sync message to myself") - } else { - return true - } + var syncContent *signalpb.Content + if content.GetDataMessage() != nil { + syncContent = syncMessageFromSoloDataMessage(content.DataMessage, *result) + } else if content.GetEditMessage() != nil { + syncContent = syncMessageFromSoloEditMessage(content.EditMessage, *result) + } else if content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_READ { + syncContent = syncMessageFromReadReceiptMessage(ctx, content.ReceiptMessage, result.Recipient) + } else if content.GetSyncMessage() != nil { + syncContent = content + } + if syncContent != nil { + _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTS, syncContent, 0, true, false) + if selfSendErr != nil { + zerolog.Ctx(ctx).Err(selfSendErr).Msg("Failed to send sync message to myself") + } else { + return true } } return false From edacab163c9031d427d6d8a0d4ed4d1c073b7652 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 24 Nov 2025 18:18:50 +0200 Subject: [PATCH 054/170] client: unlink before disconnecting websocket --- pkg/connector/client.go | 10 +++++----- pkg/signalmeow/web/signalwebsocket.go | 3 ++- pkg/signalmeow/web/web.go | 3 +++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index c85ae35..233ad91 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -78,14 +78,14 @@ func (s *SignalClient) LogoutRemote(ctx context.Context) { if s.Client == nil { return } - err := s.Client.StopReceiveLoops() - if err != nil { - zerolog.Ctx(ctx).Err(err).Msg("Failed to stop receive loops for logout") - } - err = s.Client.Unlink(ctx) + err := s.Client.Unlink(ctx) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to unlink device") } + err = s.Client.StopReceiveLoops() + if err != nil { + zerolog.Ctx(ctx).Err(err).Msg("Failed to stop receive loops for logout") + } err = s.Main.Store.DeleteDevice(context.TODO(), &s.Client.Store.DeviceData) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to delete device from store") diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index c4172aa..38dcc4d 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -619,7 +619,8 @@ func (s *SignalWebsocket) sendRequestInternal( } response := <-responseChannel - if response == nil { + isSelfDelete := request.GetVerb() == http.MethodDelete && strings.HasPrefix(request.GetPath(), "/v1/devices/") + if response == nil && !isSelfDelete { // If out of retries, return error no matter what if retryCount >= 3 { // TODO: I think error isn't getting passed in this context (as it's not the one in writeLoop) diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index cb1efa7..e16d7c7 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -167,6 +167,9 @@ func SendHTTPRequest(ctx context.Context, host, method, path string, opt *HTTPRe } func DecodeWSResponseBody(ctx context.Context, out any, resp *signalpb.WebSocketResponseMessage) error { + if resp == nil { + return nil + } if resp.GetStatus() < 200 || resp.GetStatus() >= 300 { zerolog.Ctx(ctx).Warn(). Bytes("body", resp.Body). From c7b7ea71f81c3c23ae266700b712d9edef01e182 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 25 Nov 2025 15:55:32 +0200 Subject: [PATCH 055/170] main: adjust signalmeow user agent --- cmd/mautrix-signal/main.go | 4 ++++ pkg/signalmeow/web/web.go | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index 522834f..d224f32 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -17,9 +17,12 @@ package main import ( + "fmt" + "maunium.net/go/mautrix/bridgev2/matrix/mxmain" "go.mau.fi/mautrix-signal/pkg/connector" + "go.mau.fi/mautrix-signal/pkg/signalmeow/web" ) // Information to find out exactly which commit the bridge was built from. @@ -41,6 +44,7 @@ var m = mxmain.BridgeMain{ } func main() { + web.UserAgent = fmt.Sprintf("mautrix-signal/%s %s", m.Version, web.BaseUserAgent) m.PostStart = func() { if m.Matrix.Provisioning != nil { m.Matrix.Provisioning.Router.HandleFunc("GET /v2/resolve_identifier/{phonenum}", legacyProvResolveIdentifier) diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index e16d7c7..84a04b9 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -40,7 +40,8 @@ import ( const proxyUrlStr = "" // Set this to proxy requests const caCertPath = "" // Set this to trust a self-signed cert (ie. for mitmproxy) -var UserAgent = "signalmeow/0.1.0 libsignal/" + libsignalgo.Version + " go/" + strings.TrimPrefix(runtime.Version(), "go") +var BaseUserAgent = "libsignal/" + libsignalgo.Version + " go/" + strings.TrimPrefix(runtime.Version(), "go") +var UserAgent = "signalmeow/0.1.0 " + BaseUserAgent var SignalAgent = "MAU" const ( From 60c42c68fc556615ee31003cea0c997f426f1f38 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 25 Nov 2025 20:15:52 +0200 Subject: [PATCH 056/170] signalmeow/groups: fix group cache --- pkg/connector/connector.go | 13 +- pkg/signalmeow/client.go | 31 +++- pkg/signalmeow/groupcache.go | 281 +++++++++++++++++++++++++++++++++++ pkg/signalmeow/groups.go | 120 ++++----------- pkg/signalmeow/profile.go | 8 - pkg/signalmeow/receiving.go | 2 +- pkg/signalmeow/sending.go | 10 +- 7 files changed, 349 insertions(+), 116 deletions(-) create mode 100644 pkg/signalmeow/groupcache.go diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go index 30be4a4..59f8640 100644 --- a/pkg/connector/connector.go +++ b/pkg/connector/connector.go @@ -94,13 +94,12 @@ func (s *SignalConnector) LoadUserLogin(ctx context.Context, login *bridgev2.Use queueEmptyWaiter: exsync.NewEvent(), } if device != nil { - sc.Client = &signalmeow.Client{ - Store: device, - Log: sc.UserLogin.Log.With().Str("component", "signalmeow").Logger(), - EventHandler: sc.handleSignalEvent, - - SyncContactsOnConnect: s.Config.SyncContactsOnStartup, - } + sc.Client = signalmeow.NewClient( + device, + sc.UserLogin.Log.With().Str("component", "signalmeow").Logger(), + sc.handleSignalEvent, + ) + sc.Client.SyncContactsOnConnect = s.Config.SyncContactsOnStartup } login.Client = sc return nil diff --git a/pkg/signalmeow/client.go b/pkg/signalmeow/client.go index ea5eb17..2a7f470 100644 --- a/pkg/signalmeow/client.go +++ b/pkg/signalmeow/client.go @@ -30,6 +30,7 @@ import ( "go.mau.fi/mautrix-signal/pkg/libsignalgo" "go.mau.fi/mautrix-signal/pkg/signalmeow/events" "go.mau.fi/mautrix-signal/pkg/signalmeow/store" + "go.mau.fi/mautrix-signal/pkg/signalmeow/types" "go.mau.fi/mautrix-signal/pkg/signalmeow/web" ) @@ -37,14 +38,14 @@ type Client struct { Store *store.Device Log zerolog.Logger - SenderCertificateWithE164 *libsignalgo.SenderCertificate - SenderCertificateNoE164 *libsignalgo.SenderCertificate - GroupCredentials *GroupCredentials - GroupCache *GroupCache - ProfileCache *ProfileCache - GroupCallCache *map[string]bool - LastContactRequestTime time.Time - SyncContactsOnConnect bool + senderCertificateWithE164 *libsignalgo.SenderCertificate + senderCertificateNoE164 *libsignalgo.SenderCertificate + senderCertificateCache sync.Mutex + + GroupCache *GroupCache + ProfileCache *ProfileCache + LastContactRequestTime time.Time + SyncContactsOnConnect bool encryptionLock sync.Mutex @@ -66,6 +67,20 @@ type Client struct { writeCallbackCounter chan time.Time } +func NewClient(device *store.Device, log zerolog.Logger, evtHandler func(events.SignalEvent) bool) *Client { + return &Client{ + Store: device, + Log: log, + EventHandler: evtHandler, + GroupCache: NewGroupCache(), + ProfileCache: &ProfileCache{ + profiles: make(map[string]*types.Profile), + errors: make(map[string]*error), + lastFetched: make(map[string]time.Time), + }, + } +} + func (cli *Client) handleEvent(evt events.SignalEvent) bool { return cli.EventHandler(evt) } diff --git a/pkg/signalmeow/groupcache.go b/pkg/signalmeow/groupcache.go new file mode 100644 index 0000000..557203a --- /dev/null +++ b/pkg/signalmeow/groupcache.go @@ -0,0 +1,281 @@ +// mautrix-signal - A Matrix-signal puppeting bridge. +// Copyright (C) 2025 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package signalmeow + +import ( + "context" + "fmt" + "slices" + "sync" + "time" + + "github.com/google/uuid" + + "go.mau.fi/mautrix-signal/pkg/libsignalgo" + "go.mau.fi/mautrix-signal/pkg/signalmeow/types" +) + +type cachedGroup struct { + *Group + SendEndorsement []byte + FetchedAt time.Time + UpdatedAt time.Time +} + +type GroupCache struct { + credentials *GroupCredentials + credentialsLock sync.RWMutex + + data map[types.GroupIdentifier]*cachedGroup + lock sync.RWMutex + + activeCalls map[types.GroupIdentifier]string + callsLock sync.RWMutex +} + +func NewGroupCache() *GroupCache { + return &GroupCache{ + data: make(map[types.GroupIdentifier]*cachedGroup), + activeCalls: make(map[types.GroupIdentifier]string), + } +} + +func (gc *GroupCache) GetCredentials( + ctx context.Context, + fetch func(context.Context, time.Time) (*GroupCredentials, error), +) (*GroupCredential, error) { + today := time.Now().Truncate(24 * time.Hour) + gc.credentialsLock.RLock() + cred := gc.getCachedCredentials(today.Unix()) + gc.credentialsLock.RUnlock() + if cred != nil { + return cred, nil + } + + gc.credentialsLock.Lock() + defer gc.credentialsLock.Unlock() + cred = gc.getCachedCredentials(today.Unix()) + if cred != nil { + return cred, nil + } + creds, err := fetch(ctx, today) + if err != nil { + return nil, err + } + gc.credentials = creds + cred = gc.getCachedCredentials(today.Unix()) + if cred == nil { + return nil, fmt.Errorf("no credentials for today after fetch") + } + return cred, nil +} + +func (gc *GroupCache) getCachedCredentials(today int64) *GroupCredential { + if gc.credentials == nil { + return nil + } + for _, cred := range gc.credentials.Credentials { + if cred.RedemptionTime == today { + return &cred + } + } + return nil +} + +func (gc *GroupCache) UpdateActiveCall(id types.GroupIdentifier, callID string) bool { + gc.callsLock.Lock() + defer gc.callsLock.Unlock() + currentCallID, ok := gc.activeCalls[id] + if ok { + // If we do, then this must be ending the call + if currentCallID == callID { + delete(gc.activeCalls, id) + return false + } + } + gc.activeCalls[id] = callID + return true +} + +func (gc *GroupCache) Get(id types.GroupIdentifier) (*Group, bool) { + gc.lock.RLock() + defer gc.lock.RUnlock() + c, ok := gc.data[id] + if !ok { + return nil, false + } + return c.Group, true +} + +func (gc *GroupCache) Delete(id types.GroupIdentifier) { + gc.lock.Lock() + defer gc.lock.Unlock() + delete(gc.data, id) +} + +func (gc *GroupCache) Put(data *Group, endorsementResponse []byte) { + gc.lock.Lock() + defer gc.lock.Unlock() + cached, exists := gc.data[data.GroupIdentifier] + if exists && cached.Revision > data.Revision { + return + } + gc.data[data.GroupIdentifier] = &cachedGroup{ + Group: data, + FetchedAt: time.Now(), + UpdatedAt: time.Now(), + + //SendEndorsement: endorsementResponse, + } +} + +func (gc *GroupCache) ApplyUpdate(change *GroupChange, endorsementResponse []byte) { + rawGroupID, err := masterKeyToBytes(change.GroupMasterKey).GroupIdentifier() + if err != nil { + return + } + id := types.GroupIdentifier(rawGroupID.String()) + + gc.lock.Lock() + defer gc.lock.Unlock() + + cached, exists := gc.data[id] + if !exists || cached.Revision >= change.Revision { + return + } else if cached.Revision < change.Revision-1 { + // We missed an update, evict + delete(gc.data, id) + return + } + + // Pending member adds, promotes and removes + cached.PendingMembers = append(cached.PendingMembers, change.AddPendingMembers...) + for _, promo := range change.PromotePendingMembers { + cached.PendingMembers = slices.DeleteFunc(cached.PendingMembers, func(p *PendingMember) bool { + return p.ServiceID.Type == libsignalgo.ServiceIDTypeACI && p.ServiceID.UUID == promo.ACI + }) + cached.Members = append(cached.Members, &GroupMember{ + ACI: promo.ACI, + ProfileKey: promo.ProfileKey, + Role: GroupMember_DEFAULT, + JoinedAtRevision: change.Revision, + }) + } + for _, promo := range change.PromotePendingPniAciMembers { + cached.PendingMembers = slices.DeleteFunc(cached.PendingMembers, func(p *PendingMember) bool { + return (p.ServiceID.Type == libsignalgo.ServiceIDTypePNI && p.ServiceID.UUID == promo.PNI) || + (p.ServiceID.Type == libsignalgo.ServiceIDTypeACI && p.ServiceID.UUID == promo.ACI) + }) + cached.Members = append(cached.Members, &GroupMember{ + ACI: promo.ACI, + ProfileKey: promo.ProfileKey, + Role: GroupMember_DEFAULT, + JoinedAtRevision: change.Revision, + }) + } + cached.PendingMembers = slices.DeleteFunc(cached.PendingMembers, func(p *PendingMember) bool { + return slices.ContainsFunc(change.DeletePendingMembers, func(s *libsignalgo.ServiceID) bool { + return s != nil && p.ServiceID == *s + }) + }) + + // Requesting member adds, promotes and removes + cached.RequestingMembers = append(cached.RequestingMembers, change.AddRequestingMembers...) + for _, promo := range change.PromoteRequestingMembers { + var profileKey libsignalgo.ProfileKey + cached.RequestingMembers = slices.DeleteFunc(cached.RequestingMembers, func(r *RequestingMember) bool { + if r.ACI == promo.ACI { + profileKey = r.ProfileKey + return true + } + return false + }) + cached.Members = append(cached.Members, &GroupMember{ + ACI: promo.ACI, + ProfileKey: profileKey, + Role: promo.Role, + JoinedAtRevision: change.Revision, + }) + } + cached.RequestingMembers = slices.DeleteFunc(cached.RequestingMembers, func(r *RequestingMember) bool { + return slices.ContainsFunc(change.DeleteRequestingMembers, func(u *uuid.UUID) bool { + return u != nil && r.ACI == *u + }) + }) + + // Direct member adds, removes and modifications + for _, member := range change.AddMembers { + cached.Members = append(cached.Members, &GroupMember{ + ACI: member.ACI, + Role: member.Role, + ProfileKey: member.ProfileKey, + JoinedAtRevision: member.JoinedAtRevision, + }) + } + for _, rm := range change.ModifyMemberRoles { + cached.findMemberOrEmpty(rm.ACI).Role = rm.Role + } + for _, pk := range change.ModifyMemberProfileKeys { + cached.findMemberOrEmpty(pk.ACI).ProfileKey = pk.ProfileKey + } + cached.Members = slices.DeleteFunc(cached.Members, func(member *GroupMember) bool { + return slices.ContainsFunc(change.DeleteMembers, func(u *uuid.UUID) bool { + return u != nil && *u == member.ACI + }) + }) + + // Banned members + cached.BannedMembers = append(cached.BannedMembers, change.AddBannedMembers...) + cached.BannedMembers = slices.DeleteFunc(cached.BannedMembers, func(b *BannedMember) bool { + return slices.ContainsFunc(change.DeleteBannedMembers, func(s *libsignalgo.ServiceID) bool { + return s != nil && b.ServiceID == *s + }) + }) + + // Non-member modifications + if change.ModifyInviteLinkPassword != nil { + cached.InviteLinkPassword = change.ModifyInviteLinkPassword + } + if change.ModifyTitle != nil { + cached.Title = *change.ModifyTitle + } + if change.ModifyDescription != nil { + cached.Description = *change.ModifyDescription + } + if change.ModifyAvatar != nil { + cached.AvatarPath = *change.ModifyAvatar + } + if change.ModifyAnnouncementsOnly != nil { + cached.AnnouncementsOnly = *change.ModifyAnnouncementsOnly + } + if change.ModifyDisappearingMessagesDuration != nil { + cached.DisappearingMessagesDuration = *change.ModifyDisappearingMessagesDuration + } + if change.ModifyAttributesAccess != nil { + cached.AccessControl.Attributes = *change.ModifyAttributesAccess + } + if change.ModifyMemberAccess != nil { + cached.AccessControl.Members = *change.ModifyMemberAccess + } + if change.ModifyAddFromInviteLinkAccess != nil { + cached.AccessControl.AddFromInviteLink = *change.ModifyAddFromInviteLinkAccess + } + + // TODO handle endorsement responses + cached.UpdatedAt = time.Now() + cached.Revision = change.Revision +} diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index 39753bb..f25f835 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -114,6 +114,15 @@ func (group *Group) GetInviteLink() (string, error) { return "https://signal.group/#" + inviteLinkPath, nil } +func (group *Group) findMemberOrEmpty(aci uuid.UUID) *GroupMember { + for _, member := range group.Members { + if member.ACI == aci { + return member + } + } + return &GroupMember{} +} + type GroupAccessControl struct { Members AccessControl AddFromInviteLink AccessControl @@ -328,51 +337,22 @@ func (cli *Client) fetchNewGroupCreds(ctx context.Context, today time.Time) (*Gr log.Err(err).Msg("json.Unmarshal error") return nil, err } - // make sure pni matches device pni if creds.PNI != cli.Store.PNI { - err := fmt.Errorf("creds.PNI != d.PNI") - log.Err(err).Msg("creds.PNI != d.PNI") - return nil, err + return nil, fmt.Errorf("mismatching PNI in group credentials: %s != %s", creds.PNI, cli.Store.PNI) } return &creds, nil } -func (cli *Client) getCachedAuthorizationForToday(today time.Time) *GroupCredential { - if cli.GroupCredentials == nil { - // No cached credentials - return nil - } - allCreds := cli.GroupCredentials - // Get the credential for today - for _, cred := range allCreds.Credentials { - if cred.RedemptionTime == today.Unix() { - return &cred - } - } - return nil -} - func (cli *Client) GetAuthorizationForToday(ctx context.Context, masterKey libsignalgo.GroupMasterKey) (*GroupAuth, error) { log := zerolog.Ctx(ctx).With(). Str("action", "get authorization for today"). Logger() - // Timestamps for the start of today, and 7 days later - today := time.Now().Truncate(24 * time.Hour) - todayCred := cli.getCachedAuthorizationForToday(today) - if todayCred == nil { - creds, err := cli.fetchNewGroupCreds(ctx, today) - if err != nil { - return nil, fmt.Errorf("fetchNewGroupCreds error: %w", err) - } - cli.GroupCredentials = creds - todayCred = cli.getCachedAuthorizationForToday(today) - } - if todayCred == nil { - return nil, fmt.Errorf("couldn't get credential for today") + todayCred, err := cli.GroupCache.GetCredentials(ctx, cli.fetchNewGroupCreds) + if err != nil { + return nil, fmt.Errorf("failed to get group credentials: %w", err) } - //TODO: cache cred after unmarshalling redemptionTime := uint64(todayCred.RedemptionTime) credential := todayCred.Credential authCredentialResponse, err := libsignalgo.NewAuthCredentialWithPniResponse(credential) @@ -674,6 +654,7 @@ func (cli *Client) parseGroupResponse(ctx context.Context, response *http.Respon if err != nil { return nil, fmt.Errorf("failed to decrypt group: %w", err) } + cli.GroupCache.Put(group, groupResponse.GroupSendEndorsementsResponse) // Store the profile keys in case they're new for _, member := range group.Members { @@ -717,22 +698,11 @@ func (cli *Client) DownloadGroupAvatar(ctx context.Context, avatarPath string, g } func (cli *Client) RetrieveGroupByID(ctx context.Context, gid types.GroupIdentifier, revision uint32) (*Group, error) { - cli.initGroupCache() - - lastFetched, ok := cli.GroupCache.lastFetched[gid] - if ok && time.Since(lastFetched) < 1*time.Hour { - group, ok := cli.GroupCache.groups[gid] - if ok && group.Revision >= revision { - return group, nil - } + cached, ok := cli.GroupCache.Get(gid) + if ok && cached.Revision >= revision { + return cached, nil } - group, err := cli.fetchGroupByID(ctx, gid) - if err != nil { - return nil, err - } - cli.GroupCache.groups[gid] = group - cli.GroupCache.lastFetched[gid] = time.Now() - return group, nil + return cli.fetchGroupByID(ctx, gid) } // We should store the group master key in the group store as soon as we see it, @@ -750,40 +720,6 @@ func (cli *Client) StoreMasterKey(ctx context.Context, groupMasterKey types.Seri return groupIdentifier, nil } -// We need to track active calls so we don't send too many IncomingSignalMessageCalls -// Of course for group calls Signal doesn't tell us *anything* so we're mostly just inferring -// So we just jam a new call ID in, and return true if we *think* this is a new incoming call -func (cli *Client) UpdateActiveCalls(gid types.GroupIdentifier, callID string) (isActive bool) { - cli.initGroupCache() - // Check to see if we currently have an active call for this group - currentCallID, ok := cli.GroupCache.activeCalls[gid] - if ok { - // If we do, then this must be ending the call - if currentCallID == callID { - delete(cli.GroupCache.activeCalls, gid) - return false - } - } - cli.GroupCache.activeCalls[gid] = callID - return true -} - -func (cli *Client) initGroupCache() { - if cli.GroupCache == nil { - cli.GroupCache = &GroupCache{ - groups: make(map[types.GroupIdentifier]*Group), - lastFetched: make(map[types.GroupIdentifier]time.Time), - activeCalls: make(map[types.GroupIdentifier]string), - } - } -} - -type GroupCache struct { - groups map[types.GroupIdentifier]*Group - lastFetched map[types.GroupIdentifier]time.Time - activeCalls map[types.GroupIdentifier]string -} - func (cli *Client) DecryptGroupChange(ctx context.Context, groupContext *signalpb.GroupContextV2) (*GroupChange, error) { masterKeyBytes := libsignalgo.GroupMasterKey(groupContext.MasterKey) groupMasterKey := masterKeyFromBytes(masterKeyBytes) @@ -801,6 +737,15 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange log := zerolog.Ctx(ctx).With().Str("action", "decrypt group change").Logger() serverSignature := encryptedGroupChange.ServerSignature encryptedActionsBytes := encryptedGroupChange.Actions + var success bool + defer func() { + if !success { + rawGroupID, _ := masterKeyToBytes(groupMasterKey).GroupIdentifier() + if rawGroupID != nil { + cli.GroupCache.Delete(types.GroupIdentifier(rawGroupID.String())) + } + } + }() var err error if verifySignature { @@ -1103,6 +1048,9 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange decryptedGroupChange.ModifyInviteLinkPassword = &inviteLinkPassword } + success = true + cli.GroupCache.ApplyUpdate(decryptedGroupChange, nil) + return decryptedGroupChange, nil } @@ -1574,9 +1522,7 @@ func (cli *Client) UpdateGroup(ctx context.Context, groupChange *GroupChange, gi return 0, fmt.Errorf("failed to update group: %w", err) } } else if errors.Is(err, ConflictError) { - delete(cli.GroupCache.groups, gid) - delete(cli.GroupCache.lastFetched, gid) - delete(cli.GroupCache.activeCalls, gid) + cli.GroupCache.Delete(gid) group, err = cli.RetrieveGroupByID(ctx, gid, 0) if err != nil { return 0, fmt.Errorf("failed to fetch group after conflict: %w", err) @@ -1590,12 +1536,10 @@ func (cli *Client) UpdateGroup(ctx context.Context, groupChange *GroupChange, gi return 0, fmt.Errorf("unknown error encrypting and signing group change: %w", err) } } - delete(cli.GroupCache.groups, gid) - delete(cli.GroupCache.lastFetched, gid) - delete(cli.GroupCache.activeCalls, gid) if signedGroupChange == nil { return 0, fmt.Errorf("no signed group change returned: %w", err) } + cli.GroupCache.ApplyUpdate(groupChange, signedGroupChange.GroupSendEndorsementsResponse) groupChangeBytes, err := proto.Marshal(signedGroupChange.GroupChange) if err != nil { return 0, fmt.Errorf("failed to marshal signed group change: %w", err) diff --git a/pkg/signalmeow/profile.go b/pkg/signalmeow/profile.go index 4284a8b..f40d6ce 100644 --- a/pkg/signalmeow/profile.go +++ b/pkg/signalmeow/profile.go @@ -134,14 +134,6 @@ func (cli *Client) getCachedProfileByID(signalID uuid.UUID, refreshAfter time.Du } func (cli *Client) RetrieveProfileByID(ctx context.Context, signalID uuid.UUID, refreshAfter time.Duration) (*types.Profile, error) { - if cli.ProfileCache == nil { - cli.ProfileCache = &ProfileCache{ - profiles: make(map[string]*types.Profile), - errors: make(map[string]*error), - lastFetched: make(map[string]time.Time), - } - } - // Check if we have a cached profile that is less than an hour old // or if we have a cached error that is less than an hour old profile, err := cli.getCachedProfileByID(signalID, refreshAfter) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 2a023ca..0feee6b 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -880,7 +880,7 @@ func (cli *Client) incomingDataMessage( } // Hacky special case for group calls to cache the state if dataMessage.GroupCallUpdate != nil { - isRinging := cli.UpdateActiveCalls(groupID, dataMessage.GroupCallUpdate.GetEraId()) + isRinging := cli.GroupCache.UpdateActiveCall(groupID, dataMessage.GroupCallUpdate.GetEraId()) return cli.handleEvent(&events.Call{ Info: evtInfo, Timestamp: dataMessage.GetTimestamp(), diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index d919546..e8dc71f 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -42,15 +42,17 @@ import ( // Sending func (cli *Client) senderCertificate(ctx context.Context, e164 bool) (*libsignalgo.SenderCertificate, error) { - cached := cli.SenderCertificateNoE164 + cli.senderCertificateCache.Lock() + defer cli.senderCertificateCache.Unlock() + cached := cli.senderCertificateNoE164 if e164 { - cached = cli.SenderCertificateWithE164 + cached = cli.senderCertificateWithE164 } setCache := func(val *libsignalgo.SenderCertificate) { if e164 { - cli.SenderCertificateWithE164 = val + cli.senderCertificateWithE164 = val } else { - cli.SenderCertificateNoE164 = val + cli.senderCertificateNoE164 = val } } if cached != nil { From 659222b31bc77729b5b09e3274ee7756547a3ca1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 27 Nov 2025 16:53:59 +0200 Subject: [PATCH 057/170] signalmeow: implement sending with sender keys --- go.mod | 2 +- go.sum | 4 +- pkg/libsignalgo/profilekey.go | 22 +- pkg/libsignalgo/sealedsender.go | 47 ++- pkg/libsignalgo/serviceid.go | 13 + pkg/signalmeow/keys.go | 8 + pkg/signalmeow/senderkey.go | 374 ++++++++++++++++++ pkg/signalmeow/sending.go | 328 +++++++-------- pkg/signalmeow/store/device.go | 2 +- pkg/signalmeow/store/sender_key_store.go | 67 +++- pkg/signalmeow/store/session_store.go | 65 ++- pkg/signalmeow/store/upgrades/00-latest.sql | 9 + .../upgrades/24-outbound-sender-keys.sql | 9 + pkg/signalmeow/web/web.go | 9 +- 14 files changed, 755 insertions(+), 204 deletions(-) create mode 100644 pkg/signalmeow/senderkey.go create mode 100644 pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql diff --git a/go.mod b/go.mod index a1be9e8..0b128b6 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.4-0.20251124151504-71e0e3476592 + go.mau.fi/util v0.9.4-0.20251126134359-7710832c1450 golang.org/x/crypto v0.44.0 golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 golang.org/x/net v0.47.0 diff --git a/go.sum b/go.sum index aeb8cf5..f2d3989 100644 --- a/go.sum +++ b/go.sum @@ -65,8 +65,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.4-0.20251124151504-71e0e3476592 h1:qSGoV3kSle4DJIFNTK7AdA3NP5MuA6tlTvQrCKsY9iU= -go.mau.fi/util v0.9.4-0.20251124151504-71e0e3476592/go.mod h1:krWWfBM1jWTb5f8NCa2TLqWMQuM81X7TGQjhMjBeXmQ= +go.mau.fi/util v0.9.4-0.20251126134359-7710832c1450 h1:sYj7slS8b3sav+hYnC2VXEqRpRS6bVvyuQIUGF85k04= +go.mau.fi/util v0.9.4-0.20251126134359-7710832c1450/go.mod h1:krWWfBM1jWTb5f8NCa2TLqWMQuM81X7TGQjhMjBeXmQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= diff --git a/pkg/libsignalgo/profilekey.go b/pkg/libsignalgo/profilekey.go index 8d2ae04..e49801a 100644 --- a/pkg/libsignalgo/profilekey.go +++ b/pkg/libsignalgo/profilekey.go @@ -23,6 +23,7 @@ package libsignalgo */ import "C" import ( + "encoding/base64" "errors" "runtime" "unsafe" @@ -54,10 +55,6 @@ func (pk *ProfileKey) IsEmpty() bool { return pk == nil || *pk == blankProfileKey } -func (ak *AccessKey) String() string { - return string(ak[:]) -} - func (pv *ProfileKeyVersion) String() string { return string(pv[:]) } @@ -69,6 +66,23 @@ func (pk *ProfileKey) Slice() []byte { return pk[:] } +func (ak *AccessKey) Xor(other *AccessKey) *AccessKey { + if ak == nil { + return other + } else if other == nil { + return ak + } + var result AccessKey + for i := 0; i < C.SignalACCESS_KEY_LEN; i++ { + result[i] = ak[i] ^ other[i] + } + return &result +} + +func (ak *AccessKey) String() string { + return base64.StdEncoding.EncodeToString(ak[:]) +} + func (pk *ProfileKey) GetCommitment(u uuid.UUID) (*ProfileKeyCommitment, error) { c_result := [C.SignalPROFILE_KEY_COMMITMENT_LEN]C.uchar{} c_profileKey := (*[C.SignalPROFILE_KEY_LEN]C.uchar)(unsafe.Pointer(pk)) diff --git a/pkg/libsignalgo/sealedsender.go b/pkg/libsignalgo/sealedsender.go index 1530183..5a55a2c 100644 --- a/pkg/libsignalgo/sealedsender.go +++ b/pkg/libsignalgo/sealedsender.go @@ -24,6 +24,7 @@ import "C" import ( "context" "runtime" + "unsafe" "github.com/google/uuid" ) @@ -78,8 +79,50 @@ func SealedSenderEncrypt(ctx context.Context, usmc *UnidentifiedSenderMessageCon return CopySignalOwnedBufferToBytes(encrypted), nil } -func SealedSenderMultiRecipientEncrypt(messageContent *UnidentifiedSenderMessageContent, forRecipients []*Address, identityStore IdentityKeyStore, sessionStore SessionStore, ctx *CallbackContext) ([]byte, error) { - panic("not implemented") +type SessionAddressTuple struct { + ServiceID ServiceID + DeviceID int + Address *Address + Record *SessionRecord +} + +func SealedSenderMultiRecipientEncrypt( + ctx context.Context, + usmc *UnidentifiedSenderMessageContent, + recipients []SessionAddressTuple, + identityStore IdentityKeyStore, +) ([]byte, error) { + var encrypted C.SignalOwnedBuffer = C.SignalOwnedBuffer{} + callbackCtx := NewCallbackContext(ctx) + defer callbackCtx.Unref() + recipientAddresses := make([]C.SignalConstPointerProtocolAddress, len(recipients)) + recipientSessions := make([]C.SignalConstPointerSessionRecord, len(recipients)) + for i, recipient := range recipients { + recipientAddresses[i] = recipient.Address.constPtr() + recipientSessions[i] = recipient.Record.constPtr() + } + signalFfiError := C.signal_sealed_sender_multi_recipient_encrypt( + &encrypted, + C.SignalBorrowedSliceOfConstPointerProtocolAddress{ + base: unsafe.SliceData(recipientAddresses), + length: C.size_t(len(recipientAddresses)), + }, + C.SignalBorrowedSliceOfConstPointerSessionRecord{ + base: unsafe.SliceData(recipientSessions), + length: C.size_t(len(recipientSessions)), + }, + BytesToBuffer(nil), + usmc.constPtr(), + callbackCtx.wrapIdentityKeyStore(identityStore), + ) + runtime.KeepAlive(usmc) + runtime.KeepAlive(recipients) + runtime.KeepAlive(recipientAddresses) + runtime.KeepAlive(recipientSessions) + if signalFfiError != nil { + return nil, callbackCtx.wrapError(signalFfiError) + } + return CopySignalOwnedBufferToBytes(encrypted), nil } type SealedSenderResult struct { diff --git a/pkg/libsignalgo/serviceid.go b/pkg/libsignalgo/serviceid.go index 19513de..6b0c864 100644 --- a/pkg/libsignalgo/serviceid.go +++ b/pkg/libsignalgo/serviceid.go @@ -118,6 +118,19 @@ func (s ServiceID) GoString() string { return fmt.Sprintf(`libsignalgo.ServiceID{Type: %#v, UUID: uuid.MustParse("%s")}`, s.Type, s.UUID) } +func (s ServiceID) MarshalText() ([]byte, error) { + return []byte(s.String()), nil +} + +func (s *ServiceID) UnmarshalText(text []byte) error { + parsed, err := ServiceIDFromString(string(text)) + if err != nil { + return err + } + *s = parsed + return nil +} + func (s ServiceID) MarshalZerologObject(e *zerolog.Event) { e.Stringer("type", s.Type) e.Stringer("uuid", s.UUID) diff --git a/pkg/signalmeow/keys.go b/pkg/signalmeow/keys.go index 19ad1f6..724565a 100644 --- a/pkg/signalmeow/keys.go +++ b/pkg/signalmeow/keys.go @@ -404,16 +404,24 @@ func addBase64PaddingAndDecode(data string) ([]byte, error) { return base64.StdEncoding.DecodeString(data) } +var ( + ErrUnregisteredUser = errors.New("got 404 when fetching prekey, user is unregistered") + ErrDevicesChanged = errors.New("device list changed while sending skdm") +) + func (cli *Client) FetchAndProcessPreKey(ctx context.Context, theirServiceID libsignalgo.ServiceID, specificDeviceID int) error { // Fetch prekey deviceIDPath := "/*" if specificDeviceID >= 0 { deviceIDPath = "/" + fmt.Sprint(specificDeviceID) } + // TODO this should be done via the unauthed websocket if possible path := "/v2/keys/" + theirServiceID.String() + deviceIDPath + "?pq=true" resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, path, nil, nil) if err != nil { return fmt.Errorf("error sending request: %w", err) + } else if resp.GetStatus() == 404 { + return ErrUnregisteredUser } var respData prekeyResponse err = web.DecodeWSResponseBody(ctx, &respData, resp) diff --git a/pkg/signalmeow/senderkey.go b/pkg/signalmeow/senderkey.go new file mode 100644 index 0000000..133ef80 --- /dev/null +++ b/pkg/signalmeow/senderkey.go @@ -0,0 +1,374 @@ +// mautrix-signal - A Matrix-signal puppeting bridge. +// Copyright (C) 2025 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package signalmeow + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "maps" + "net/http" + "slices" + "time" + + "github.com/google/uuid" + "github.com/rs/zerolog" + "go.mau.fi/util/exslices" + "google.golang.org/protobuf/proto" + + "go.mau.fi/mautrix-signal/pkg/libsignalgo" + signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" + "go.mau.fi/mautrix-signal/pkg/signalmeow/store" + "go.mau.fi/mautrix-signal/pkg/signalmeow/types" + "go.mau.fi/mautrix-signal/pkg/signalmeow/web" +) + +const SenderKeyMaxAge = 14 * 24 * time.Hour + +type contextKey int + +const ( + contextKeyEncryptionLock contextKey = iota +) + +func (cli *Client) sendToGroupWithSenderKey( + ctx context.Context, + groupID types.GroupIdentifier, + allRecipients []libsignalgo.ServiceID, + content *signalpb.Content, + messageTimestamp uint64, + retries int, +) (*GroupMessageSendResult, error) { + if retries >= 3 { + return cli.sendToGroup(ctx, allRecipients, content, messageTimestamp, nil) + } + myAddress, err := cli.Store.ACIServiceID().Address(uint(cli.Store.DeviceID)) + if err != nil { + return nil, fmt.Errorf("failed to get own address: %w", err) + } + log := zerolog.Ctx(ctx) + + cli.encryptionLock.Lock() + unlocked := false + doUnlock := func() { + if !unlocked { + unlocked = true + cli.encryptionLock.Unlock() + } + } + defer doUnlock() + ctx = context.WithValue(ctx, contextKeyEncryptionLock, true) + result := &GroupMessageSendResult{ + SuccessfullySentTo: make([]SuccessfulSendResult, 0), + FailedToSendTo: make([]FailedSendResult, 0), + } + + deviceIDs, senderKeyRecipients, fallbackRecipients := cli.getDevicesIDs(ctx, allRecipients, result) + ski, err := cli.Store.SenderKeyStore.GetSenderKeyInfo(ctx, groupID) + if err != nil { + return nil, fmt.Errorf("failed to get sender key info: %w", err) + } else if ski == nil || time.Since(ski.CreatedAt) > SenderKeyMaxAge { + if ski != nil && time.Since(ski.CreatedAt) > SenderKeyMaxAge { + log.Debug().Any("old_sender_key_info", ski).Msg("Sender key expired, creating new one") + err = cli.Store.SenderKeyStore.DeleteSenderKey(ctx, myAddress, ski.DistributionID) + if err != nil { + return nil, fmt.Errorf("failed to delete old sender key: %w", err) + } + } else { + log.Debug().Msg("No existing sender key, creating new one") + } + ski = &store.SenderKeyInfo{ + DistributionID: uuid.New(), + CreatedAt: time.Now(), + SharedWith: make(map[libsignalgo.ServiceID][]int), + } + } else { + log.Debug().Any("sender_key_info", ski).Msg("Reusing existing sender key") + } + xak, devicesAddedTo, reset := diffRecipients(ski.SharedWith, deviceIDs) + if reset { + log.Debug().Msg("Resetting sender key due to recipient device changes") + devicesAddedTo = slices.Collect(maps.Keys(deviceIDs)) + err = cli.Store.SenderKeyStore.DeleteSenderKey(ctx, myAddress, ski.DistributionID) + if err != nil { + return nil, fmt.Errorf("failed to delete old sender key: %w", err) + } + } + if len(devicesAddedTo) > 0 { + log.Debug(). + Any("devices_added_to", devicesAddedTo). + Msg("Sending sender key distribution message to users with new devices") + skdm, err := libsignalgo.NewSenderKeyDistributionMessage(ctx, myAddress, ski.DistributionID, cli.Store.SenderKeyStore) + if err != nil { + return nil, fmt.Errorf("failed to create sender key distribution message: %w", err) + } + skdmBytes, err := skdm.Serialize() + if err != nil { + return nil, fmt.Errorf("failed to serialize sender key distribution message: %w", err) + } + var needsRetry bool + for _, recipient := range devicesAddedTo { + log := log.With().Str("subaction", "skdm").Stringer("recipient_id", recipient).Logger() + _, err = cli.sendContent(log.WithContext(ctx), recipient, messageTimestamp, &signalpb.Content{ + SenderKeyDistributionMessage: skdmBytes, + }, 0, true, true) + if errors.Is(err, ErrDevicesChanged) || errors.Is(err, ErrUnregisteredUser) { + log.Warn().Err(err).Msg("Failed to send sender key distribution message due to device changes, will retry") + needsRetry = true + } else if err != nil { + log.Err(err).Msg("Failed to send sender key distribution message") + fallbackRecipients = append(fallbackRecipients, recipient) + delete(deviceIDs, recipient) + senderKeyRecipients = slices.DeleteFunc(senderKeyRecipients, func(tuple store.SessionAddressTuple) bool { + return tuple.ServiceID == recipient + }) + } else { + log.Debug().Msg("Successfully sent sender key distribution message") + ski.SharedWith[recipient] = deviceIDs[recipient].DeviceIDs + } + } + err = cli.Store.SenderKeyStore.PutSenderKeyInfo(ctx, groupID, ski) + if err != nil { + return nil, fmt.Errorf("failed to store updated sender key info: %w", err) + } + if needsRetry { + doUnlock() + return cli.sendToGroupWithSenderKey(ctx, groupID, allRecipients, content, messageTimestamp, retries+1) + } + } + ssCiphertext, err := cli.encryptWithSenderKey(ctx, groupID, ski.DistributionID, myAddress, senderKeyRecipients, content) + if err != nil { + return nil, err + } + header := http.Header{} + header.Set("Content-Type", string(web.ContentTypeMultiRecipientMessage)) + //if groupSendToken != nil { + // header.Set("Group-Send-Token", groupSendToken.String()) + //} else { + header.Set("Unidentified-Access-Key", xak.String()) + //} + path := fmt.Sprintf( + "/v1/messages/multi_recipient?ts=%d&urgent=%t&online=false", + messageTimestamp, isUrgent(content), + ) + log.Debug(). + Any("recipients", ski.SharedWith). + Any("fallback_recipients", fallbackRecipients). + Msg("Sending multi-recipient message with sender key") + resp, err := cli.UnauthedWS.SendRequest(ctx, http.MethodPut, path, ssCiphertext, header) + switch resp.GetStatus() { + case 200: + var respData MultiRecipient200Response + err = json.Unmarshal(resp.Body, &respData) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal 200 response: %w", err) + } + log.Debug(). + Any("response_data", respData). + Msg("Got successful multi-recipient send response") + for serviceID := range deviceIDs { + if slices.Contains(respData.UUIDs404, serviceID) { + // TODO flag recipient as unregistered + err = cli.Store.ACISessionStore.RemoveAllSessionsForServiceID(ctx, serviceID) + if err != nil { + log.Err(err).Stringer("recipient_id", serviceID). + Msg("Failed to remove sessions after 404") + } + result.FailedToSendTo = append(result.FailedToSendTo, FailedSendResult{ + Recipient: serviceID, + Error: fmt.Errorf("multi-recipient send 404"), + }) + } else { + result.SuccessfullySentTo = append(result.SuccessfullySentTo, SuccessfulSendResult{ + Recipient: serviceID, + Unidentified: true, + }) + } + } + doUnlock() + // Send with fallback for any recipients that couldn't do sender key, plus our own sync copy + return cli.sendToGroup(ctx, fallbackRecipients, content, messageTimestamp, result) + case 401, 404: + log.Warn().Uint32("status_code", resp.GetStatus()). + Msg("Multi-recipient send failed, falling back to normal send") + doUnlock() + // Fall back to normal send for all recipients + return cli.sendToGroup(ctx, allRecipients, content, messageTimestamp, nil) + case 409, 410: + log.Warn().Uint32("status_code", resp.GetStatus()). + Msg("Multi-recipient send failed due to outdated device list, refreshing and retrying") + err = cli.handleMultiRecipient409410Response(ctx, resp) + if err != nil { + return nil, err + } + doUnlock() + // Retry recursively after fixing device lists + return cli.sendToGroupWithSenderKey(ctx, groupID, allRecipients, content, messageTimestamp, retries+1) + default: + return nil, fmt.Errorf("unexpected status code %d in multi-recipient send", resp.GetStatus()) + } +} + +func (cli *Client) encryptWithSenderKey( + ctx context.Context, + groupID types.GroupIdentifier, + distributionID uuid.UUID, + myAddress *libsignalgo.Address, + senderKeyRecipients []store.SessionAddressTuple, + content *signalpb.Content, +) ([]byte, error) { + plaintext, err := proto.Marshal(content) + if err != nil { + return nil, fmt.Errorf("failed to marshal content: %w", err) + } + plaintext, err = addPadding(3, plaintext) + if err != nil { + return nil, fmt.Errorf("failed to add padding: %w", err) + } + ciphertext, err := libsignalgo.GroupEncrypt(ctx, plaintext, myAddress, distributionID, cli.Store.SenderKeyStore) + if err != nil { + return nil, fmt.Errorf("failed to encrypt group message: %w", err) + } + cert, err := cli.senderCertificate(ctx, false) + if err != nil { + return nil, fmt.Errorf("failed to get sender certificate: %w", err) + } + groupIDBytes, err := groupID.Bytes() + if err != nil { + return nil, fmt.Errorf("failed to deserialize group ID: %w", err) + } + usmc, err := libsignalgo.NewUnidentifiedSenderMessageContent(ciphertext, cert, getContentHint(content), groupIDBytes[:]) + if err != nil { + return nil, fmt.Errorf("failed to create unidentified sender message content: %w", err) + } + ssCiphertext, err := libsignalgo.SealedSenderMultiRecipientEncrypt(ctx, usmc, senderKeyRecipients, cli.Store.ACIIdentityStore) + if err != nil { + return nil, fmt.Errorf("failed to create sealed sender multi-recipient message: %w", err) + } + return ssCiphertext, nil +} + +func diffRecipients( + prevDevices map[libsignalgo.ServiceID][]int, newDevices map[libsignalgo.ServiceID]senderKeySendMeta, +) ( + xak *libsignalgo.AccessKey, devicesAddedTo []libsignalgo.ServiceID, reset bool, +) { + collector := make(map[libsignalgo.ServiceID]uint8, max(len(prevDevices), len(newDevices))) + for key := range prevDevices { + collector[key] |= 0b01 + } + for key := range newDevices { + collector[key] |= 0b10 + } + for serviceID, mask := range collector { + if mask != 0b01 { + xak = xak.Xor(newDevices[serviceID].AccessKey) + } + switch mask { + case 0b01: + // Someone left the group + reset = true + case 0b10: + // Someone was added to the group + devicesAddedTo = append(devicesAddedTo, serviceID) + case 0b11: + removedDevices, addedDevices := exslices.Diff(prevDevices[serviceID], newDevices[serviceID].DeviceIDs) + if len(removedDevices) > 0 { + // Device was removed + reset = true + } else if len(addedDevices) > 0 { + // User got new devices + devicesAddedTo = append(devicesAddedTo, serviceID) + } + } + } + return +} + +type senderKeySendMeta struct { + DeviceIDs []int + AccessKey *libsignalgo.AccessKey +} + +func (cli *Client) getDevicesIDs(ctx context.Context, recipients []libsignalgo.ServiceID, result *GroupMessageSendResult) ( + map[libsignalgo.ServiceID]senderKeySendMeta, []store.SessionAddressTuple, []libsignalgo.ServiceID, +) { + log := zerolog.Ctx(ctx) + out := make(map[libsignalgo.ServiceID]senderKeySendMeta) + fallbackRecipients := recipients[:0] + senderKeyRecipients := make([]store.SessionAddressTuple, 0, len(recipients)) + for _, recipient := range recipients { + if recipient == cli.Store.ACIServiceID() { + // We'll send a sync copy to ourselves, not sender key and no need to include in fallback recipients either + continue + } + fallbackRecipients = append(fallbackRecipients, recipient) + if recipient.Type != libsignalgo.ServiceIDTypeACI { + continue + } + profileKey, err := cli.Store.RecipientStore.LoadProfileKey(ctx, recipient.UUID) + if err != nil { + log.Err(err).Stringer("recipient_id", recipient.UUID).Msg("Failed to get profile key") + continue + } else if profileKey == nil { + log.Debug().Stringer("recipient_id", recipient.UUID).Msg("No profile key for recipient") + continue + } + accessKey, err := profileKey.DeriveAccessKey() + if err != nil { + log.Err(err).Stringer("recipient_id", recipient.UUID).Msg("Failed to derive access key") + continue + } + sessions, err := cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, recipient) + if err == nil && len(sessions) == 0 { + // No sessions, make one with prekey + err = cli.FetchAndProcessPreKey(ctx, recipient, -1) + if errors.Is(err, ErrUnregisteredUser) { + fallbackRecipients = fallbackRecipients[:len(fallbackRecipients)-1] + result.FailedToSendTo = append(result.FailedToSendTo, FailedSendResult{ + Recipient: recipient, + Error: err, + }) + log.Debug(). + Stringer("recipient_id", recipient). + Msg("Recipient is not registered, won't try to send") + continue + } else if err != nil { + log.Warn().Err(err).Stringer("recipient_id", recipient.UUID).Msg("Failed to fetch keys for recipient") + continue + } + sessions, err = cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, recipient) + } + if err != nil { + log.Err(err).Stringer("recipient_id", recipient.UUID).Msg("Failed to get sessions for recipient") + continue + } else if len(sessions) == 0 { + log.Debug().Stringer("recipient_id", recipient.UUID).Msg("No sessions for recipient after fetching keys") + continue + } + fallbackRecipients = fallbackRecipients[:len(fallbackRecipients)-1] + out[recipient] = senderKeySendMeta{ + DeviceIDs: exslices.CastFunc(sessions, func(from store.SessionAddressTuple) int { + return from.DeviceID + }), + AccessKey: accessKey, + } + senderKeyRecipients = append(senderKeyRecipients, sessions...) + } + return out, senderKeyRecipients, fallbackRecipients +} diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index e8dc71f..d9fd831 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -143,72 +143,39 @@ func addPadding(version uint32, contents []byte) ([]byte, error) { } } -func checkForErrorWithSessions(err error, addresses []*libsignalgo.Address, sessionRecords []*libsignalgo.SessionRecord) error { - if err != nil { - return err +func (cli *Client) buildMessagesToSend( + ctx context.Context, + recipient libsignalgo.ServiceID, + content *signalpb.Content, + unauthenticated, isGroup bool, +) ([]MyMessage, error) { + if ctx.Value(contextKeyEncryptionLock) != true { + cli.encryptionLock.Lock() + defer cli.encryptionLock.Unlock() } - if addresses == nil || sessionRecords == nil { - return fmt.Errorf("addresses or session records are nil") - } - if len(addresses) != len(sessionRecords) { - return fmt.Errorf("mismatched number of addresses (%d) and session records (%d)", len(addresses), len(sessionRecords)) - } - if len(addresses) == 0 || len(sessionRecords) == 0 { - return fmt.Errorf("no addresses or session records") - } - return nil -} -func (cli *Client) howManyOtherDevicesDoWeHave(ctx context.Context) int { - addresses, _, err := cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, cli.Store.ACIServiceID()) - if err != nil { - return 0 - } - // Filter out our deviceID - otherDevices := 0 - for _, address := range addresses { - deviceID, err := address.DeviceID() - if err != nil { - zerolog.Ctx(ctx).Err(err).Msg("Error getting deviceID from address") - continue - } - if deviceID != uint(cli.Store.DeviceID) { - otherDevices++ - } - } - return otherDevices -} - -func (cli *Client) buildMessagesToSend(ctx context.Context, recipient libsignalgo.ServiceID, content *signalpb.Content, unauthenticated, isGroup bool) ([]MyMessage, error) { - // We need to prevent multiple encryption operations from happening at once, or else ratchets can race - cli.encryptionLock.Lock() - defer cli.encryptionLock.Unlock() - - addresses, sessionRecords, err := cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, recipient) - if err == nil && (len(addresses) == 0 || len(sessionRecords) == 0) { + sessions, err := cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, recipient) + if err == nil && len(sessions) == 0 { // No sessions, make one with prekey err = cli.FetchAndProcessPreKey(ctx, recipient, -1) if err != nil { + // TODO flag 404s as unregistered return nil, err } - addresses, sessionRecords, err = cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, recipient) + sessions, err = cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, recipient) } - err = checkForErrorWithSessions(err, addresses, sessionRecords) if err != nil { return nil, err + } else if len(sessions) == 0 { + return nil, fmt.Errorf("no sessions found for recipient %s", recipient.String()) } - messages := make([]MyMessage, 0, len(addresses)) - for i, recipientAddress := range addresses { - recipientDeviceID, err := recipientAddress.DeviceID() - if err != nil { - return nil, err - } - + messages := make([]MyMessage, 0, len(sessions)) + for _, tuple := range sessions { // Don't send to this device that we are sending from - if recipient == cli.Store.ACIServiceID() && recipientDeviceID == uint(cli.Store.DeviceID) { + if recipient == cli.Store.ACIServiceID() && tuple.DeviceID == cli.Store.DeviceID { zerolog.Ctx(ctx).Debug(). - Uint("recipient_device_id", recipientDeviceID). + Int("recipient_device_id", tuple.DeviceID). Msg("Not sending to the device I'm sending from") continue } @@ -222,29 +189,28 @@ func (cli *Client) buildMessagesToSend(ctx context.Context, recipient libsignalg if err != nil { return nil, err } - sessionRecord := sessionRecords[i] var envelopeType int var encryptedPayload []byte if unauthenticated { includeE164 := !isGroup && cli.Store.AccountRecord.GetPhoneNumberSharingMode() == signalpb.AccountRecord_EVERYBODY envelopeType, encryptedPayload, err = cli.buildSSMessageToSend( - ctx, recipientAddress, paddedMessage, getContentHint(content), includeE164, + ctx, tuple.Address, paddedMessage, getContentHint(content), includeE164, ) } else { - envelopeType, encryptedPayload, err = cli.buildAuthedMessageToSend(ctx, recipientAddress, paddedMessage) + envelopeType, encryptedPayload, err = cli.buildAuthedMessageToSend(ctx, tuple.Address, paddedMessage) } if err != nil { return nil, err } - destinationRegistrationID, err := sessionRecord.GetRemoteRegistrationID() + destinationRegistrationID, err := tuple.Record.GetRemoteRegistrationID() if err != nil { return nil, err } outgoingMessage := MyMessage{ Type: envelopeType, - DestinationDeviceID: int(recipientDeviceID), + DestinationDeviceID: tuple.DeviceID, DestinationRegistrationID: int(destinationRegistrationID), Content: base64.StdEncoding.EncodeToString(encryptedPayload), } @@ -549,26 +515,28 @@ func (cli *Client) SendGroupUpdate(ctx context.Context, group *Group, groupConte GroupV2: groupContext, } content := wrapDataMessageInContent(dm) - var recipients []*libsignalgo.ServiceID + var recipients []libsignalgo.ServiceID for _, member := range group.Members { serviceID := member.UserServiceID() - recipients = append(recipients, &serviceID) + recipients = append(recipients, serviceID) } for _, member := range group.PendingMembers { - recipients = append(recipients, &member.ServiceID) + recipients = append(recipients, member.ServiceID) } if groupChange != nil { for _, member := range groupChange.AddPendingMembers { - recipients = append(recipients, &member.ServiceID) + recipients = append(recipients, member.ServiceID) } for _, member := range groupChange.AddMembers { serviceID := member.UserServiceID() - recipients = append(recipients, &serviceID) + recipients = append(recipients, serviceID) } } - return cli.sendToGroup(ctx, recipients, content, timestamp) + return cli.sendToGroup(ctx, recipients, content, timestamp, nil) } +const enableSenderKeySend = false + func (cli *Client) SendGroupMessage(ctx context.Context, gid types.GroupIdentifier, content *signalpb.Content) (*GroupMessageSendResult, error) { log := zerolog.Ctx(ctx).With(). Str("action", "send group message"). @@ -587,44 +555,83 @@ func (cli *Client) SendGroupMessage(ctx context.Context, gid types.GroupIdentifi } else if content.GetEditMessage().GetDataMessage() != nil { messageTimestamp = content.EditMessage.DataMessage.GetTimestamp() content.EditMessage.DataMessage.GroupV2 = groupMetadataForDataMessage(*group) + } else if content.GetTypingMessage() != nil { + messageTimestamp = content.TypingMessage.GetTimestamp() + groupIDBytes, err := group.GroupIdentifier.Bytes() + if err != nil { + return nil, err + } + content.TypingMessage.GroupId = groupIDBytes[:] } - var recipients []*libsignalgo.ServiceID + var recipients []libsignalgo.ServiceID for _, member := range group.Members { - serviceID := member.UserServiceID() - recipients = append(recipients, &serviceID) + recipients = append(recipients, member.UserServiceID()) } - return cli.sendToGroup(ctx, recipients, content, messageTimestamp) + if enableSenderKeySend { + return cli.sendToGroupWithSenderKey(ctx, gid, recipients, content, messageTimestamp, 0) + } + return cli.sendToGroup(ctx, recipients, content, messageTimestamp, nil) } -func (cli *Client) sendToGroup(ctx context.Context, recipients []*libsignalgo.ServiceID, content *signalpb.Content, messageTimestamp uint64) (*GroupMessageSendResult, error) { - // Send to each member of the group - result := &GroupMessageSendResult{ - SuccessfullySentTo: []SuccessfulSendResult{}, - FailedToSendTo: []FailedSendResult{}, +func (cli *Client) sendToGroup( + ctx context.Context, + recipients []libsignalgo.ServiceID, + content *signalpb.Content, + messageTimestamp uint64, + result *GroupMessageSendResult, +) (*GroupMessageSendResult, error) { + if result == nil { + result = &GroupMessageSendResult{ + SuccessfullySentTo: []SuccessfulSendResult{}, + FailedToSendTo: []FailedSendResult{}, + } + } + if content.TypingMessage != nil { + // Never send typing messages via fallback path + return result, nil } for _, recipient := range recipients { if recipient.Type == libsignalgo.ServiceIDTypeACI && recipient.UUID == cli.Store.ACI { // Don't send normal DataMessages to ourselves continue } - log := zerolog.Ctx(ctx).With().Stringer("member", *recipient).Logger() + log := zerolog.Ctx(ctx).With().Stringer("member", recipient).Logger() ctx := log.WithContext(ctx) - sentUnidentified, err := cli.sendContent(ctx, *recipient, messageTimestamp, content, 0, true, true) + sentUnidentified, err := cli.sendContent(ctx, recipient, messageTimestamp, content, 0, true, true) if err != nil { result.FailedToSendTo = append(result.FailedToSendTo, FailedSendResult{ - Recipient: *recipient, + Recipient: recipient, Error: err, }) log.Err(err).Msg("Failed to send to user") } else { result.SuccessfullySentTo = append(result.SuccessfullySentTo, SuccessfulSendResult{ - Recipient: *recipient, + Recipient: recipient, Unidentified: sentUnidentified, }) log.Trace().Msg("Successfully sent to user") } } + cli.sendGroupSyncCopy(ctx, content, messageTimestamp, result) + + if len(result.FailedToSendTo) == 0 && len(result.SuccessfullySentTo) == 0 { + return result, nil // I only sent to myself + } + if len(result.SuccessfullySentTo) == 0 { + lastError := result.FailedToSendTo[len(result.FailedToSendTo)-1].Error + return nil, fmt.Errorf("failed to send to any group members: %w", lastError) + } + + return result, nil +} + +func (cli *Client) sendGroupSyncCopy( + ctx context.Context, + content *signalpb.Content, + messageTimestamp uint64, + result *GroupMessageSendResult, +) { var syncContent *signalpb.Content if content.GetDataMessage() != nil { syncContent = syncMessageFromGroupDataMessage(content.DataMessage, result.SuccessfullySentTo) @@ -637,16 +644,6 @@ func (cli *Client) sendToGroup(ctx context.Context, recipients []*libsignalgo.Se zerolog.Ctx(ctx).Err(selfSendErr).Msg("Failed to send sync message to myself") } } - - if len(result.FailedToSendTo) == 0 && len(result.SuccessfullySentTo) == 0 { - return result, nil // I only sent to myself - } - if len(result.SuccessfullySentTo) == 0 { - lastError := result.FailedToSendTo[len(result.FailedToSendTo)-1].Error - return nil, fmt.Errorf("failed to send to any group members: %w", lastError) - } - - return result, nil } func (cli *Client) sendSyncCopy(ctx context.Context, content *signalpb.Content, messageTS uint64, result *SuccessfulSendResult) bool { @@ -862,6 +859,9 @@ func (cli *Client) sendContent( useUnidentifiedSender = false } } + if !useUnidentifiedSender && content.SenderKeyDistributionMessage != nil { + return false, fmt.Errorf("won't send sender key distribution message without sealed sender") + } var messages []MyMessage messages, err = cli.buildMessagesToSend(ctx, recipient, content, useUnidentifiedSender, isGroup) @@ -887,7 +887,7 @@ func (cli *Client) sendContent( header.Set("Content-Type", string(web.ContentTypeJSON)) if useUnidentifiedSender { log.Trace().Msg("Sending message over unidentified WS") - header.Set("Unidentified-Access-Key", base64.StdEncoding.EncodeToString(accessKey[:])) + header.Set("Unidentified-Access-Key", accessKey.String()) response, err = cli.UnauthedWS.SendRequest(ctx, http.MethodPut, path, jsonBytes, header) } else { log.Trace().Msg("Sending message over authed WS") @@ -921,11 +921,14 @@ func (cli *Client) sendContent( } if needToRetry { - var err error - if *response.Status == 409 { - err = cli.handle409(ctx, recipient, response) - } else if *response.Status == 410 { - err = cli.handle410(ctx, recipient, response) + if *response.Status == 409 || *response.Status == 410 { + err = cli.handleSingleRecipient409410Response(ctx, recipient, response) + if content.SenderKeyDistributionMessage != nil { + if err == nil { + err = ErrDevicesChanged + } + return false, err + } } else if *response.Status == 428 { err = cli.handle428(ctx, recipient, response) } @@ -939,6 +942,9 @@ func (cli *Client) sendContent( return sentUnidentified, err } } else if *response.Status == 401 && useUnidentifiedSender { + if content.SenderKeyDistributionMessage != nil { + return sentUnidentified, fmt.Errorf("unauthorized to send sender key distribution message via sealed sender") + } log.Debug().Msg("Retrying send without sealed sender") // Try to send again (**RECURSIVELY**) sentUnidentified, err = cli.sendContent(ctx, recipient, messageTimestamp, content, retryCount+1, false, isGroup) @@ -946,6 +952,13 @@ func (cli *Client) sendContent( log.Err(err).Msg("2nd try sendMessage error") return sentUnidentified, err } + } else if *response.Status == 404 { + // TODO flag recipient as unregistered + err = cli.Store.ACISessionStore.RemoveAllSessionsForServiceID(ctx, recipient) + if err != nil { + log.Err(err).Msg("Failed to remove sessions after 404") + } + return sentUnidentified, ErrUnregisteredUser } else if *response.Status != 200 { return sentUnidentified, fmt.Errorf("unexpected status code while sending: %d", *response.Status) } @@ -953,81 +966,88 @@ func (cli *Client) sendContent( return sentUnidentified, nil } -// A 409 means our device list was out of date, so we will fix it up -func (cli *Client) handle409(ctx context.Context, recipient libsignalgo.ServiceID, response *signalpb.WebSocketResponseMessage) error { - log := zerolog.Ctx(ctx) - // Decode json body - // TODO use an actual struct for this - var body map[string]interface{} - err := json.Unmarshal(response.Body, &body) - if err != nil { - log.Err(err).Msg("Unmarshal error") - return err - } - // check for missingDevices and extraDevices - if body["missingDevices"] != nil { - missingDevices := body["missingDevices"].([]any) - log.Debug().Any("missing_devices", missingDevices).Msg("missing devices found in 409 response") - // TODO: establish session with missing devices - for _, missingDevice := range missingDevices { - err = cli.FetchAndProcessPreKey(ctx, recipient, int(missingDevice.(float64))) - if err != nil { - return nil - } - } - } - if body["extraDevices"] != nil { - extraDevices := body["extraDevices"].([]any) - log.Debug().Any("extra_devices", extraDevices).Msg("extra devices found in 409 response") - for _, extraDevice := range extraDevices { - recipientAddr, err := recipient.Address(uint(extraDevice.(float64))) - if err != nil { - log.Err(err).Msg("NewAddress error") - return err - } - err = cli.Store.ACISessionStore.RemoveSession(ctx, recipientAddr) - if err != nil { - log.Err(err).Msg("RemoveSession error") - return err - } - } - } - return err +type SingleRecipient409410Response struct { + MissingDevices []uint `json:"missingDevices"` + ExtraDevices []uint `json:"extraDevices"` + StaleDevices []uint `json:"staleDevices"` } -// A 410 means we have a stale device, so get rid of it -func (cli *Client) handle410(ctx context.Context, recipient libsignalgo.ServiceID, response *signalpb.WebSocketResponseMessage) error { - log := zerolog.Ctx(ctx) - // Decode json body - // TODO use an actual struct - var body map[string]interface{} +type MultiRecipient409410Response struct { + UUID libsignalgo.ServiceID `json:"uuid"` + Devices SingleRecipient409410Response `json:"devices"` +} + +type MultiRecipient200Response struct { + UUIDs404 []libsignalgo.ServiceID `json:"uuids404"` + NeedsSync bool `json:"needsSync"` +} + +func (cli *Client) handleSingleRecipient409410Response(ctx context.Context, recipient libsignalgo.ServiceID, response *signalpb.WebSocketResponseMessage) error { + var body SingleRecipient409410Response err := json.Unmarshal(response.Body, &body) if err != nil { - log.Err(err).Msg("Unmarshal error") - return err + return fmt.Errorf("failed to unmarshal error response body: %w", err) } - // check for staleDevices and make new sessions with them - if body["staleDevices"] != nil { - staleDevices := body["staleDevices"].([]any) - log.Debug().Any("stale_devices", staleDevices).Msg("stale devices found in 410 response") - for _, staleDevice := range staleDevices { - recipientAddr, err := recipient.Address(uint(staleDevice.(float64))) + return cli.handle409410(ctx, recipient, body) +} + +func (cli *Client) handleMultiRecipient409410Response(ctx context.Context, response *signalpb.WebSocketResponseMessage) error { + var body []MultiRecipient409410Response + err := json.Unmarshal(response.Body, &body) + if err != nil { + return fmt.Errorf("failed to unmarshal error response body: %w", err) + } + for _, recipientBody := range body { + err = cli.handle409410(ctx, recipientBody.UUID, recipientBody.Devices) + if err != nil { + return err + } + } + return nil +} + +func (cli *Client) handle409410(ctx context.Context, recipient libsignalgo.ServiceID, body SingleRecipient409410Response) error { + log := zerolog.Ctx(ctx) + if body.StaleDevices != nil { + log.Debug().Uints("stale_devices", body.StaleDevices).Msg("stale devices found in 410 response") + for _, staleDevice := range body.StaleDevices { + recipientAddr, err := recipient.Address(staleDevice) if err != nil { - log.Err(err).Msg("error creating new UUID Address") - return err + return fmt.Errorf("failed to get address for stale device %s:%d: %w", recipient, staleDevice, err) } err = cli.Store.ACISessionStore.RemoveSession(ctx, recipientAddr) if err != nil { - log.Err(err).Msg("RemoveSession error") - return err + return fmt.Errorf("failed to remove session for stale device %s:%d: %w", recipient, staleDevice, err) } - err = cli.FetchAndProcessPreKey(ctx, recipient, int(staleDevice.(float64))) + err = cli.FetchAndProcessPreKey(ctx, recipient, int(staleDevice)) if err != nil { - return err + return fmt.Errorf("failed to fetch and process prekey for stale device %s:%d: %w", recipient, staleDevice, err) } } } - return err + if body.MissingDevices != nil { + log.Debug().Uints("missing_devices", body.MissingDevices).Msg("missing devices found in 409 response") + for _, missingDevice := range body.MissingDevices { + err := cli.FetchAndProcessPreKey(ctx, recipient, int(missingDevice)) + if err != nil { + return fmt.Errorf("failed to fetch and process prekey for missing device %s:%d: %w", recipient, missingDevice, err) + } + } + } + if body.ExtraDevices != nil { + log.Debug().Any("extra_devices", body.ExtraDevices).Msg("extra devices found in 409 response") + for _, extraDevice := range body.ExtraDevices { + recipientAddr, err := recipient.Address(extraDevice) + if err != nil { + return fmt.Errorf("failed to get address for extra device %s:%d: %w", recipient, extraDevice, err) + } + err = cli.Store.ACISessionStore.RemoveSession(ctx, recipientAddr) + if err != nil { + return fmt.Errorf("failed to remove session for extra device %s:%d: %w", recipient, extraDevice, err) + } + } + } + return nil } // We got rate limited. @@ -1091,5 +1111,5 @@ func (cli *Client) handle428(ctx context.Context, recipient libsignalgo.ServiceI // } // } //} - return nil + return fmt.Errorf("got 428 error") } diff --git a/pkg/signalmeow/store/device.go b/pkg/signalmeow/store/device.go index 8843ddf..e72c04f 100644 --- a/pkg/signalmeow/store/device.go +++ b/pkg/signalmeow/store/device.go @@ -76,7 +76,7 @@ type Device struct { ACIIdentityStore libsignalgo.IdentityKeyStore PNIIdentityStore libsignalgo.IdentityKeyStore IdentityKeyStore IdentityKeyStore - SenderKeyStore libsignalgo.SenderKeyStore + SenderKeyStore SenderKeyStore GroupStore GroupStore RecipientStore RecipientStore diff --git a/pkg/signalmeow/store/sender_key_store.go b/pkg/signalmeow/store/sender_key_store.go index 092bcdd..a38e389 100644 --- a/pkg/signalmeow/store/sender_key_store.go +++ b/pkg/signalmeow/store/sender_key_store.go @@ -21,18 +21,40 @@ import ( "database/sql" "errors" "fmt" + "time" "github.com/google/uuid" "go.mau.fi/util/dbutil" "go.mau.fi/mautrix-signal/pkg/libsignalgo" + "go.mau.fi/mautrix-signal/pkg/signalmeow/types" ) -var _ libsignalgo.SenderKeyStore = (*sqlStore)(nil) +type SenderKeyStore interface { + libsignalgo.SenderKeyStore + DeleteSenderKey(ctx context.Context, address *libsignalgo.Address, distributionID uuid.UUID) error + GetSenderKeyInfo(ctx context.Context, groupID types.GroupIdentifier) (*SenderKeyInfo, error) + PutSenderKeyInfo(ctx context.Context, groupID types.GroupIdentifier, info *SenderKeyInfo) error +} + +var _ SenderKeyStore = (*sqlStore)(nil) const ( - loadSenderKeyQuery = `SELECT key_record FROM signalmeow_sender_keys WHERE account_id=$1 AND sender_uuid=$2 AND sender_device_id=$3 AND distribution_id=$4` - storeSenderKeyQuery = `INSERT INTO signalmeow_sender_keys (account_id, sender_uuid, sender_device_id, distribution_id, key_record) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (account_id, sender_uuid, sender_device_id, distribution_id) DO UPDATE SET key_record=excluded.key_record` + loadSenderKeyQuery = `SELECT key_record FROM signalmeow_sender_keys WHERE account_id=$1 AND sender_uuid=$2 AND sender_device_id=$3 AND distribution_id=$4` + storeSenderKeyQuery = `INSERT INTO signalmeow_sender_keys (account_id, sender_uuid, sender_device_id, distribution_id, key_record) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (account_id, sender_uuid, sender_device_id, distribution_id) DO UPDATE SET key_record=excluded.key_record` + deleteSenderKeyQuery = `DELETE FROM signalmeow_sender_keys WHERE account_id=$1 AND sender_uuid=$2 AND sender_device_id=$3 AND distribution_id=$4` + + getSenderKeyInfoQuery = ` + SELECT distribution_id, shared_with + FROM signalmeow_outbound_sender_key_info + WHERE account_id=$1 AND group_id=$2 + ` + putSenderKeyInfoQuery = ` + INSERT INTO signalmeow_outbound_sender_key_info (account_id, group_id, distribution_id, shared_with) + VALUES ($1, $2, $3, $4) + ON CONFLICT (account_id, group_id) DO UPDATE + SET distribution_id=excluded.distribution_id, shared_with=excluded.shared_with + ` ) func scanSenderKey(row dbutil.Scannable) (*libsignalgo.SenderKeyRecord, error) { @@ -74,3 +96,42 @@ func (s *sqlStore) StoreSenderKey(ctx context.Context, sender *libsignalgo.Addre _, err = s.db.Exec(ctx, storeSenderKeyQuery, s.AccountID, senderUUID, deviceID, distributionID, serialized) return err } + +func (s *sqlStore) DeleteSenderKey(ctx context.Context, sender *libsignalgo.Address, distributionID uuid.UUID) error { + senderUUID, err := sender.Name() + if err != nil { + return fmt.Errorf("failed to get sender UUID: %w", err) + } + deviceID, err := sender.DeviceID() + if err != nil { + return fmt.Errorf("failed to get sender device ID: %w", err) + } + _, err = s.db.Exec(ctx, deleteSenderKeyQuery, s.AccountID, senderUUID, deviceID, distributionID) + return err +} + +type SenderKeyInfo struct { + DistributionID uuid.UUID `json:"distribution_id"` + SharedWith map[libsignalgo.ServiceID][]int `json:"shared_with"` + CreatedAt time.Time `json:"created_at"` +} + +func scanSenderKeyInfo(row dbutil.Scannable) (*SenderKeyInfo, error) { + var ski SenderKeyInfo + err := row.Scan(&ski.DistributionID, dbutil.JSON{Data: &ski}) + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } else if err != nil { + return nil, err + } + return &ski, nil +} + +func (s *sqlStore) GetSenderKeyInfo(ctx context.Context, groupID types.GroupIdentifier) (*SenderKeyInfo, error) { + return scanSenderKeyInfo(s.db.QueryRow(ctx, getSenderKeyInfoQuery, s.AccountID, groupID)) +} + +func (s *sqlStore) PutSenderKeyInfo(ctx context.Context, groupID types.GroupIdentifier, info *SenderKeyInfo) error { + _, err := s.db.Exec(ctx, putSenderKeyInfoQuery, s.AccountID, groupID, info.DistributionID, dbutil.JSON{Data: info}) + return err +} diff --git a/pkg/signalmeow/store/session_store.go b/pkg/signalmeow/store/session_store.go index 5fe6cba..3956714 100644 --- a/pkg/signalmeow/store/session_store.go +++ b/pkg/signalmeow/store/session_store.go @@ -30,40 +30,49 @@ import ( var _ SessionStore = (*scopedSQLStore)(nil) const ( - loadSessionQuery = `SELECT their_device_id, record FROM signalmeow_sessions WHERE account_id=$1 AND service_id=$2 AND their_service_id=$3 AND their_device_id=$4` + loadSessionQuery = `SELECT their_service_id, their_device_id, record FROM signalmeow_sessions WHERE account_id=$1 AND service_id=$2 AND their_service_id=$3 AND their_device_id=$4` storeSessionQuery = ` INSERT INTO signalmeow_sessions (account_id, service_id, their_service_id, their_device_id, record) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (account_id, service_id, their_service_id, their_device_id) DO UPDATE SET record=excluded.record ` - allSessionsQuery = `SELECT their_device_id, record FROM signalmeow_sessions WHERE account_id=$1 AND service_id=$2 AND their_service_id=$3` - removeSessionQuery = `DELETE FROM signalmeow_sessions WHERE account_id=$1 AND service_id=$2 AND their_service_id=$3 AND their_device_id=$4` - deleteAllSessionsQuery = "DELETE FROM signalmeow_sessions WHERE account_id=$1" + allSessionsQuery = `SELECT their_service_id, their_device_id, record FROM signalmeow_sessions WHERE account_id=$1 AND service_id=$2 AND their_service_id=$3` + removeSessionQuery = `DELETE FROM signalmeow_sessions WHERE account_id=$1 AND service_id=$2 AND their_service_id=$3 AND their_device_id=$4` + removeSessionsForRecipientQuery = "DELETE FROM signalmeow_sessions WHERE account_id=$1 AND their_service_id=$2" + deleteAllSessionsQuery = "DELETE FROM signalmeow_sessions WHERE account_id=$1" ) +type SessionAddressTuple = libsignalgo.SessionAddressTuple + type SessionStore interface { libsignalgo.SessionStore ServiceScopedStore // AllSessionsForServiceID returns all sessions for the given service ID. - AllSessionsForServiceID(ctx context.Context, theirID libsignalgo.ServiceID) ([]*libsignalgo.Address, []*libsignalgo.SessionRecord, error) + AllSessionsForServiceID(ctx context.Context, theirID libsignalgo.ServiceID) ([]SessionAddressTuple, error) // RemoveSession removes the session for the given address. RemoveSession(ctx context.Context, address *libsignalgo.Address) error + RemoveAllSessionsForServiceID(ctx context.Context, theirID libsignalgo.ServiceID) error // RemoveAllSessions removes all sessions for our ACI UUID RemoveAllSessions(ctx context.Context) error } -func scanSessionRecord(row dbutil.Scannable) (int, *libsignalgo.SessionRecord, error) { - var record []byte - var deviceID int - err := row.Scan(&deviceID, &record) +func scanSessionRecord(row dbutil.Scannable) (tuple SessionAddressTuple, err error) { + var rawServiceID string + var rawRecord []byte + err = row.Scan(&rawServiceID, &tuple.DeviceID, &rawRecord) if errors.Is(err, sql.ErrNoRows) { - return 0, nil, nil + err = nil } else if err != nil { - return 0, nil, err + // return error as-is + } else if tuple.Record, err = libsignalgo.DeserializeSessionRecord(rawRecord); err != nil { + err = fmt.Errorf("failed to deserialize session record: %w", err) + } else if tuple.ServiceID, err = libsignalgo.ServiceIDFromString(rawServiceID); err != nil { + err = fmt.Errorf("failed to parse service ID: %w", err) + } else if tuple.Address, err = tuple.ServiceID.Address(uint(tuple.DeviceID)); err != nil { + err = fmt.Errorf("failed to construct address: %w", err) } - sessionRecord, err := libsignalgo.DeserializeSessionRecord(record) - return deviceID, sessionRecord, err + return } func (s *scopedSQLStore) RemoveSession(ctx context.Context, address *libsignalgo.Address) error { @@ -79,27 +88,17 @@ func (s *scopedSQLStore) RemoveSession(ctx context.Context, address *libsignalgo return err } -func (s *scopedSQLStore) AllSessionsForServiceID(ctx context.Context, theirID libsignalgo.ServiceID) ([]*libsignalgo.Address, []*libsignalgo.SessionRecord, error) { +func (s *scopedSQLStore) AllSessionsForServiceID(ctx context.Context, theirID libsignalgo.ServiceID) ([]SessionAddressTuple, error) { rows, err := s.db.Query(ctx, allSessionsQuery, s.AccountID, s.ServiceID, theirID) if err != nil { - return nil, nil, err + return nil, err } - defer rows.Close() - var records []*libsignalgo.SessionRecord - var addresses []*libsignalgo.Address - for rows.Next() { - deviceID, record, err := scanSessionRecord(rows) - if err != nil { - return nil, nil, err - } - records = append(records, record) - address, err := theirID.Address(uint(deviceID)) - if err != nil { - return nil, nil, err - } - addresses = append(addresses, address) - } - return addresses, records, rows.Err() + return dbutil.NewRowIterWithError(rows, scanSessionRecord, err).AsList() +} + +func (s *scopedSQLStore) RemoveAllSessionsForServiceID(ctx context.Context, theirID libsignalgo.ServiceID) error { + _, err := s.db.Exec(ctx, removeSessionsForRecipientQuery, s.AccountID, theirID) + return err } func (s *scopedSQLStore) LoadSession(ctx context.Context, address *libsignalgo.Address) (*libsignalgo.SessionRecord, error) { @@ -111,8 +110,8 @@ func (s *scopedSQLStore) LoadSession(ctx context.Context, address *libsignalgo.A if err != nil { return nil, fmt.Errorf("failed to get their device ID: %w", err) } - _, record, err := scanSessionRecord(s.db.QueryRow(ctx, loadSessionQuery, s.AccountID, s.ServiceID, theirServiceID, deviceID)) - return record, err + tuple, err := scanSessionRecord(s.db.QueryRow(ctx, loadSessionQuery, s.AccountID, s.ServiceID, theirServiceID, deviceID)) + return tuple.Record, err } func (s *scopedSQLStore) StoreSession(ctx context.Context, address *libsignalgo.Address, record *libsignalgo.SessionRecord) error { diff --git a/pkg/signalmeow/store/upgrades/00-latest.sql b/pkg/signalmeow/store/upgrades/00-latest.sql index ddf871a..7fe18a8 100644 --- a/pkg/signalmeow/store/upgrades/00-latest.sql +++ b/pkg/signalmeow/store/upgrades/00-latest.sql @@ -94,6 +94,15 @@ CREATE TABLE signalmeow_sender_keys ( FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE ); +CREATE TABLE signalmeow_outbound_sender_key_info ( + account_id TEXT NOT NULL, + group_id TEXT NOT NULL, + distribution_id TEXT NOT NULL, + shared_with jsonb NOT NULL, + + PRIMARY KEY (account_id, group_id) +); + CREATE TABLE signalmeow_groups ( account_id TEXT NOT NULL, group_identifier TEXT NOT NULL, diff --git a/pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql b/pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql new file mode 100644 index 0000000..bcc3d34 --- /dev/null +++ b/pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql @@ -0,0 +1,9 @@ +-- v24 (compatible with v13+): Store outbound sender keys for groups +CREATE TABLE signalmeow_outbound_sender_key_info ( + account_id TEXT NOT NULL, + group_id TEXT NOT NULL, + distribution_id TEXT NOT NULL, + shared_with jsonb NOT NULL, + + PRIMARY KEY (account_id, group_id) +); diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index 84a04b9..f6c6743 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -97,10 +97,11 @@ func init() { type ContentType string const ( - ContentTypeJSON ContentType = "application/json" - ContentTypeProtobuf ContentType = "application/x-protobuf" - ContentTypeOctetStream ContentType = "application/octet-stream" - ContentTypeOffsetOctetStream ContentType = "application/offset+octet-stream" + ContentTypeJSON ContentType = "application/json" + ContentTypeProtobuf ContentType = "application/x-protobuf" + ContentTypeOctetStream ContentType = "application/octet-stream" + ContentTypeOffsetOctetStream ContentType = "application/offset+octet-stream" + ContentTypeMultiRecipientMessage ContentType = "application/vnd.signal-messenger.mrm" ) type HTTPReqOpt struct { From e4f9c344cbb9879c7d625c30c87430fc40eff7aa Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 27 Nov 2025 16:54:12 +0200 Subject: [PATCH 058/170] signalmeow/web: don't truncate paths in logs --- pkg/signalmeow/web/signalwebsocket.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index 38dcc4d..f2631fe 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -516,10 +516,6 @@ func writeLoop( } request.RequestMessage.Id = &i responseChannels.Set(i, request.ResponseChannel) - path := *request.RequestMessage.Path - if len(path) > 30 { - path = path[:40] - } if !request.RequestTime.IsZero() { elapsed := time.Since(request.RequestTime) if elapsed > 1*time.Minute { @@ -528,14 +524,14 @@ func writeLoop( log.Warn(). Uint64("request_id", i). Str("request_verb", *request.RequestMessage.Verb). - Str("request_path", path). + Str("request_path", *request.RequestMessage.Path). Dur("elapsed", elapsed). Msg("Sending WS request") } else { log.Debug(). Uint64("request_id", i). Str("request_verb", *request.RequestMessage.Verb). - Str("request_path", path). + Str("request_path", *request.RequestMessage.Path). Dur("elapsed", elapsed). Msg("Sending WS request") } From 73e8668bc58db8032db2531c524e8ca05239d2bd Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 27 Nov 2025 16:54:23 +0200 Subject: [PATCH 059/170] handlematrix: enable typing notifications in groups --- pkg/connector/handlematrix.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 1dbd48a..968d55c 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -319,18 +319,21 @@ func (s *SignalClient) HandleMatrixReadReceipt(ctx context.Context, receipt *bri } func (s *SignalClient) HandleMatrixTyping(ctx context.Context, typing *bridgev2.MatrixTyping) error { - userID, _, err := signalid.ParsePortalID(typing.Portal.ID) + userID, groupID, err := signalid.ParsePortalID(typing.Portal.ID) if err != nil { return err } - // Only send typing notifications in DMs for now - // Sending efficiently to groups requires implementing the proper SenderKey stuff first + typingMessage := signalmeow.TypingMessage(typing.IsTyping) if !userID.IsEmpty() && userID.Type == libsignalgo.ServiceIDTypeACI { - typingMessage := signalmeow.TypingMessage(typing.IsTyping) result := s.Client.SendMessage(ctx, userID, typingMessage) if !result.WasSuccessful { return result.Error } + } else if groupID != "" { + _, err = s.Client.SendGroupMessage(ctx, groupID, typingMessage) + if err != nil { + return err + } } return nil } From daba2d098cd57171abd66bb1644ca25d6b26c13d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 27 Nov 2025 17:15:13 +0200 Subject: [PATCH 060/170] handlematrix: remove duplicate error log --- pkg/connector/handlematrix.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 968d55c..e2472a2 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -73,17 +73,17 @@ func (s *SignalClient) sendMessage(ctx context.Context, portalID networkid.Porta Int("failed_to_send_to_count", len(result.FailedToSendTo)). Int("successfully_sent_to_count", len(result.SuccessfullySentTo)). Logger() - if len(result.FailedToSendTo) > 0 { - log.Error().Msg("Failed to send event to some members of Signal group") - } if len(result.SuccessfullySentTo) == 0 && len(result.FailedToSendTo) == 0 { log.Debug().Msg("No successes or failures - Probably sent to myself") } else if len(result.SuccessfullySentTo) == 0 { log.Error().Msg("Failed to send event to all members of Signal group") return errors.New("failed to send to any members of Signal group") - } else if len(result.SuccessfullySentTo) < totalRecipients { - log.Warn().Msg("Only sent event to some members of Signal group") + if len(result.FailedToSendTo) > 0 { + log.Warn().Msg("Failed to send event to some members of Signal group") + } else { + log.Warn().Msg("Only sent event to some members of Signal group") + } } else { log.Debug().Msg("Sent event to all members of Signal group") } From 48cc6ac0aa06f3e44d7cc17e970a8918b3a5cda9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 27 Nov 2025 17:15:26 +0200 Subject: [PATCH 061/170] signalmeow/web: always log short response bodies --- pkg/signalmeow/web/signalwebsocket.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index f2631fe..8a0c845 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -459,7 +459,7 @@ func readLoop( Uint64("response_id", msg.Response.GetId()). Uint32("response_status", msg.Response.GetStatus()). Str("response_message", msg.Response.GetMessage()) - if log.GetLevel() == zerolog.TraceLevel { + if log.GetLevel() == zerolog.TraceLevel || len(msg.Response.Body) < 256 { logEvt.Strs("response_headers", msg.Response.Headers) if json.Valid(msg.Response.Body) { logEvt.RawJSON("response_body", msg.Response.Body) From 33e0830088c84f756e13fd4cd7c552662423180b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 27 Nov 2025 17:15:38 +0200 Subject: [PATCH 062/170] handlematrix: add support for encrypted room avatars --- pkg/connector/handlematrix.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index e2472a2..cdd3c0a 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -380,8 +380,8 @@ func (s *SignalClient) HandleMatrixRoomAvatar(ctx context.Context, msg *bridgev2 } var avatarPath string var avatarHash [32]byte - if msg.Content.URL != "" { - data, err := s.Main.Bridge.Bot.DownloadMedia(ctx, msg.Content.URL, nil) + if msg.Content.URL != "" || msg.Content.MSC3414File != nil { + data, err := s.Main.Bridge.Bot.DownloadMedia(ctx, msg.Content.URL, msg.Content.MSC3414File) if err != nil { return false, fmt.Errorf("failed to download avatar: %w", err) } From 079223eed63b39f10978972ca689b5641813ee33 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 28 Nov 2025 16:18:45 +0200 Subject: [PATCH 063/170] signalmeow/store: fix latest version number --- pkg/signalmeow/store/upgrades/00-latest.sql | 2 +- pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/signalmeow/store/upgrades/00-latest.sql b/pkg/signalmeow/store/upgrades/00-latest.sql index 7fe18a8..4d42cde 100644 --- a/pkg/signalmeow/store/upgrades/00-latest.sql +++ b/pkg/signalmeow/store/upgrades/00-latest.sql @@ -1,4 +1,4 @@ --- v0 -> v23 (compatible with v13+): Latest revision +-- v0 -> v24 (compatible with v13+): Latest revision CREATE TABLE signalmeow_device ( aci_uuid TEXT PRIMARY KEY, diff --git a/pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql b/pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql index bcc3d34..4f02389 100644 --- a/pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql +++ b/pkg/signalmeow/store/upgrades/24-outbound-sender-keys.sql @@ -1,5 +1,5 @@ -- v24 (compatible with v13+): Store outbound sender keys for groups -CREATE TABLE signalmeow_outbound_sender_key_info ( +CREATE TABLE IF NOT EXISTS signalmeow_outbound_sender_key_info ( account_id TEXT NOT NULL, group_id TEXT NOT NULL, distribution_id TEXT NOT NULL, From 6abb263407707b7ee0245c3f2aab7c544b96d2bf Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 28 Nov 2025 16:17:38 +0200 Subject: [PATCH 064/170] signalmeow,libsignalgo: add support for group send endorsements --- pkg/connector/groupinfo.go | 2 +- pkg/libsignalgo/buffer.go | 18 ++ pkg/libsignalgo/conversions.go | 14 ++ pkg/libsignalgo/groupsecretparams.go | 4 + pkg/libsignalgo/groupsendendorsement.go | 215 ++++++++++++++++++++++++ pkg/signalmeow/client.go | 2 +- pkg/signalmeow/groupcache.go | 99 +++++++++-- pkg/signalmeow/groups.go | 43 ++++- pkg/signalmeow/senderkey.go | 48 ++++-- pkg/signalmeow/sending.go | 5 +- 10 files changed, 409 insertions(+), 41 deletions(-) create mode 100644 pkg/libsignalgo/groupsendendorsement.go diff --git a/pkg/connector/groupinfo.go b/pkg/connector/groupinfo.go index a025fa4..d958463 100644 --- a/pkg/connector/groupinfo.go +++ b/pkg/connector/groupinfo.go @@ -98,7 +98,7 @@ func inviteLinkToJoinRule(inviteLinkAccess signalmeow.AccessControl) event.JoinR } func (s *SignalClient) getGroupInfo(ctx context.Context, groupID types.GroupIdentifier, minRevision uint32, backupChat *store.BackupChat) (*bridgev2.ChatInfo, error) { - groupInfo, err := s.Client.RetrieveGroupByID(ctx, groupID, minRevision) + groupInfo, _, err := s.Client.RetrieveGroupByID(ctx, groupID, minRevision) if err != nil { return nil, fmt.Errorf("failed to retrieve group by id: %w", err) } diff --git a/pkg/libsignalgo/buffer.go b/pkg/libsignalgo/buffer.go index e6aafdd..5518656 100644 --- a/pkg/libsignalgo/buffer.go +++ b/pkg/libsignalgo/buffer.go @@ -21,6 +21,8 @@ package libsignalgo */ import "C" import ( + "fmt" + "runtime" "unsafe" ) @@ -42,6 +44,22 @@ func BytesToBuffer(data []byte) C.SignalBorrowedBuffer { return buf } +func ManyBytesToBuffer[T ~[]byte](datas []T) (C.SignalBorrowedSliceOfBuffers, func()) { + buffers := make([]C.SignalBorrowedBuffer, len(datas)) + var pinner runtime.Pinner + for i, data := range datas { + if len(data) == 0 { + panic(fmt.Errorf("empty slice passed to ManyBytesToBuffer at index %d", i)) + } + pinner.Pin(&data[0]) + buffers[i] = BytesToBuffer(data) + } + return C.SignalBorrowedSliceOfBuffers{ + base: unsafe.SliceData(buffers), + length: C.size_t(len(buffers)), + }, pinner.Unpin +} + func EmptyBorrowedBuffer() C.SignalBorrowedBuffer { return C.SignalBorrowedBuffer{} } diff --git a/pkg/libsignalgo/conversions.go b/pkg/libsignalgo/conversions.go index d17fa28..1963687 100644 --- a/pkg/libsignalgo/conversions.go +++ b/pkg/libsignalgo/conversions.go @@ -39,3 +39,17 @@ func CopySignalOwnedBufferToBytes(buffer C.SignalOwnedBuffer) (b []byte) { C.signal_free_buffer(buffer.base, buffer.length) return } + +func CopySignalBytestringArray[T ~[]byte](buffer C.SignalBytestringArray) (b []T) { + concatted := C.GoBytes(unsafe.Pointer(buffer.bytes.base), C.int(buffer.bytes.length)) + b = make([]T, int(buffer.lengths.length)) + sizeTSize := unsafe.Sizeof(C.size_t(0)) + offset := 0 + for i := 0; i < int(buffer.lengths.length); i++ { + length := int(*(*C.size_t)(unsafe.Add(unsafe.Pointer(buffer.lengths.base), uintptr(i)*sizeTSize))) + b[i] = concatted[offset : offset+length] + offset += length + } + C.signal_free_bytestring_array(buffer) + return +} diff --git a/pkg/libsignalgo/groupsecretparams.go b/pkg/libsignalgo/groupsecretparams.go index 5ad11fd..a6b370c 100644 --- a/pkg/libsignalgo/groupsecretparams.go +++ b/pkg/libsignalgo/groupsecretparams.go @@ -76,6 +76,10 @@ func (gmk GroupMasterKey) GroupIdentifier() (*GroupIdentifier, error) { } } +func (gmk GroupMasterKey) SecretParams() (GroupSecretParams, error) { + return DeriveGroupSecretParamsFromMasterKey(gmk) +} + func GenerateGroupSecretParamsWithRandomness(randomness Randomness) (GroupSecretParams, error) { var params [C.SignalGROUP_SECRET_PARAMS_LEN]C.uchar signalFfiError := C.signal_group_secret_params_generate_deterministic(¶ms, (*[C.SignalRANDOMNESS_LEN]C.uint8_t)(unsafe.Pointer(&randomness))) diff --git a/pkg/libsignalgo/groupsendendorsement.go b/pkg/libsignalgo/groupsendendorsement.go new file mode 100644 index 0000000..73f175e --- /dev/null +++ b/pkg/libsignalgo/groupsendendorsement.go @@ -0,0 +1,215 @@ +// mautrix-signal - A Matrix-signal puppeting bridge. +// Copyright (C) 2025 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package libsignalgo + +/* +#include "./libsignal-ffi.h" +*/ +import "C" +import ( + "encoding/base64" + "runtime" + "time" + "unsafe" +) + +type GroupSendFullToken []byte + +func (gsft GroupSendFullToken) String() string { + return base64.StdEncoding.EncodeToString(gsft) +} + +func (gsft GroupSendFullToken) CheckValidContents() error { + signalFfiError := C.signal_group_send_full_token_check_valid_contents( + BytesToBuffer(gsft), + ) + runtime.KeepAlive(gsft) + if signalFfiError != nil { + return wrapError(signalFfiError) + } + return nil +} + +func (gsft GroupSendFullToken) GetExpiration() (time.Time, error) { + var expiration C.uint64_t + signalFfiError := C.signal_group_send_full_token_get_expiration( + &expiration, + BytesToBuffer(gsft), + ) + runtime.KeepAlive(gsft) + if signalFfiError != nil { + return time.Time{}, wrapError(signalFfiError) + } + return time.Unix(int64(expiration), 0), nil +} + +type GroupSendToken []byte + +func (gst GroupSendToken) CheckValidContents() error { + signalFfiError := C.signal_group_send_token_check_valid_contents( + BytesToBuffer(gst), + ) + runtime.KeepAlive(gst) + if signalFfiError != nil { + return wrapError(signalFfiError) + } + return nil +} + +func (gst GroupSendToken) ToFullToken(expiration time.Time) (GroupSendFullToken, error) { + var fullToken C.SignalOwnedBuffer = C.SignalOwnedBuffer{} + signalFfiError := C.signal_group_send_token_to_full_token( + &fullToken, + BytesToBuffer(gst), + C.uint64_t(expiration.Unix()), + ) + runtime.KeepAlive(gst) + if signalFfiError != nil { + return nil, wrapError(signalFfiError) + } + return CopySignalOwnedBufferToBytes(fullToken), nil +} + +type GroupSendEndorsement []byte + +func (gse GroupSendEndorsement) ToToken(groupSecretParams *GroupSecretParams) (GroupSendToken, error) { + var token C.SignalOwnedBuffer = C.SignalOwnedBuffer{} + signalFfiError := C.signal_group_send_endorsement_to_token( + &token, + BytesToBuffer(gse), + (*[C.SignalGROUP_SECRET_PARAMS_LEN]C.uint8_t)(unsafe.Pointer(groupSecretParams)), + ) + runtime.KeepAlive(gse) + runtime.KeepAlive(groupSecretParams) + if signalFfiError != nil { + return nil, wrapError(signalFfiError) + } + return CopySignalOwnedBufferToBytes(token), nil +} + +func (gse GroupSendEndorsement) ToFullToken(params *GroupSecretParams, expiration time.Time) (GroupSendFullToken, error) { + token, err := gse.ToToken(params) + if err != nil { + return nil, err + } + return token.ToFullToken(expiration) +} + +func (gse GroupSendEndorsement) CheckValidContents() error { + signalFfiError := C.signal_group_send_endorsement_check_valid_contents( + BytesToBuffer(gse), + ) + runtime.KeepAlive(gse) + if signalFfiError != nil { + return wrapError(signalFfiError) + } + return nil +} + +func (gse GroupSendEndorsement) Remove(other GroupSendEndorsement) (GroupSendEndorsement, error) { + var result C.SignalOwnedBuffer = C.SignalOwnedBuffer{} + signalFfiError := C.signal_group_send_endorsement_remove( + &result, + BytesToBuffer(gse), + BytesToBuffer(other), + ) + runtime.KeepAlive(gse) + runtime.KeepAlive(other) + if signalFfiError != nil { + return nil, wrapError(signalFfiError) + } + return CopySignalOwnedBufferToBytes(result), nil +} + +func GroupSendEndorsementCombine(endorsements ...GroupSendEndorsement) (GroupSendEndorsement, error) { + var result C.SignalOwnedBuffer = C.SignalOwnedBuffer{} + cEndorsements, unpin := ManyBytesToBuffer(endorsements) + defer unpin() + signalFfiError := C.signal_group_send_endorsement_combine( + &result, + cEndorsements, + ) + runtime.KeepAlive(endorsements) + if signalFfiError != nil { + return nil, wrapError(signalFfiError) + } + return CopySignalOwnedBufferToBytes(result), nil +} + +type GroupSendEndorsementsResponse []byte + +func (gser GroupSendEndorsementsResponse) GetExpiration() (time.Time, error) { + var expiration C.uint64_t + signalFfiError := C.signal_group_send_endorsements_response_get_expiration( + &expiration, + BytesToBuffer(gser), + ) + runtime.KeepAlive(gser) + if signalFfiError != nil { + return time.Time{}, wrapError(signalFfiError) + } + return time.Unix(int64(expiration), 0), nil +} + +func (gser GroupSendEndorsementsResponse) CheckValidContents() error { + signalFfiError := C.signal_group_send_endorsements_response_check_valid_contents( + BytesToBuffer(gser), + ) + runtime.KeepAlive(gser) + if signalFfiError != nil { + return wrapError(signalFfiError) + } + return nil +} + +func (gser GroupSendEndorsementsResponse) ReceiveWithServiceIDs( + groupMembers []ServiceID, localUser ServiceID, params *GroupSecretParams, spp *ServerPublicParams, +) (GroupSendEndorsement, map[ServiceID]GroupSendEndorsement, error) { + var out C.SignalBytestringArray = C.SignalBytestringArray{} + concatenatedMembers := make([]byte, len(groupMembers)*17) + for i, member := range groupMembers { + copy(concatenatedMembers[i*17:(i+1)*17], member.FixedBytes()[:]) + } + signalFfiError := C.signal_group_send_endorsements_response_receive_and_combine_with_service_ids( + &out, + BytesToBuffer(gser), + BytesToBuffer(concatenatedMembers), + localUser.CFixedBytes(), + C.uint64_t(time.Now().Unix()), + (*[C.SignalGROUP_SECRET_PARAMS_LEN]C.uint8_t)(unsafe.Pointer(params)), + C.SignalConstPointerServerPublicParams{spp}, + ) + runtime.KeepAlive(gser) + runtime.KeepAlive(concatenatedMembers) + runtime.KeepAlive(params) + runtime.KeepAlive(spp) + if signalFfiError != nil { + return nil, nil, wrapError(signalFfiError) + } + endorsements := CopySignalBytestringArray[GroupSendEndorsement](out) + memberEndorsements := make(map[ServiceID]GroupSendEndorsement, len(groupMembers)) + for i, member := range groupMembers { + if len(endorsements) > i && len(endorsements[i]) > 0 { + memberEndorsements[member] = endorsements[i] + } + } + combined, err := GroupSendEndorsementCombine(endorsements...) + if err != nil { + return nil, memberEndorsements, err + } + return combined, memberEndorsements, nil +} diff --git a/pkg/signalmeow/client.go b/pkg/signalmeow/client.go index 2a7f470..52fa12d 100644 --- a/pkg/signalmeow/client.go +++ b/pkg/signalmeow/client.go @@ -72,7 +72,7 @@ func NewClient(device *store.Device, log zerolog.Logger, evtHandler func(events. Store: device, Log: log, EventHandler: evtHandler, - GroupCache: NewGroupCache(), + GroupCache: NewGroupCache(device.ACIServiceID()), ProfileCache: &ProfileCache{ profiles: make(map[string]*types.Profile), errors: make(map[string]*error), diff --git a/pkg/signalmeow/groupcache.go b/pkg/signalmeow/groupcache.go index 557203a..ee8259f 100644 --- a/pkg/signalmeow/groupcache.go +++ b/pkg/signalmeow/groupcache.go @@ -29,14 +29,31 @@ import ( "go.mau.fi/mautrix-signal/pkg/signalmeow/types" ) +type SendEndorsementCache struct { + SendEndorsement libsignalgo.GroupSendEndorsement + MemberEndorsements map[libsignalgo.ServiceID]libsignalgo.GroupSendEndorsement + Expiration time.Time + SecretParams *libsignalgo.GroupSecretParams +} + +func (sec *SendEndorsementCache) GetToken() (libsignalgo.GroupSendFullToken, error) { + return sec.GetTokenWith(sec.SendEndorsement) +} + +func (sec *SendEndorsementCache) GetTokenWith(altToken libsignalgo.GroupSendEndorsement) (libsignalgo.GroupSendFullToken, error) { + return altToken.ToFullToken(sec.SecretParams, sec.Expiration) +} + type cachedGroup struct { *Group - SendEndorsement []byte - FetchedAt time.Time - UpdatedAt time.Time + *SendEndorsementCache + FetchedAt time.Time + UpdatedAt time.Time } type GroupCache struct { + serviceID libsignalgo.ServiceID + credentials *GroupCredentials credentialsLock sync.RWMutex @@ -47,8 +64,9 @@ type GroupCache struct { callsLock sync.RWMutex } -func NewGroupCache() *GroupCache { +func NewGroupCache(serviceID libsignalgo.ServiceID) *GroupCache { return &GroupCache{ + serviceID: serviceID, data: make(map[types.GroupIdentifier]*cachedGroup), activeCalls: make(map[types.GroupIdentifier]string), } @@ -111,14 +129,14 @@ func (gc *GroupCache) UpdateActiveCall(id types.GroupIdentifier, callID string) return true } -func (gc *GroupCache) Get(id types.GroupIdentifier) (*Group, bool) { +func (gc *GroupCache) Get(id types.GroupIdentifier) (*Group, *SendEndorsementCache, bool) { gc.lock.RLock() defer gc.lock.RUnlock() c, ok := gc.data[id] - if !ok { - return nil, false + if !ok || time.Until(c.Expiration) < 5*time.Minute { + return nil, nil, false } - return c.Group, true + return c.Group, c.SendEndorsementCache, true } func (gc *GroupCache) Delete(id types.GroupIdentifier) { @@ -127,26 +145,50 @@ func (gc *GroupCache) Delete(id types.GroupIdentifier) { delete(gc.data, id) } -func (gc *GroupCache) Put(data *Group, endorsementResponse []byte) { +func (gc *GroupCache) Put(data *Group, endorsementResponse libsignalgo.GroupSendEndorsementsResponse) error { + gsp, err := masterKeyToBytes(data.GroupMasterKey).SecretParams() + if err != nil { + return fmt.Errorf("failed to get secret params: %w", err) + } + expiration, err := endorsementResponse.GetExpiration() + if err != nil { + return fmt.Errorf("failed to get endorsement expiration: %w", err) + } + endorsement, memberEndorsements, err := endorsementResponse.ReceiveWithServiceIDs(data.getMemberServiceIDs(), gc.serviceID, &gsp, prodServerPublicParams) + if err != nil { + return fmt.Errorf("failed to receive endorsements: %w", err) + } + gc.lock.Lock() defer gc.lock.Unlock() cached, exists := gc.data[data.GroupIdentifier] if exists && cached.Revision > data.Revision { - return + return nil } gc.data[data.GroupIdentifier] = &cachedGroup{ Group: data, FetchedAt: time.Now(), UpdatedAt: time.Now(), - //SendEndorsement: endorsementResponse, + SendEndorsementCache: &SendEndorsementCache{ + Expiration: expiration, + SendEndorsement: endorsement, + MemberEndorsements: memberEndorsements, + SecretParams: &gsp, + }, } + return nil } -func (gc *GroupCache) ApplyUpdate(change *GroupChange, endorsementResponse []byte) { - rawGroupID, err := masterKeyToBytes(change.GroupMasterKey).GroupIdentifier() +func (gc *GroupCache) ApplyUpdate(change *GroupChange, endorsementResponse libsignalgo.GroupSendEndorsementsResponse) error { + mkBytes := masterKeyToBytes(change.GroupMasterKey) + rawGroupID, err := mkBytes.GroupIdentifier() if err != nil { - return + return fmt.Errorf("failed to get group identifier: %w", err) + } + gsp, err := mkBytes.SecretParams() + if err != nil { + return fmt.Errorf("failed to get secret params: %w", err) } id := types.GroupIdentifier(rawGroupID.String()) @@ -155,11 +197,11 @@ func (gc *GroupCache) ApplyUpdate(change *GroupChange, endorsementResponse []byt cached, exists := gc.data[id] if !exists || cached.Revision >= change.Revision { - return + return nil } else if cached.Revision < change.Revision-1 { // We missed an update, evict delete(gc.data, id) - return + return nil } // Pending member adds, promotes and removes @@ -275,7 +317,30 @@ func (gc *GroupCache) ApplyUpdate(change *GroupChange, endorsementResponse []byt cached.AccessControl.AddFromInviteLink = *change.ModifyAddFromInviteLinkAccess } - // TODO handle endorsement responses cached.UpdatedAt = time.Now() cached.Revision = change.Revision + endorsement, memberEndorsements, err := endorsementResponse.ReceiveWithServiceIDs( + cached.getMemberServiceIDs(), + gc.serviceID, + &gsp, + prodServerPublicParams, + ) + if err != nil { + delete(gc.data, id) + return fmt.Errorf("failed to receive endorsements: %w", err) + } + expiration, err := endorsementResponse.GetExpiration() + if err != nil { + delete(gc.data, id) + return fmt.Errorf("failed to get endorsement expiration: %w", err) + } + // TODO do these responses overwrite the entire thing? + cached.SendEndorsementCache = &SendEndorsementCache{ + SendEndorsement: endorsement, + MemberEndorsements: memberEndorsements, + Expiration: expiration, + SecretParams: &gsp, + } + + return nil } diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index f25f835..d8ba4b3 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -31,6 +31,7 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" + "go.mau.fi/util/exslices" "go.mau.fi/util/ptr" "go.mau.fi/util/random" "google.golang.org/protobuf/proto" @@ -90,6 +91,12 @@ type Group struct { //PublicKey *libsignalgo.PublicKey } +func (group *Group) getMemberServiceIDs() []libsignalgo.ServiceID { + return exslices.CastFunc(group.Members, func(from *GroupMember) libsignalgo.ServiceID { + return libsignalgo.NewACIServiceID(from.ACI) + }) +} + func (group *Group) GetInviteLink() (string, error) { if group.InviteLinkPassword == nil { return "", fmt.Errorf("no invite link password set") @@ -654,7 +661,10 @@ func (cli *Client) parseGroupResponse(ctx context.Context, response *http.Respon if err != nil { return nil, fmt.Errorf("failed to decrypt group: %w", err) } - cli.GroupCache.Put(group, groupResponse.GroupSendEndorsementsResponse) + err = cli.GroupCache.Put(group, groupResponse.GroupSendEndorsementsResponse) + if err != nil { + zerolog.Ctx(ctx).Err(err).Msg("Failed to cache group response") + } // Store the profile keys in case they're new for _, member := range group.Members { @@ -697,12 +707,21 @@ func (cli *Client) DownloadGroupAvatar(ctx context.Context, avatarPath string, g return decrypted, nil } -func (cli *Client) RetrieveGroupByID(ctx context.Context, gid types.GroupIdentifier, revision uint32) (*Group, error) { - cached, ok := cli.GroupCache.Get(gid) +func (cli *Client) RetrieveGroupByID(ctx context.Context, gid types.GroupIdentifier, revision uint32) (*Group, *SendEndorsementCache, error) { + cached, endorsement, ok := cli.GroupCache.Get(gid) if ok && cached.Revision >= revision { - return cached, nil + return cached, endorsement, nil } - return cli.fetchGroupByID(ctx, gid) + group, err := cli.fetchGroupByID(ctx, gid) + if err != nil { + return nil, nil, err + } + cached, endorsement, ok = cli.GroupCache.Get(gid) + if !ok { + zerolog.Ctx(ctx).Warn().Msg("Group not found in cache after fetching") + return group, nil, nil + } + return cached, endorsement, nil } // We should store the group master key in the group store as soon as we see it, @@ -1049,7 +1068,10 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange } success = true - cli.GroupCache.ApplyUpdate(decryptedGroupChange, nil) + err = cli.GroupCache.ApplyUpdate(decryptedGroupChange, nil) + if err != nil { + log.Err(err).Msg("Failed to apply group change to cache") + } return decryptedGroupChange, nil } @@ -1499,7 +1521,7 @@ func (cli *Client) UpdateGroup(ctx context.Context, groupChange *GroupChange, gi masterKeyBytes := masterKeyToBytes(groupMasterKey) var refetchedAddMemberCredentials bool var signedGroupChange *signalpb.GroupChangeResponse - group, err := cli.RetrieveGroupByID(ctx, gid, 0) + group, _, err := cli.RetrieveGroupByID(ctx, gid, 0) if err != nil { return 0, fmt.Errorf("failed to fetch group info to update: %w", err) } @@ -1523,7 +1545,7 @@ func (cli *Client) UpdateGroup(ctx context.Context, groupChange *GroupChange, gi } } else if errors.Is(err, ConflictError) { cli.GroupCache.Delete(gid) - group, err = cli.RetrieveGroupByID(ctx, gid, 0) + group, _, err = cli.RetrieveGroupByID(ctx, gid, 0) if err != nil { return 0, fmt.Errorf("failed to fetch group after conflict: %w", err) } @@ -1539,7 +1561,10 @@ func (cli *Client) UpdateGroup(ctx context.Context, groupChange *GroupChange, gi if signedGroupChange == nil { return 0, fmt.Errorf("no signed group change returned: %w", err) } - cli.GroupCache.ApplyUpdate(groupChange, signedGroupChange.GroupSendEndorsementsResponse) + err = cli.GroupCache.ApplyUpdate(groupChange, signedGroupChange.GroupSendEndorsementsResponse) + if err != nil { + log.Err(err).Msg("Failed to apply group change to cache") + } groupChangeBytes, err := proto.Marshal(signedGroupChange.GroupChange) if err != nil { return 0, fmt.Errorf("failed to marshal signed group change: %w", err) diff --git a/pkg/signalmeow/senderkey.go b/pkg/signalmeow/senderkey.go index 133ef80..9dbe96f 100644 --- a/pkg/signalmeow/senderkey.go +++ b/pkg/signalmeow/senderkey.go @@ -50,6 +50,7 @@ func (cli *Client) sendToGroupWithSenderKey( ctx context.Context, groupID types.GroupIdentifier, allRecipients []libsignalgo.ServiceID, + sec SendEndorsementCache, content *signalpb.Content, messageTimestamp uint64, retries int, @@ -78,7 +79,7 @@ func (cli *Client) sendToGroupWithSenderKey( FailedToSendTo: make([]FailedSendResult, 0), } - deviceIDs, senderKeyRecipients, fallbackRecipients := cli.getDevicesIDs(ctx, allRecipients, result) + deviceIDs, senderKeyRecipients, fallbackRecipients := cli.getDevicesIDs(ctx, allRecipients, sec, result) ski, err := cli.Store.SenderKeyStore.GetSenderKeyInfo(ctx, groupID) if err != nil { return nil, fmt.Errorf("failed to get sender key info: %w", err) @@ -148,7 +149,7 @@ func (cli *Client) sendToGroupWithSenderKey( } if needsRetry { doUnlock() - return cli.sendToGroupWithSenderKey(ctx, groupID, allRecipients, content, messageTimestamp, retries+1) + return cli.sendToGroupWithSenderKey(ctx, groupID, allRecipients, sec, content, messageTimestamp, retries+1) } } ssCiphertext, err := cli.encryptWithSenderKey(ctx, groupID, ski.DistributionID, myAddress, senderKeyRecipients, content) @@ -157,11 +158,27 @@ func (cli *Client) sendToGroupWithSenderKey( } header := http.Header{} header.Set("Content-Type", string(web.ContentTypeMultiRecipientMessage)) - //if groupSendToken != nil { - // header.Set("Group-Send-Token", groupSendToken.String()) - //} else { - header.Set("Unidentified-Access-Key", xak.String()) - //} + if sec.SendEndorsement != nil { + wantedEndorsements := make([]libsignalgo.GroupSendEndorsement, 0, len(deviceIDs)) + for serviceID := range deviceIDs { + endorsement, ok := sec.MemberEndorsements[serviceID] + if !ok { + return nil, fmt.Errorf("missing group send endorsement for service ID %s", serviceID.String()) + } + wantedEndorsements = append(wantedEndorsements, endorsement) + } + combinedEndorsement, err := libsignalgo.GroupSendEndorsementCombine(wantedEndorsements...) + if err != nil { + return nil, fmt.Errorf("failed to combine group send endorsements: %w", err) + } + groupSendToken, err := sec.GetTokenWith(combinedEndorsement) + if err != nil { + return nil, fmt.Errorf("failed to create group send full token: %w", err) + } + header.Set("Group-Send-Token", groupSendToken.String()) + } else { + header.Set("Unidentified-Access-Key", xak.String()) + } path := fmt.Sprintf( "/v1/messages/multi_recipient?ts=%d&urgent=%t&online=false", messageTimestamp, isUrgent(content), @@ -218,7 +235,7 @@ func (cli *Client) sendToGroupWithSenderKey( } doUnlock() // Retry recursively after fixing device lists - return cli.sendToGroupWithSenderKey(ctx, groupID, allRecipients, content, messageTimestamp, retries+1) + return cli.sendToGroupWithSenderKey(ctx, groupID, allRecipients, sec, content, messageTimestamp, retries+1) default: return nil, fmt.Errorf("unexpected status code %d in multi-recipient send", resp.GetStatus()) } @@ -305,8 +322,15 @@ type senderKeySendMeta struct { AccessKey *libsignalgo.AccessKey } -func (cli *Client) getDevicesIDs(ctx context.Context, recipients []libsignalgo.ServiceID, result *GroupMessageSendResult) ( - map[libsignalgo.ServiceID]senderKeySendMeta, []store.SessionAddressTuple, []libsignalgo.ServiceID, +func (cli *Client) getDevicesIDs( + ctx context.Context, + recipients []libsignalgo.ServiceID, + sendEndorsement SendEndorsementCache, + result *GroupMessageSendResult, +) ( + map[libsignalgo.ServiceID]senderKeySendMeta, + []store.SessionAddressTuple, + []libsignalgo.ServiceID, ) { log := zerolog.Ctx(ctx) out := make(map[libsignalgo.ServiceID]senderKeySendMeta) @@ -321,6 +345,10 @@ func (cli *Client) getDevicesIDs(ctx context.Context, recipients []libsignalgo.S if recipient.Type != libsignalgo.ServiceIDTypeACI { continue } + _, hasEndorsement := sendEndorsement.MemberEndorsements[recipient] + if !hasEndorsement { + continue + } profileKey, err := cli.Store.RecipientStore.LoadProfileKey(ctx, recipient.UUID) if err != nil { log.Err(err).Stringer("recipient_id", recipient.UUID).Msg("Failed to get profile key") diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index d9fd831..e37fdf0 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -543,11 +543,10 @@ func (cli *Client) SendGroupMessage(ctx context.Context, gid types.GroupIdentifi Stringer("group_id", gid). Logger() ctx = log.WithContext(ctx) - group, err := cli.RetrieveGroupByID(ctx, gid, 0) + group, endorsement, err := cli.RetrieveGroupByID(ctx, gid, 0) if err != nil { return nil, err } - var messageTimestamp uint64 if content.GetDataMessage() != nil { messageTimestamp = content.DataMessage.GetTimestamp() @@ -568,7 +567,7 @@ func (cli *Client) SendGroupMessage(ctx context.Context, gid types.GroupIdentifi recipients = append(recipients, member.UserServiceID()) } if enableSenderKeySend { - return cli.sendToGroupWithSenderKey(ctx, gid, recipients, content, messageTimestamp, 0) + return cli.sendToGroupWithSenderKey(ctx, gid, recipients, ptr.Val(endorsement), content, messageTimestamp, 0) } return cli.sendToGroup(ctx, recipients, content, messageTimestamp, nil) } From 207fc6a996d117df87dce6cad3f2c314fcf05743 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 28 Nov 2025 16:51:51 +0200 Subject: [PATCH 065/170] signalmeow: add cache for unregistered ACIs --- pkg/signalmeow/keys.go | 8 +++-- pkg/signalmeow/receiving.go | 1 + pkg/signalmeow/senderkey.go | 2 +- pkg/signalmeow/sending.go | 5 ++- pkg/signalmeow/store/recipient_store.go | 35 +++++++++++++++++++ pkg/signalmeow/store/upgrades/00-latest.sql | 6 +++- .../upgrades/25-unregistered-user-cache.sql | 4 +++ 7 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 pkg/signalmeow/store/upgrades/25-unregistered-user-cache.sql diff --git a/pkg/signalmeow/keys.go b/pkg/signalmeow/keys.go index 724565a..f1801e5 100644 --- a/pkg/signalmeow/keys.go +++ b/pkg/signalmeow/keys.go @@ -405,11 +405,14 @@ func addBase64PaddingAndDecode(data string) ([]byte, error) { } var ( - ErrUnregisteredUser = errors.New("got 404 when fetching prekey, user is unregistered") + ErrUnregisteredUser = errors.New("user is unregistered") ErrDevicesChanged = errors.New("device list changed while sending skdm") ) func (cli *Client) FetchAndProcessPreKey(ctx context.Context, theirServiceID libsignalgo.ServiceID, specificDeviceID int) error { + if cli.Store.RecipientStore.IsUnregistered(ctx, theirServiceID) { + return fmt.Errorf("%w (cached)", ErrUnregisteredUser) + } // Fetch prekey deviceIDPath := "/*" if specificDeviceID >= 0 { @@ -421,7 +424,8 @@ func (cli *Client) FetchAndProcessPreKey(ctx context.Context, theirServiceID lib if err != nil { return fmt.Errorf("error sending request: %w", err) } else if resp.GetStatus() == 404 { - return ErrUnregisteredUser + cli.Store.RecipientStore.MarkUnregistered(ctx, theirServiceID, true) + return fmt.Errorf("%w (404 while querying keys)", ErrUnregisteredUser) } var respData prekeyResponse err = web.DecodeWSResponseBody(ctx, &respData, resp) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 0feee6b..a699fbc 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -443,6 +443,7 @@ func (cli *Client) handleDecryptedResult( Msg("Dropping message from non-ACI sender") return nil } + cli.Store.RecipientStore.MarkUnregistered(ctx, theirServiceID, false) handlerSuccess := true // result.Err is set if there was an error during decryption and we diff --git a/pkg/signalmeow/senderkey.go b/pkg/signalmeow/senderkey.go index 9dbe96f..4f54c81 100644 --- a/pkg/signalmeow/senderkey.go +++ b/pkg/signalmeow/senderkey.go @@ -200,12 +200,12 @@ func (cli *Client) sendToGroupWithSenderKey( Msg("Got successful multi-recipient send response") for serviceID := range deviceIDs { if slices.Contains(respData.UUIDs404, serviceID) { - // TODO flag recipient as unregistered err = cli.Store.ACISessionStore.RemoveAllSessionsForServiceID(ctx, serviceID) if err != nil { log.Err(err).Stringer("recipient_id", serviceID). Msg("Failed to remove sessions after 404") } + cli.Store.RecipientStore.MarkUnregistered(ctx, serviceID, true) result.FailedToSendTo = append(result.FailedToSendTo, FailedSendResult{ Recipient: serviceID, Error: fmt.Errorf("multi-recipient send 404"), diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index e37fdf0..47695d9 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -159,7 +159,6 @@ func (cli *Client) buildMessagesToSend( // No sessions, make one with prekey err = cli.FetchAndProcessPreKey(ctx, recipient, -1) if err != nil { - // TODO flag 404s as unregistered return nil, err } sessions, err = cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, recipient) @@ -952,12 +951,12 @@ func (cli *Client) sendContent( return sentUnidentified, err } } else if *response.Status == 404 { - // TODO flag recipient as unregistered err = cli.Store.ACISessionStore.RemoveAllSessionsForServiceID(ctx, recipient) if err != nil { log.Err(err).Msg("Failed to remove sessions after 404") } - return sentUnidentified, ErrUnregisteredUser + cli.Store.RecipientStore.MarkUnregistered(ctx, recipient, true) + return sentUnidentified, fmt.Errorf("%w (send returned 404)", ErrUnregisteredUser) } else if *response.Status != 200 { return sentUnidentified, fmt.Errorf("unexpected status code while sending: %d", *response.Status) } diff --git a/pkg/signalmeow/store/recipient_store.go b/pkg/signalmeow/store/recipient_store.go index 00646df..98c7315 100644 --- a/pkg/signalmeow/store/recipient_store.go +++ b/pkg/signalmeow/store/recipient_store.go @@ -43,6 +43,9 @@ type RecipientStore interface { StoreRecipient(ctx context.Context, recipient *types.Recipient) error UpdateRecipientE164(ctx context.Context, aci, pni uuid.UUID, e164 string) (*types.Recipient, error) + IsUnregistered(ctx context.Context, serviceID libsignalgo.ServiceID) bool + MarkUnregistered(ctx context.Context, serviceID libsignalgo.ServiceID, unregistered bool) + LoadAllContacts(ctx context.Context) ([]*types.Recipient, error) } @@ -387,3 +390,35 @@ func (s *sqlStore) StoreRecipient(ctx context.Context, recipient *types.Recipien } return } + +const ( + isUnregisteredQuery = `SELECT 1 FROM signalmeow_unregistered_users WHERE aci_uuid=$1` + markUnregisteredQuery = `INSERT INTO signalmeow_unregistered_users (aci_uuid) VALUES ($1) ON CONFLICT (aci_uuid) DO NOTHING` + markRegisteredQuery = `DELETE FROM signalmeow_unregistered_users WHERE aci_uuid=$1` +) + +func (s *sqlStore) IsUnregistered(ctx context.Context, serviceID libsignalgo.ServiceID) (unregistered bool) { + if serviceID.Type != libsignalgo.ServiceIDTypeACI { + return + } + _ = s.db.QueryRow(ctx, isUnregisteredQuery, serviceID.UUID).Scan(&unregistered) + return +} + +func (s *sqlStore) MarkUnregistered(ctx context.Context, serviceID libsignalgo.ServiceID, unregistered bool) { + if serviceID.Type != libsignalgo.ServiceIDTypeACI { + return + } + var err error + if unregistered { + _, err = s.db.Exec(ctx, markUnregisteredQuery, serviceID.UUID) + } else { + _, err = s.db.Exec(ctx, markRegisteredQuery, serviceID.UUID) + } + if err != nil { + zerolog.Ctx(ctx).Err(err). + Stringer("service_id", serviceID). + Bool("unregistered", unregistered). + Msg("Failed to mark recipient as unregistered") + } +} diff --git a/pkg/signalmeow/store/upgrades/00-latest.sql b/pkg/signalmeow/store/upgrades/00-latest.sql index 4d42cde..dee3509 100644 --- a/pkg/signalmeow/store/upgrades/00-latest.sql +++ b/pkg/signalmeow/store/upgrades/00-latest.sql @@ -1,4 +1,4 @@ --- v0 -> v24 (compatible with v13+): Latest revision +-- v0 -> v25 (compatible with v13+): Latest revision CREATE TABLE signalmeow_device ( aci_uuid TEXT PRIMARY KEY, @@ -134,6 +134,10 @@ CREATE TABLE signalmeow_recipients ( CONSTRAINT signalmeow_contacts_pni_unique UNIQUE (account_id, pni_uuid) ); +CREATE TABLE signalmeow_unregistered_users ( + aci_uuid uuid PRIMARY KEY +); + CREATE TABLE signalmeow_backup_recipient ( account_id TEXT NOT NULL, recipient_id BIGINT NOT NULL, diff --git a/pkg/signalmeow/store/upgrades/25-unregistered-user-cache.sql b/pkg/signalmeow/store/upgrades/25-unregistered-user-cache.sql new file mode 100644 index 0000000..04a5233 --- /dev/null +++ b/pkg/signalmeow/store/upgrades/25-unregistered-user-cache.sql @@ -0,0 +1,4 @@ +-- v25 (compatible with v13+): Cache unregistered users +CREATE TABLE signalmeow_unregistered_users ( + aci_uuid uuid PRIMARY KEY +); From 30e80bb18bb210c58736e4d34692867a3e44be08 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 28 Nov 2025 16:59:12 +0200 Subject: [PATCH 066/170] signalmeow/sending: enable sender key sending --- pkg/signalmeow/sending.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 47695d9..97fdcdf 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -534,7 +534,7 @@ func (cli *Client) SendGroupUpdate(ctx context.Context, group *Group, groupConte return cli.sendToGroup(ctx, recipients, content, timestamp, nil) } -const enableSenderKeySend = false +const enableSenderKeySend = true func (cli *Client) SendGroupMessage(ctx context.Context, gid types.GroupIdentifier, content *signalpb.Content) (*GroupMessageSendResult, error) { log := zerolog.Ctx(ctx).With(). From d8ccce0e477258759c5395a2112797f2c4de5393 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 28 Nov 2025 22:02:16 +0200 Subject: [PATCH 067/170] build: replace build-go with go tool and remove debug mode --- Dockerfile | 16 ++-------------- build-go.sh | 9 +-------- build-rust.sh | 9 +-------- go.mod | 13 ++++++++----- go.sum | 22 ++++++++++++---------- 5 files changed, 24 insertions(+), 45 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9c5e495..162ac86 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # -- Build libsignal (with Rust) -- -FROM rust:1-alpine as rust-builder +FROM rust:1-alpine AS rust-builder RUN apk add --no-cache git make cmake protoc musl-dev g++ clang-dev WORKDIR /build @@ -7,12 +7,11 @@ WORKDIR /build COPY pkg/libsignalgo/libsignal/. pkg/libsignalgo/libsignal/. COPY build-rust.sh . -ARG DBG=0 RUN ./build-rust.sh # -- Build mautrix-signal (with Go) -- FROM golang:1-alpine3.22 AS go-builder -RUN apk add --no-cache git ca-certificates build-base olm-dev +RUN apk add --no-cache git ca-certificates build-base olm-dev zlib-dev WORKDIR /build # Copy all files needed for Go build, and no Rust files @@ -26,15 +25,9 @@ COPY pkg/connector/. pkg/connector/. COPY cmd/. cmd/. COPY .git .git -ARG DBG=0 ENV LIBRARY_PATH=. COPY --from=rust-builder /build/pkg/libsignalgo/libsignal/target/*/libsignal_ffi.a ./ RUN < Date: Tue, 2 Dec 2025 15:26:16 +0200 Subject: [PATCH 068/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- pkg/connector/handlematrix.go | 35 +++++++++++++++++------------------ 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 29e277e..35a4fb2 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.47.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.1-0.20251128114054-1d1ecb228668 + maunium.net/go/mautrix v0.26.1-0.20251202132204-2eeece694254 ) require ( diff --git a/go.sum b/go.sum index 64f1f5c..cc4b594 100644 --- a/go.sum +++ b/go.sum @@ -97,5 +97,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.1-0.20251128114054-1d1ecb228668 h1:Y6B67gtYwMpePlI9Spz1EKVsLiAvKJ+rxRBZRWbGjmI= -maunium.net/go/mautrix v0.26.1-0.20251128114054-1d1ecb228668/go.mod h1:NaesYcOQWFDbixVYywCVS+Twlzab9hOUpFNlCBlvciE= +maunium.net/go/mautrix v0.26.1-0.20251202132204-2eeece694254 h1:rsc4H0sZVban6xQeIS6err1YangUiK5WzVfTS6s03ms= +maunium.net/go/mautrix v0.26.1-0.20251202132204-2eeece694254/go.mod h1:NaesYcOQWFDbixVYywCVS+Twlzab9hOUpFNlCBlvciE= diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index cdd3c0a..25d3f53 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -405,22 +405,21 @@ func (s *SignalClient) HandleMatrixRoomTopic(ctx context.Context, msg *bridgev2. }, nil) } -func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2.MatrixMembershipChange) (bool, error) { +func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2.MatrixMembershipChange) (*bridgev2.MatrixMembershipResult, error) { var targetIntent bridgev2.MatrixAPI var targetSignalID libsignalgo.ServiceID var err error if msg.Portal.RoomType == database.RoomTypeDM { - //TODO: this probably needs to revert some changes and clean up the portal on leaves switch msg.Type { case bridgev2.Invite: - return false, fmt.Errorf("cannot invite additional user to dm") + return nil, fmt.Errorf("cannot invite additional user to dm") default: - return false, nil + return nil, nil } } targetSignalID, err = signalid.ParseGhostOrUserLoginID(msg.Target) if err != nil { - return false, fmt.Errorf("failed to parse target signal id: %w", err) + return nil, fmt.Errorf("failed to parse target signal id: %w", err) } switch target := msg.Target.(type) { case *bridgev2.Ghost: @@ -430,12 +429,12 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 if targetIntent == nil { ghost, err := s.Main.Bridge.GetGhostByID(ctx, networkid.UserID(target.ID)) if err != nil { - return false, fmt.Errorf("failed to get ghost for user: %w", err) + return nil, fmt.Errorf("failed to get ghost for user: %w", err) } targetIntent = ghost.Intent } default: - return false, fmt.Errorf("cannot get target intent: unknown type: %T", target) + return nil, fmt.Errorf("cannot get target intent: unknown type: %T", target) } log := zerolog.Ctx(ctx).With(). Str("From Membership", string(msg.Type.From)). @@ -455,7 +454,7 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 switch msg.Type { case bridgev2.AcceptInvite: if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { - return false, fmt.Errorf("can't accept invite for non-ACI service ID") + return nil, fmt.Errorf("can't accept invite for non-ACI service ID") } gc.PromotePendingMembers = []*signalmeow.PromotePendingMember{{ ACI: targetSignalID.UUID, @@ -464,7 +463,7 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 gc.DeletePendingMembers = []*libsignalgo.ServiceID{&targetSignalID} case bridgev2.Leave, bridgev2.Kick: if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { - return false, fmt.Errorf("can't kick non-ACI service ID") + return nil, fmt.Errorf("can't kick non-ACI service ID") } gc.DeleteMembers = []*uuid.UUID{&targetSignalID.UUID} case bridgev2.Invite: @@ -500,7 +499,7 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 // }} case bridgev2.AcceptKnock: if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { - return false, fmt.Errorf("can't accept knock from non-ACI service ID") + return nil, fmt.Errorf("can't accept knock from non-ACI service ID") } gc.PromoteRequestingMembers = []*signalmeow.RoleMember{{ ACI: targetSignalID.UUID, @@ -508,7 +507,7 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 }} case bridgev2.RetractKnock, bridgev2.RejectKnock: if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { - return false, fmt.Errorf("can't reject knock from non-ACI service ID") + return nil, fmt.Errorf("can't reject knock from non-ACI service ID") } gc.DeleteRequestingMembers = []*uuid.UUID{&targetSignalID.UUID} case bridgev2.BanKnocked, bridgev2.BanInvited, bridgev2.BanJoined, bridgev2.BanLeft: @@ -519,39 +518,39 @@ func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2 switch msg.Type { case bridgev2.BanJoined: if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { - return false, fmt.Errorf("can't ban joined non-ACI service ID") + return nil, fmt.Errorf("can't ban joined non-ACI service ID") } gc.DeleteMembers = []*uuid.UUID{&targetSignalID.UUID} case bridgev2.BanInvited: gc.DeletePendingMembers = []*libsignalgo.ServiceID{&targetSignalID} case bridgev2.BanKnocked: if targetSignalID.Type != libsignalgo.ServiceIDTypeACI { - return false, fmt.Errorf("can't ban knocked non-ACI service ID") + return nil, fmt.Errorf("can't ban knocked non-ACI service ID") } gc.DeleteRequestingMembers = []*uuid.UUID{&targetSignalID.UUID} } case bridgev2.Unban: gc.DeleteBannedMembers = []*libsignalgo.ServiceID{&targetSignalID} default: - return false, fmt.Errorf("unsupported membership change: %s -> %s", msg.Type.From, msg.Type.To) + return nil, fmt.Errorf("unsupported membership change: %s -> %s", msg.Type.From, msg.Type.To) } _, groupID, err := signalid.ParsePortalID(msg.Portal.ID) if err != nil || groupID == "" { - return false, err + return nil, err } gc.Revision = msg.Portal.Metadata.(*signalid.PortalMetadata).Revision + 1 revision, err := s.Client.UpdateGroup(ctx, gc, groupID) if err != nil { - return false, err + return nil, err } if msg.Type == bridgev2.Invite && targetSignalID.Type != libsignalgo.ServiceIDTypePNI { err = targetIntent.EnsureJoined(ctx, msg.Portal.MXID) if err != nil { - return false, err + return nil, err } } msg.Portal.Metadata.(*signalid.PortalMetadata).Revision = revision - return true, nil + return nil, nil } func plToRole(pl int) signalmeow.GroupMemberRole { From f286c41844dcc60c32951010a68a21236fe121e5 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 5 Dec 2025 16:02:23 +0200 Subject: [PATCH 069/170] chatinfo: re-query recipient if ACI is marked as unregistered --- pkg/connector/chatinfo.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 88cf3e2..c8d6c2b 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -212,7 +212,7 @@ func (s *SignalClient) ResolveIdentifier(ctx context.Context, number string, _ b e164String := fmt.Sprintf("+%d", e164Number) if recipient, err = s.Client.ContactByE164(ctx, e164String); err != nil { return nil, fmt.Errorf("error looking up number in local contact list: %w", err) - } else if recipient != nil { + } else if recipient != nil && (recipient.ACI == uuid.Nil || !s.Client.Store.RecipientStore.IsUnregistered(ctx, libsignalgo.NewACIServiceID(recipient.ACI))) { aci = recipient.ACI pni = recipient.PNI } else if resp, err := s.Client.LookupPhone(ctx, e164Number); err != nil { @@ -228,6 +228,9 @@ func (s *SignalClient) ResolveIdentifier(ctx context.Context, number string, _ b zerolog.Ctx(ctx).Err(err).Msg("Failed to save recipient entry after looking up phone") } aci, pni = recipient.ACI, recipient.PNI + if aci != uuid.Nil { + s.Client.Store.RecipientStore.MarkUnregistered(ctx, libsignalgo.NewACIServiceID(aci), false) + } } } else { aci, pni = serviceID.ToACIAndPNI() From b2a6d23eed957d202501ef5a70323fdca5695fb1 Mon Sep 17 00:00:00 2001 From: Conan Date: Mon, 8 Dec 2025 21:32:08 +0800 Subject: [PATCH 070/170] capabilities: bump bridge info version (#625) --- pkg/connector/capabilities.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/connector/capabilities.go b/pkg/connector/capabilities.go index ca2975c..97affb9 100644 --- a/pkg/connector/capabilities.go +++ b/pkg/connector/capabilities.go @@ -231,5 +231,5 @@ func (s *SignalConnector) GetCapabilities() *bridgev2.NetworkGeneralCapabilities } func (s *SignalConnector) GetBridgeInfoVersion() (info, capabilities int) { - return 1, 6 + return 1, 7 } From b4048bf1e3baec7f5c5730e86489f91040618435 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 8 Dec 2025 16:45:42 +0200 Subject: [PATCH 071/170] signalmeow/receiving: read group ID from USMC --- pkg/libsignalgo/sealedsender.go | 28 ++++++++++++++++------------ pkg/signalmeow/receiving_decrypt.go | 7 +++++++ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/pkg/libsignalgo/sealedsender.go b/pkg/libsignalgo/sealedsender.go index 5a55a2c..fd05031 100644 --- a/pkg/libsignalgo/sealedsender.go +++ b/pkg/libsignalgo/sealedsender.go @@ -23,6 +23,7 @@ package libsignalgo import "C" import ( "context" + "fmt" "runtime" "unsafe" @@ -252,18 +253,21 @@ func (usmc *UnidentifiedSenderMessageContent) GetContents() ([]byte, error) { return CopySignalOwnedBufferToBytes(contents), nil } -//func (usmc *UnidentifiedSenderMessageContent) GetGroupID() ([]byte, error) { -// var groupID *C.uchar -// var length C.ulong -// signalFfiError := C.signal_unidentified_sender_message_content_get_group_id(&groupID, &length, usmc.ptr) -// if signalFfiError != nil { -// return nil, wrapError(signalFfiError) -// } -// if groupID == nil { -// return nil, nil -// } -// return CopyBufferToBytes(groupID, length), nil -//} +func (usmc *UnidentifiedSenderMessageContent) GetGroupID() (*GroupIdentifier, error) { + var contents C.SignalOwnedBuffer = C.SignalOwnedBuffer{} + signalFfiError := C.signal_unidentified_sender_message_content_get_group_id_or_empty(&contents, usmc.constPtr()) + runtime.KeepAlive(usmc) + if signalFfiError != nil { + return nil, wrapError(signalFfiError) + } + bytes := CopySignalOwnedBufferToBytes(contents) + if len(bytes) == 0 { + return nil, nil + } else if len(bytes) != GroupIdentifierLength { + return nil, fmt.Errorf("unexpected group ID length: %d", len(bytes)) + } + return (*GroupIdentifier)(bytes), nil +} func (usmc *UnidentifiedSenderMessageContent) GetSenderCertificate() (*SenderCertificate, error) { var senderCertificate C.SignalMutPointerSenderCertificate diff --git a/pkg/signalmeow/receiving_decrypt.go b/pkg/signalmeow/receiving_decrypt.go index 1ffceb0..e5c1b7a 100644 --- a/pkg/signalmeow/receiving_decrypt.go +++ b/pkg/signalmeow/receiving_decrypt.go @@ -39,6 +39,7 @@ type DecryptionResult struct { Content *signalpb.Content ContentHint signalpb.UnidentifiedSenderMessage_Message_ContentHint Err error + GroupID *libsignalgo.GroupIdentifier } func (cli *Client) decryptEnvelope( @@ -315,6 +316,10 @@ func (cli *Client) decryptUnidentifiedSenderEnvelope(ctx context.Context, destin if err != nil { return result, fmt.Errorf("failed to get content hint: %w", err) } + result.GroupID, err = usmc.GetGroupID() + if err != nil { + return result, fmt.Errorf("failed to get group ID: %w", err) + } result.ContentHint = signalpb.UnidentifiedSenderMessage_Message_ContentHint(contentHint) senderUUID, err := senderCertificate.GetSenderUUID() if err != nil { @@ -339,6 +344,7 @@ func (cli *Client) decryptUnidentifiedSenderEnvelope(ctx context.Context, destin } newLog := log.With(). Stringer("sender_uuid", senderUUID). + Stringer("group_id", result.GroupID). Uint32("sender_device_id", senderDeviceID). Str("sender_e164", senderE164). Uint8("sealed_sender_type", uint8(messageType)). @@ -372,6 +378,7 @@ func (cli *Client) decryptUnidentifiedSenderEnvelope(ctx context.Context, destin if err != nil { return result, err } + resultPtr.GroupID = result.GroupID return *resultPtr, nil } From 36e9f02dce312d8407acf7ac3f6da08a387f942e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 8 Dec 2025 23:11:45 +0200 Subject: [PATCH 072/170] signalmeow: add support for retry receipts --- pkg/libsignalgo/decryptionerrormessage.go | 9 +- pkg/libsignalgo/publickey.go | 3 + pkg/libsignalgo/sealedsender.go | 14 +- pkg/libsignalgo/session_test.go | 2 +- pkg/libsignalgo/sessionrecord.go | 3 + pkg/signalmeow/client.go | 10 ++ pkg/signalmeow/receiving.go | 62 +++++-- pkg/signalmeow/receiving_decrypt.go | 42 ++++- pkg/signalmeow/retry.go | 206 ++++++++++++++++++++++ pkg/signalmeow/senderkey.go | 26 +-- pkg/signalmeow/sending.go | 161 +++++++++-------- 11 files changed, 425 insertions(+), 113 deletions(-) create mode 100644 pkg/signalmeow/retry.go diff --git a/pkg/libsignalgo/decryptionerrormessage.go b/pkg/libsignalgo/decryptionerrormessage.go index 105fffc..434d40f 100644 --- a/pkg/libsignalgo/decryptionerrormessage.go +++ b/pkg/libsignalgo/decryptionerrormessage.go @@ -23,7 +23,6 @@ package libsignalgo import "C" import ( "runtime" - "time" ) type DecryptionErrorMessage struct { @@ -49,7 +48,7 @@ func DeserializeDecryptionErrorMessage(messageBytes []byte) (*DecryptionErrorMes return wrapDecryptionErrorMessage(dem.raw), nil } -func DecryptionErrorMessageForOriginalMessage(originalBytes []byte, originalType uint8, originalTs uint64, originalSenderDeviceID uint) (*DecryptionErrorMessage, error) { +func DecryptionErrorMessageForOriginalMessage(originalBytes []byte, originalType CiphertextMessageType, originalTs uint64, originalSenderDeviceID uint) (*DecryptionErrorMessage, error) { var dem C.SignalMutPointerDecryptionErrorMessage signalFfiError := C.signal_decryption_error_message_for_original_message( &dem, @@ -112,14 +111,14 @@ func (dem *DecryptionErrorMessage) Serialize() ([]byte, error) { return CopySignalOwnedBufferToBytes(serialized), nil } -func (dem *DecryptionErrorMessage) GetTimestamp() (time.Time, error) { +func (dem *DecryptionErrorMessage) GetTimestamp() (uint64, error) { var ts C.uint64_t signalFfiError := C.signal_decryption_error_message_get_timestamp(&ts, dem.constPtr()) runtime.KeepAlive(dem) if signalFfiError != nil { - return time.Time{}, wrapError(signalFfiError) + return 0, wrapError(signalFfiError) } - return time.UnixMilli(int64(ts)), nil + return uint64(ts), nil } func (dem *DecryptionErrorMessage) GetDeviceID() (uint32, error) { diff --git a/pkg/libsignalgo/publickey.go b/pkg/libsignalgo/publickey.go index dcf9647..bd7452e 100644 --- a/pkg/libsignalgo/publickey.go +++ b/pkg/libsignalgo/publickey.go @@ -29,6 +29,9 @@ type PublicKey struct { } func wrapPublicKey(ptr *C.SignalPublicKey) *PublicKey { + if ptr == nil { + return nil + } publicKey := &PublicKey{ptr: ptr} runtime.SetFinalizer(publicKey, (*PublicKey).Destroy) return publicKey diff --git a/pkg/libsignalgo/sealedsender.go b/pkg/libsignalgo/sealedsender.go index fd05031..5327f1c 100644 --- a/pkg/libsignalgo/sealedsender.go +++ b/pkg/libsignalgo/sealedsender.go @@ -44,7 +44,7 @@ func NewSealedSenderAddress(e164 string, uuid uuid.UUID, deviceID uint32) *Seale } } -func SealedSenderEncryptPlaintext(ctx context.Context, message []byte, contentHint UnidentifiedSenderMessageContentHint, forAddress *Address, fromSenderCert *SenderCertificate, sessionStore SessionStore, identityStore IdentityKeyStore) ([]byte, error) { +func SealedSenderEncryptPlaintext(ctx context.Context, message []byte, contentHint UnidentifiedSenderMessageContentHint, forAddress *Address, fromSenderCert *SenderCertificate, sessionStore SessionStore, identityStore IdentityKeyStore, groupID *GroupIdentifier) ([]byte, error) { ciphertextMessage, err := Encrypt(ctx, message, forAddress, sessionStore, identityStore) if err != nil { return nil, err @@ -54,7 +54,7 @@ func SealedSenderEncryptPlaintext(ctx context.Context, message []byte, contentHi ciphertextMessage, fromSenderCert, contentHint, - nil, + groupID, ) if err != nil { return nil, err @@ -170,18 +170,22 @@ func wrapUnidentifiedSenderMessageContent(ptr *C.SignalUnidentifiedSenderMessage return messageContent } -func NewUnidentifiedSenderMessageContent(message *CiphertextMessage, senderCertificate *SenderCertificate, contentHint UnidentifiedSenderMessageContentHint, groupID []byte) (*UnidentifiedSenderMessageContent, error) { +func NewUnidentifiedSenderMessageContent(message *CiphertextMessage, senderCertificate *SenderCertificate, contentHint UnidentifiedSenderMessageContentHint, groupID *GroupIdentifier) (*UnidentifiedSenderMessageContent, error) { var usmc C.SignalMutPointerUnidentifiedSenderMessageContent + var groupIDBytes []byte + if groupID != nil { + groupIDBytes = groupID[:] + } signalFfiError := C.signal_unidentified_sender_message_content_new( &usmc, message.constPtr(), senderCertificate.constPtr(), C.uint32_t(contentHint), - BytesToBuffer(groupID), + BytesToBuffer(groupIDBytes), ) runtime.KeepAlive(message) runtime.KeepAlive(senderCertificate) - runtime.KeepAlive(groupID) + runtime.KeepAlive(groupIDBytes) if signalFfiError != nil { return nil, wrapError(signalFfiError) } diff --git a/pkg/libsignalgo/session_test.go b/pkg/libsignalgo/session_test.go index 30af762..6d0b720 100644 --- a/pkg/libsignalgo/session_test.go +++ b/pkg/libsignalgo/session_test.go @@ -241,7 +241,7 @@ func TestSealedSenderEncrypt_Repeated(t *testing.T) { }() for i := 0; i < 100; i++ { message := []byte(fmt.Sprintf("%04d vision", i)) - ciphertext, err := libsignalgo.SealedSenderEncryptPlaintext(ctx, message, libsignalgo.UnidentifiedSenderMessageContentHintDefault, bobAddress, senderCert, aliceStore, aliceStore) + ciphertext, err := libsignalgo.SealedSenderEncryptPlaintext(ctx, message, libsignalgo.UnidentifiedSenderMessageContentHintDefault, bobAddress, senderCert, aliceStore, aliceStore, nil) require.NoError(t, err) assert.NotNil(t, ciphertext) } diff --git a/pkg/libsignalgo/sessionrecord.go b/pkg/libsignalgo/sessionrecord.go index a2ee9dd..b4f2afb 100644 --- a/pkg/libsignalgo/sessionrecord.go +++ b/pkg/libsignalgo/sessionrecord.go @@ -83,6 +83,9 @@ func (sr *SessionRecord) ArchiveCurrentState() error { } func (sr *SessionRecord) CurrentRatchetKeyMatches(key *PublicKey) (bool, error) { + if sr == nil || key == nil { + return false, nil + } var result C.bool signalFfiError := C.signal_session_record_current_ratchet_key_matches( &result, diff --git a/pkg/signalmeow/client.go b/pkg/signalmeow/client.go index 52fa12d..57598cd 100644 --- a/pkg/signalmeow/client.go +++ b/pkg/signalmeow/client.go @@ -26,9 +26,11 @@ import ( "time" "github.com/rs/zerolog" + "go.mau.fi/util/exsync" "go.mau.fi/mautrix-signal/pkg/libsignalgo" "go.mau.fi/mautrix-signal/pkg/signalmeow/events" + signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" "go.mau.fi/mautrix-signal/pkg/signalmeow/store" "go.mau.fi/mautrix-signal/pkg/signalmeow/types" "go.mau.fi/mautrix-signal/pkg/signalmeow/web" @@ -42,6 +44,8 @@ type Client struct { senderCertificateNoE164 *libsignalgo.SenderCertificate senderCertificateCache sync.Mutex + sendCache *exsync.RingBuffer[sendCacheKey, *signalpb.Content] + GroupCache *GroupCache ProfileCache *ProfileCache LastContactRequestTime time.Time @@ -67,6 +71,11 @@ type Client struct { writeCallbackCounter chan time.Time } +// InMemorySendCacheSize specifies how large the cache for sent messages is, which is used to respond to retry receipts. +// The cache is large because every group member will be listed separately. +// 2k entries should hold at least 2 messages in max size groups. +var InMemorySendCacheSize = 2048 + func NewClient(device *store.Device, log zerolog.Logger, evtHandler func(events.SignalEvent) bool) *Client { return &Client{ Store: device, @@ -78,6 +87,7 @@ func NewClient(device *store.Device, log zerolog.Logger, evtHandler func(events. errors: make(map[string]*error), lastFetched: make(map[string]time.Time), }, + sendCache: exsync.NewRingBuffer[sendCacheKey, *signalpb.Content](InMemorySendCacheSize), } } diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index a699fbc..b5ed96d 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -397,7 +397,7 @@ func (cli *Client) handleDecryptedResult( result DecryptionResult, envelope *signalpb.Envelope, destinationServiceID libsignalgo.ServiceID, -) error { +) (retErr error) { if errors.Is(result.Err, context.Canceled) { return result.Err } else if ctx.Err() != nil { @@ -446,6 +446,11 @@ func (cli *Client) handleDecryptedResult( cli.Store.RecipientStore.MarkUnregistered(ctx, theirServiceID, false) handlerSuccess := true + defer func() { + if retErr == nil && !handlerSuccess { + retErr = ErrHandlerFailed + } + }() // result.Err is set if there was an error during decryption and we // should notifiy the user that the message could not be decrypted if result.Err != nil { @@ -477,6 +482,14 @@ func (cli *Client) handleDecryptedResult( Timestamp: envelope.GetTimestamp(), }) } + if result.Retriable { + go func() { + err := cli.sendRetryRequest(ctx, result, envelope.GetTimestamp()) + if err != nil { + log.Err(err).Msg("Failed to send retry request in background") + } + }() + } if !handlerSuccess { return ErrHandlerFailed } @@ -490,7 +503,11 @@ func (cli *Client) handleDecryptedResult( } deviceID, _ := result.SenderAddress.DeviceID() - log.Trace().Any("raw_data", content).Stringer("sender", theirServiceID).Uint("sender_device", deviceID).Msg("Raw event data") + log.Trace(). + Any("raw_data", content). + Stringer("sender", theirServiceID). + Uint("sender_device", deviceID). + Msg("Raw event data") newLog := log.With(). Stringer("sender_name", theirServiceID). Uint("sender_device_id", deviceID). @@ -502,7 +519,26 @@ func (cli *Client) handleDecryptedResult( if result.CiphertextHash != nil { logEvt = logEvt.Hex("ciphertext_hash", result.CiphertextHash[:]) } - logEvt.Msg("Decrypted message") + logEvt.Bool("unencrypted", result.Unencrypted).Msg("Decrypted message") + + if content.DecryptionErrorMessage != nil { + handlerSuccess = true + dem, err := libsignalgo.DeserializeDecryptionErrorMessage(content.DecryptionErrorMessage) + if err != nil { + log.Warn().Err(err).Msg("Failed to unmarshal decryption error message") + } else { + go func() { + err := cli.handleRetryRequest(ctx, result, dem) + if err != nil { + log.Err(err).Msg("Failed to handle decryption error message in background") + } + }() + } + return + } else if result.Unencrypted { + log.Warn().Msg("Unexpected non-decryption-error content in unencrypted message") + return nil + } // If there's a sender key distribution message, process it if content.GetSenderKeyDistributionMessage() != nil { @@ -538,22 +574,20 @@ func (cli *Client) handleDecryptedResult( } } - if content.GetPniSignatureMessage() != nil { + if content.PniSignatureMessage != nil { log.Debug().Msg("Content includes PNI signature message") - err = cli.handlePNISignatureMessage(ctx, theirServiceID, content.GetPniSignatureMessage()) + err = cli.handlePNISignatureMessage(ctx, theirServiceID, content.PniSignatureMessage) if err != nil { log.Err(err). - Hex("pni_raw", content.GetPniSignatureMessage().GetPni()). + Hex("pni_raw", content.PniSignatureMessage.GetPni()). Stringer("aci", theirServiceID.UUID). Msg("Failed to verify ACI-PNI mapping") } } if content.SyncMessage != nil && theirServiceID == cli.Store.ACIServiceID() { - handlerSuccess, err = cli.handleSyncMessage(ctx, content.SyncMessage, envelope) - if err != nil { - return err - } + handlerSuccess = cli.handleSyncMessage(ctx, content.SyncMessage, envelope) + return nil } isBlocked, err := cli.Store.RecipientStore.IsBlocked(ctx, theirServiceID.UUID) @@ -620,9 +654,6 @@ func (cli *Client) handleDecryptedResult( Content: content.ReceiptMessage, }) && handlerSuccess } - if !handlerSuccess { - return ErrHandlerFailed - } return nil } @@ -633,7 +664,7 @@ func groupOrUserID(groupID types.GroupIdentifier, userID libsignalgo.ServiceID) return string(groupID) } -func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMessage, envelope *signalpb.Envelope) (handlerSuccess bool, err error) { +func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMessage, envelope *signalpb.Envelope) (handlerSuccess bool) { // TODO: handle more sync messages handlerSuccess = true log := zerolog.Ctx(ctx) @@ -655,7 +686,7 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess } else { log.Debug().Msg("No account entropy pool in sync message") } - err = cli.Store.DeviceStore.PutDevice(ctx, &cli.Store.DeviceData) + err := cli.Store.DeviceStore.PutDevice(ctx, &cli.Store.DeviceData) if err != nil { log.Err(err).Msg("Failed to save device after receiving master key") } else { @@ -671,6 +702,7 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess destination := syncSent.DestinationServiceId var syncDestinationServiceID libsignalgo.ServiceID if destination != nil { + var err error syncDestinationServiceID, err = libsignalgo.ServiceIDFromString(*destination) if err != nil { log.Err(err).Msg("Sync message destination parse error") diff --git a/pkg/signalmeow/receiving_decrypt.go b/pkg/signalmeow/receiving_decrypt.go index e5c1b7a..5c8da08 100644 --- a/pkg/signalmeow/receiving_decrypt.go +++ b/pkg/signalmeow/receiving_decrypt.go @@ -40,6 +40,11 @@ type DecryptionResult struct { ContentHint signalpb.UnidentifiedSenderMessage_Message_ContentHint Err error GroupID *libsignalgo.GroupIdentifier + Unencrypted bool + + Retriable bool + Ciphertext []byte + CiphertextType libsignalgo.CiphertextMessageType } func (cli *Client) decryptEnvelope( @@ -80,12 +85,30 @@ func (cli *Client) decryptEnvelope( bundleType = "ciphertext" } if err != nil { - return DecryptionResult{Err: fmt.Errorf("failed to decrypt %s envelope: %w", bundleType, err), SenderAddress: sender} + return DecryptionResult{ + SenderAddress: sender, + Err: fmt.Errorf("failed to decrypt %s envelope: %w", bundleType, err), + Retriable: true, // TODO should these ever be not retriable? + Ciphertext: envelope.Content, + CiphertextType: libsignalgo.CiphertextMessageType(envelope.GetType()), + } } return *result case signalpb.Envelope_PLAINTEXT_CONTENT: - return DecryptionResult{Err: fmt.Errorf("plaintext messages are not supported")} + addr, err := libsignalgo.NewUUIDAddressFromString(envelope.GetSourceServiceId(), uint(envelope.GetSourceDevice())) + if err != nil { + return DecryptionResult{Err: fmt.Errorf("failed to wrap address: %v", err)} + } + content, err := stripPadding(envelope.GetContent()) + if err != nil { + return DecryptionResult{Err: fmt.Errorf("failed to strip padding: %w", err)} + } + return DecryptionResult{ + SenderAddress: addr, + Content: &signalpb.Content{DecryptionErrorMessage: content}, + Unencrypted: true, + } case signalpb.Envelope_SERVER_DELIVERY_RECEIPT: return DecryptionResult{Err: fmt.Errorf("server delivery receipt envelopes are not yet supported")} @@ -342,6 +365,8 @@ func (cli *Client) decryptUnidentifiedSenderEnvelope(ctx context.Context, destin if err != nil { return result, fmt.Errorf("failed to get USMC contents: %w", err) } + result.Ciphertext = usmcContents + result.CiphertextType = messageType newLog := log.With(). Stringer("sender_uuid", senderUUID). Stringer("group_id", result.GroupID). @@ -369,13 +394,20 @@ func (cli *Client) decryptUnidentifiedSenderEnvelope(ctx context.Context, destin case libsignalgo.CiphertextMessageTypeWhisper: resultPtr, err = cli.decryptCiphertextEnvelope(ctx, destinationServiceID, senderAddress, usmcContents, envelope.GetServerTimestamp()) case libsignalgo.CiphertextMessageTypePlaintext: - // TODO: handle plaintext (usually DecryptionErrorMessage) and retries - // when implementing SenderKey groups - return result, fmt.Errorf("unsupported plaintext sealed sender message") + usmcContents, err = stripPadding(usmcContents) + if err != nil { + err = fmt.Errorf("failed to strip padding: %w", err) + } + result.Unencrypted = true + result.Content = &signalpb.Content{ + DecryptionErrorMessage: usmcContents, + } + return result, err default: return result, fmt.Errorf("unsupported sealed sender message type %d", messageType) } if err != nil { + result.Retriable = result.ContentHint == signalpb.UnidentifiedSenderMessage_Message_RESENDABLE return result, err } resultPtr.GroupID = result.GroupID diff --git a/pkg/signalmeow/retry.go b/pkg/signalmeow/retry.go new file mode 100644 index 0000000..2c89ecc --- /dev/null +++ b/pkg/signalmeow/retry.go @@ -0,0 +1,206 @@ +// mautrix-signal - A Matrix-signal puppeting bridge. +// Copyright (C) 2025 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package signalmeow + +import ( + "context" + "fmt" + "slices" + "time" + + "github.com/rs/zerolog" + + "go.mau.fi/mautrix-signal/pkg/libsignalgo" + signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" + "go.mau.fi/mautrix-signal/pkg/signalmeow/types" +) + +type sendCacheKey struct { + recipient libsignalgo.ServiceID + groupID types.GroupIdentifier + timestamp uint64 +} + +const RetryRespondMaxAge = 30 * 24 * time.Hour + +func (cli *Client) sendRetryRequest(ctx context.Context, result DecryptionResult, originalTS uint64) error { + serviceID, err := result.SenderAddress.NameServiceID() + if err != nil { + return fmt.Errorf("failed to get sender name as service ID: %w", err) + } + deviceID, err := result.SenderAddress.DeviceID() + if err != nil { + return fmt.Errorf("failed to get sender device ID: %w", err) + } + dem, err := libsignalgo.DecryptionErrorMessageForOriginalMessage(result.Ciphertext, result.CiphertextType, originalTS, deviceID) + if err != nil { + return fmt.Errorf("failed to create decryption error message: %w", err) + } + demBytes, err := dem.Serialize() + if err != nil { + return fmt.Errorf("failed to serialize decryption error message: %w", err) + } + ptc, err := libsignalgo.PlaintextContentFromDecryptionErrorMessage(dem) + if err != nil { + return fmt.Errorf("failed to create plaintext content from decryption error message: %w", err) + } + ctm, err := libsignalgo.NewCiphertextMessage(ptc) + if err != nil { + return fmt.Errorf("failed to create ciphertext message from plaintext content: %w", err) + } + _, err = cli.sendContent(ctx, serviceID, uint64(time.Now().UnixMilli()), &signalpb.Content{ + DecryptionErrorMessage: demBytes, + }, 0, true, result.GroupID, ctm) + if err != nil { + return fmt.Errorf("failed to send decryption error message: %w", err) + } + zerolog.Ctx(ctx).Debug(). + Stringer("sender_service_id", serviceID). + Uint("sender_device_id", deviceID). + Stringer("group_id", result.GroupID). + Msg("Sent retry receipt") + return nil +} + +func (cli *Client) handleRetryRequest( + ctx context.Context, + result DecryptionResult, + dem *libsignalgo.DecryptionErrorMessage, +) error { + destDeviceID, err := dem.GetDeviceID() + if err != nil { + return fmt.Errorf("failed to get device ID from decryption error message: %w", err) + } else if int(destDeviceID) != cli.Store.DeviceID { + zerolog.Ctx(ctx).Debug(). + Uint32("dest_device_id", destDeviceID). + Msg("Ignoring decryption error message for another device") + return nil + } + serviceID, err := result.SenderAddress.NameServiceID() + if err != nil { + return fmt.Errorf("failed to get sender name as service ID: %w", err) + } + deviceID, err := result.SenderAddress.DeviceID() + if err != nil { + return fmt.Errorf("failed to get sender device ID: %w", err) + } + ts, err := dem.GetTimestamp() + if err != nil { + return fmt.Errorf("failed to get timestamp: %w", err) + } + + cli.encryptionLock.Lock() + defer cli.encryptionLock.Unlock() + ctx = context.WithValue(ctx, contextKeyEncryptionLock, true) + var didArchiveSession bool + if ratchetKey, err := dem.GetRatchetKey(); err != nil { + return fmt.Errorf("failed to get ratchet key: %w", err) + } else if ratchetKey == nil { + // No need to archive session if no ratchet key is provided, it was probably a sender key decryption error + } else if session, err := cli.Store.ACISessionStore.LoadSession(ctx, result.SenderAddress); err != nil { + return fmt.Errorf("failed to load session for sender: %w", err) + } else if match, err := session.CurrentRatchetKeyMatches(ratchetKey); err != nil { + return fmt.Errorf("failed to check ratchet key match: %w", err) + } else if match { + err = session.ArchiveCurrentState() + if err != nil { + return fmt.Errorf("failed to archive current session state: %w", err) + } + err = cli.Store.ACISessionStore.StoreSession(ctx, result.SenderAddress, session) + if err != nil { + return fmt.Errorf("failed to store archived session: %w", err) + } + didArchiveSession = true + } + var skdmBytes []byte + groupID := types.BytesToGroupIdentifier(result.GroupID) + if groupID != "" { + ski, err := cli.Store.SenderKeyStore.GetSenderKeyInfo(ctx, groupID) + if err != nil { + return fmt.Errorf("failed to get sender key info for group %s: %w", groupID, err) + } + myAddress, err := cli.Store.ACIServiceID().Address(uint(cli.Store.DeviceID)) + if err != nil { + return fmt.Errorf("failed to get own address: %w", err) + } + if slices.Contains(ski.SharedWith[serviceID], int(deviceID)) { + skdm, err := libsignalgo.NewSenderKeyDistributionMessage(ctx, myAddress, ski.DistributionID, cli.Store.SenderKeyStore) + if err != nil { + return fmt.Errorf("failed to create sender key distribution message: %w", err) + } + skdmBytes, err = skdm.Serialize() + if err != nil { + return fmt.Errorf("failed to serialize sender key distribution message: %w", err) + } + } else { + zerolog.Ctx(ctx).Warn(). + Stringer("group_id", result.GroupID). + Stringer("sender_service_id", serviceID). + Stringer("distribution_id", ski.DistributionID). + Uint("sender_device_id", deviceID). + Ints("shared_with", ski.SharedWith[serviceID]). + Msg("Sender key distribution list doesn't contain retry receipt sender") + } + } + var retryContent *signalpb.Content + var cacheHit bool + if time.Since(time.UnixMilli(int64(ts))) < RetryRespondMaxAge { + retryContent, cacheHit = cli.sendCache.Get(sendCacheKey{ + groupID: groupID, + recipient: serviceID, + timestamp: ts, + }) + if !cacheHit { + // TODO add support for external caches + } + } + if retryContent == nil { + retryContent = &signalpb.Content{} + } + retryContent.SenderKeyDistributionMessage = skdmBytes + if !cacheHit && skdmBytes == nil { + if !didArchiveSession { + zerolog.Ctx(ctx).Debug(). + Uint64("msg_timestamp", ts). + Stringer("sender_service_id", serviceID). + Uint("sender_device_id", deviceID). + Stringer("group_id", result.GroupID). + Msg("Not responding to decryption error message") + return nil + } + retryContent.NullMessage = &signalpb.NullMessage{} + } + responseTimestamp := uint64(time.Now().UnixMilli()) + if cacheHit { + responseTimestamp = ts + } + zerolog.Ctx(ctx).Debug(). + Uint32("dest_device_id", destDeviceID). + Uint64("requested_msg_timestamp", ts). + Stringer("sender_service_id", serviceID). + Uint("sender_device_id", deviceID). + Stringer("group_id", result.GroupID). + Bool("did_archive_session", didArchiveSession). + Bool("found_message_in_cache", cacheHit). + Bool("including_skdm", skdmBytes != nil). + Msg("Responding to decryption error message") + _, err = cli.sendContent(ctx, serviceID, responseTimestamp, retryContent, 0, true, result.GroupID, nil) + if err != nil { + return fmt.Errorf("failed to send response: %w", err) + } + return nil +} diff --git a/pkg/signalmeow/senderkey.go b/pkg/signalmeow/senderkey.go index 4f54c81..b676d6c 100644 --- a/pkg/signalmeow/senderkey.go +++ b/pkg/signalmeow/senderkey.go @@ -48,7 +48,7 @@ const ( func (cli *Client) sendToGroupWithSenderKey( ctx context.Context, - groupID types.GroupIdentifier, + groupID *libsignalgo.GroupIdentifier, allRecipients []libsignalgo.ServiceID, sec SendEndorsementCache, content *signalpb.Content, @@ -56,7 +56,7 @@ func (cli *Client) sendToGroupWithSenderKey( retries int, ) (*GroupMessageSendResult, error) { if retries >= 3 { - return cli.sendToGroup(ctx, allRecipients, content, messageTimestamp, nil) + return cli.sendToGroup(ctx, allRecipients, content, messageTimestamp, nil, groupID) } myAddress, err := cli.Store.ACIServiceID().Address(uint(cli.Store.DeviceID)) if err != nil { @@ -79,8 +79,9 @@ func (cli *Client) sendToGroupWithSenderKey( FailedToSendTo: make([]FailedSendResult, 0), } + groupIDStr := types.GroupIdentifier(groupID.String()) deviceIDs, senderKeyRecipients, fallbackRecipients := cli.getDevicesIDs(ctx, allRecipients, sec, result) - ski, err := cli.Store.SenderKeyStore.GetSenderKeyInfo(ctx, groupID) + ski, err := cli.Store.SenderKeyStore.GetSenderKeyInfo(ctx, groupIDStr) if err != nil { return nil, fmt.Errorf("failed to get sender key info: %w", err) } else if ski == nil || time.Since(ski.CreatedAt) > SenderKeyMaxAge { @@ -127,7 +128,7 @@ func (cli *Client) sendToGroupWithSenderKey( log := log.With().Str("subaction", "skdm").Stringer("recipient_id", recipient).Logger() _, err = cli.sendContent(log.WithContext(ctx), recipient, messageTimestamp, &signalpb.Content{ SenderKeyDistributionMessage: skdmBytes, - }, 0, true, true) + }, 0, true, groupID, nil) if errors.Is(err, ErrDevicesChanged) || errors.Is(err, ErrUnregisteredUser) { log.Warn().Err(err).Msg("Failed to send sender key distribution message due to device changes, will retry") needsRetry = true @@ -143,7 +144,7 @@ func (cli *Client) sendToGroupWithSenderKey( ski.SharedWith[recipient] = deviceIDs[recipient].DeviceIDs } } - err = cli.Store.SenderKeyStore.PutSenderKeyInfo(ctx, groupID, ski) + err = cli.Store.SenderKeyStore.PutSenderKeyInfo(ctx, groupIDStr, ski) if err != nil { return nil, fmt.Errorf("failed to store updated sender key info: %w", err) } @@ -156,6 +157,9 @@ func (cli *Client) sendToGroupWithSenderKey( if err != nil { return nil, err } + for recipientID := range ski.SharedWith { + cli.addSendCache(recipientID, groupIDStr, messageTimestamp, content) + } header := http.Header{} header.Set("Content-Type", string(web.ContentTypeMultiRecipientMessage)) if sec.SendEndorsement != nil { @@ -219,13 +223,13 @@ func (cli *Client) sendToGroupWithSenderKey( } doUnlock() // Send with fallback for any recipients that couldn't do sender key, plus our own sync copy - return cli.sendToGroup(ctx, fallbackRecipients, content, messageTimestamp, result) + return cli.sendToGroup(ctx, fallbackRecipients, content, messageTimestamp, result, groupID) case 401, 404: log.Warn().Uint32("status_code", resp.GetStatus()). Msg("Multi-recipient send failed, falling back to normal send") doUnlock() // Fall back to normal send for all recipients - return cli.sendToGroup(ctx, allRecipients, content, messageTimestamp, nil) + return cli.sendToGroup(ctx, allRecipients, content, messageTimestamp, nil, groupID) case 409, 410: log.Warn().Uint32("status_code", resp.GetStatus()). Msg("Multi-recipient send failed due to outdated device list, refreshing and retrying") @@ -243,7 +247,7 @@ func (cli *Client) sendToGroupWithSenderKey( func (cli *Client) encryptWithSenderKey( ctx context.Context, - groupID types.GroupIdentifier, + groupID *libsignalgo.GroupIdentifier, distributionID uuid.UUID, myAddress *libsignalgo.Address, senderKeyRecipients []store.SessionAddressTuple, @@ -265,11 +269,7 @@ func (cli *Client) encryptWithSenderKey( if err != nil { return nil, fmt.Errorf("failed to get sender certificate: %w", err) } - groupIDBytes, err := groupID.Bytes() - if err != nil { - return nil, fmt.Errorf("failed to deserialize group ID: %w", err) - } - usmc, err := libsignalgo.NewUnidentifiedSenderMessageContent(ciphertext, cert, getContentHint(content), groupIDBytes[:]) + usmc, err := libsignalgo.NewUnidentifiedSenderMessageContent(ciphertext, cert, getContentHint(content), groupID) if err != nil { return nil, fmt.Errorf("failed to create unidentified sender message content: %w", err) } diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 97fdcdf..0ea55f9 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -147,7 +147,9 @@ func (cli *Client) buildMessagesToSend( ctx context.Context, recipient libsignalgo.ServiceID, content *signalpb.Content, - unauthenticated, isGroup bool, + unauthenticated bool, + groupID *libsignalgo.GroupIdentifier, + ctmOverride *libsignalgo.CiphertextMessage, ) ([]MyMessage, error) { if ctx.Value(contextKeyEncryptionLock) != true { cli.encryptionLock.Lock() @@ -179,26 +181,19 @@ func (cli *Client) buildMessagesToSend( continue } - // Build message payload serializedMessage, err := proto.Marshal(content) if err != nil { return nil, err } - paddedMessage, err := addPadding(3, serializedMessage) // TODO: figure out how to get actual version + paddedMessage, err := addPadding(3, serializedMessage) if err != nil { return nil, err } - var envelopeType int - var encryptedPayload []byte - if unauthenticated { - includeE164 := !isGroup && cli.Store.AccountRecord.GetPhoneNumberSharingMode() == signalpb.AccountRecord_EVERYBODY - envelopeType, encryptedPayload, err = cli.buildSSMessageToSend( - ctx, tuple.Address, paddedMessage, getContentHint(content), includeE164, - ) - } else { - envelopeType, encryptedPayload, err = cli.buildAuthedMessageToSend(ctx, tuple.Address, paddedMessage) - } + includeE164 := groupID == nil && cli.Store.AccountRecord.GetPhoneNumberSharingMode() == signalpb.AccountRecord_EVERYBODY + envelopeType, encryptedPayload, err := cli.buildMessageToSend( + ctx, tuple.Address, paddedMessage, getContentHint(content), ctmOverride, groupID, includeE164, unauthenticated, + ) if err != nil { return nil, err } @@ -208,7 +203,7 @@ func (cli *Client) buildMessagesToSend( return nil, err } outgoingMessage := MyMessage{ - Type: envelopeType, + Type: int(envelopeType), DestinationDeviceID: tuple.DeviceID, DestinationRegistrationID: int(destinationRegistrationID), Content: base64.StdEncoding.EncodeToString(encryptedPayload), @@ -219,54 +214,59 @@ func (cli *Client) buildMessagesToSend( return messages, nil } -func (cli *Client) buildAuthedMessageToSend(ctx context.Context, recipientAddress *libsignalgo.Address, paddedMessage []byte) (envelopeType int, encryptedPayload []byte, err error) { - cipherTextMessage, err := libsignalgo.Encrypt( - ctx, - paddedMessage, - recipientAddress, - cli.Store.ACISessionStore, - cli.Store.ACIIdentityStore, - ) - if err != nil { - return 0, nil, err +func ctmTypeToEnvelopeType(ctmType libsignalgo.CiphertextMessageType) signalpb.Envelope_Type { + switch ctmType { + case libsignalgo.CiphertextMessageTypeWhisper: + return signalpb.Envelope_CIPHERTEXT // 2 -> 1 + case libsignalgo.CiphertextMessageTypePreKey: + return signalpb.Envelope_PREKEY_BUNDLE // 3 -> 3 + case libsignalgo.CiphertextMessageTypeSenderKey: + return signalpb.Envelope_SENDERKEY_MESSAGE // 7 -> 7 + case libsignalgo.CiphertextMessageTypePlaintext: + return signalpb.Envelope_PLAINTEXT_CONTENT // 8 -> 8 + default: + return signalpb.Envelope_UNKNOWN } - encryptedPayload, err = cipherTextMessage.Serialize() - if err != nil { - return 0, nil, err - } - - // OMG Signal are you serious why can't your magic numbers just align - cipherMessageType, _ := cipherTextMessage.MessageType() - if cipherMessageType == libsignalgo.CiphertextMessageTypePreKey { // 3 -> 3 - envelopeType = int(signalpb.Envelope_PREKEY_BUNDLE) - } else if cipherMessageType == libsignalgo.CiphertextMessageTypeWhisper { // 2 -> 1 - envelopeType = int(signalpb.Envelope_CIPHERTEXT) - } else { - return 0, nil, fmt.Errorf("unknown message type: %v", cipherMessageType) - } - return envelopeType, encryptedPayload, nil } -func (cli *Client) buildSSMessageToSend(ctx context.Context, recipientAddress *libsignalgo.Address, paddedMessage []byte, contentHint libsignalgo.UnidentifiedSenderMessageContentHint, includeE164 bool) (envelopeType int, encryptedPayload []byte, err error) { +func (cli *Client) buildMessageToSend( + ctx context.Context, + recipientAddress *libsignalgo.Address, + paddedMessage []byte, + contentHint libsignalgo.UnidentifiedSenderMessageContentHint, + ciphertextMessage *libsignalgo.CiphertextMessage, + groupID *libsignalgo.GroupIdentifier, + includeE164, sealedSender bool, +) (envelopeType signalpb.Envelope_Type, encryptedPayload []byte, err error) { + if ciphertextMessage == nil { + ciphertextMessage, err = libsignalgo.Encrypt( + ctx, + paddedMessage, + recipientAddress, + cli.Store.ACISessionStore, + cli.Store.ACIIdentityStore, + ) + if err != nil { + return 0, nil, err + } + } + cipherMessageType, _ := ciphertextMessage.MessageType() + envelopeType = ctmTypeToEnvelopeType(cipherMessageType) + if !sealedSender { + encryptedPayload, err = ciphertextMessage.Serialize() + return + } cert, err := cli.senderCertificate(ctx, includeE164) if err != nil { return 0, nil, err } - encryptedPayload, err = libsignalgo.SealedSenderEncryptPlaintext( - ctx, - paddedMessage, - contentHint, - recipientAddress, - cert, - cli.Store.ACISessionStore, - cli.Store.ACIIdentityStore, - ) + usmc, err := libsignalgo.NewUnidentifiedSenderMessageContent(ciphertextMessage, cert, contentHint, groupID) if err != nil { return 0, nil, err } - envelopeType = int(signalpb.Envelope_UNIDENTIFIED_SENDER) - - return envelopeType, encryptedPayload, nil + encryptedPayload, err = libsignalgo.SealedSenderEncrypt(ctx, usmc, recipientAddress, cli.Store.ACIIdentityStore) + envelopeType = signalpb.Envelope_UNIDENTIFIED_SENDER + return } type SuccessfulSendResult struct { @@ -427,7 +427,7 @@ func (cli *Client) SendContactSyncRequest(ctx context.Context) error { Type: signalpb.SyncMessage_Request_CONTACTS.Enum(), }, }, - }, 0, false, false) + }, 0, false, nil, nil) if err != nil { log.Err(err).Msg("Failed to send contact sync request message to myself") return err @@ -447,7 +447,7 @@ func (cli *Client) SendStorageMasterKeyRequest(ctx context.Context) error { Type: signalpb.SyncMessage_Request_KEYS.Enum(), }, }, - }, 0, false, false) + }, 0, false, nil, nil) if err != nil { log.Err(err).Msg("Failed to send key sync request message to myself") return err @@ -502,11 +502,23 @@ func wrapDataMessageInContent(dm *signalpb.DataMessage) *signalpb.Content { } } +func (cli *Client) addSendCache(recipient libsignalgo.ServiceID, groupID types.GroupIdentifier, ts uint64, content *signalpb.Content) { + cli.sendCache.Push(sendCacheKey{ + recipient: recipient, + groupID: groupID, + timestamp: ts, + }, content) +} + func (cli *Client) SendGroupUpdate(ctx context.Context, group *Group, groupContext *signalpb.GroupContextV2, groupChange *GroupChange) (*GroupMessageSendResult, error) { log := zerolog.Ctx(ctx).With(). Str("action", "send group change message"). Stringer("group_id", group.GroupIdentifier). Logger() + gidBytes, err := group.GroupIdentifier.Bytes() + if err != nil { + return nil, err + } ctx = log.WithContext(ctx) timestamp := currentMessageTimestamp() dm := &signalpb.DataMessage{ @@ -518,20 +530,24 @@ func (cli *Client) SendGroupUpdate(ctx context.Context, group *Group, groupConte for _, member := range group.Members { serviceID := member.UserServiceID() recipients = append(recipients, serviceID) + cli.addSendCache(serviceID, group.GroupIdentifier, timestamp, content) } for _, member := range group.PendingMembers { recipients = append(recipients, member.ServiceID) + cli.addSendCache(member.ServiceID, group.GroupIdentifier, timestamp, content) } if groupChange != nil { for _, member := range groupChange.AddPendingMembers { recipients = append(recipients, member.ServiceID) + cli.addSendCache(member.ServiceID, group.GroupIdentifier, timestamp, content) } for _, member := range groupChange.AddMembers { serviceID := member.UserServiceID() recipients = append(recipients, serviceID) + cli.addSendCache(serviceID, group.GroupIdentifier, timestamp, content) } } - return cli.sendToGroup(ctx, recipients, content, timestamp, nil) + return cli.sendToGroup(ctx, recipients, content, timestamp, nil, &gidBytes) } const enableSenderKeySend = true @@ -565,10 +581,14 @@ func (cli *Client) SendGroupMessage(ctx context.Context, gid types.GroupIdentifi for _, member := range group.Members { recipients = append(recipients, member.UserServiceID()) } - if enableSenderKeySend { - return cli.sendToGroupWithSenderKey(ctx, gid, recipients, ptr.Val(endorsement), content, messageTimestamp, 0) + gidBytes, err := gid.Bytes() + if err != nil { + return nil, err } - return cli.sendToGroup(ctx, recipients, content, messageTimestamp, nil) + if enableSenderKeySend { + return cli.sendToGroupWithSenderKey(ctx, &gidBytes, recipients, ptr.Val(endorsement), content, messageTimestamp, 0) + } + return cli.sendToGroup(ctx, recipients, content, messageTimestamp, nil, &gidBytes) } func (cli *Client) sendToGroup( @@ -577,6 +597,7 @@ func (cli *Client) sendToGroup( content *signalpb.Content, messageTimestamp uint64, result *GroupMessageSendResult, + groupID *libsignalgo.GroupIdentifier, ) (*GroupMessageSendResult, error) { if result == nil { result = &GroupMessageSendResult{ @@ -595,7 +616,7 @@ func (cli *Client) sendToGroup( } log := zerolog.Ctx(ctx).With().Stringer("member", recipient).Logger() ctx := log.WithContext(ctx) - sentUnidentified, err := cli.sendContent(ctx, recipient, messageTimestamp, content, 0, true, true) + sentUnidentified, err := cli.sendContent(ctx, recipient, messageTimestamp, content, 0, true, groupID, nil) if err != nil { result.FailedToSendTo = append(result.FailedToSendTo, FailedSendResult{ Recipient: recipient, @@ -611,7 +632,7 @@ func (cli *Client) sendToGroup( } } - cli.sendGroupSyncCopy(ctx, content, messageTimestamp, result) + cli.sendGroupSyncCopy(ctx, content, messageTimestamp, result, groupID) if len(result.FailedToSendTo) == 0 && len(result.SuccessfullySentTo) == 0 { return result, nil // I only sent to myself @@ -629,6 +650,7 @@ func (cli *Client) sendGroupSyncCopy( content *signalpb.Content, messageTimestamp uint64, result *GroupMessageSendResult, + groupID *libsignalgo.GroupIdentifier, ) { var syncContent *signalpb.Content if content.GetDataMessage() != nil { @@ -637,7 +659,7 @@ func (cli *Client) sendGroupSyncCopy( syncContent = syncMessageFromGroupEditMessage(content.EditMessage, result.SuccessfullySentTo) } if syncContent != nil { - _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTimestamp, syncContent, 0, true, true) + _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTimestamp, syncContent, 0, true, groupID, nil) if selfSendErr != nil { zerolog.Ctx(ctx).Err(selfSendErr).Msg("Failed to send sync message to myself") } @@ -656,7 +678,7 @@ func (cli *Client) sendSyncCopy(ctx context.Context, content *signalpb.Content, syncContent = content } if syncContent != nil { - _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTS, syncContent, 0, true, false) + _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTS, syncContent, 0, true, nil, nil) if selfSendErr != nil { zerolog.Ctx(ctx).Err(selfSendErr).Msg("Failed to send sync message to myself") } else { @@ -740,8 +762,9 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv } } + cli.addSendCache(recipientID, "", messageTimestamp, content) // Send to the recipient - sentUnidentified, err := cli.sendContent(ctx, recipientID, messageTimestamp, content, 0, true, false) + sentUnidentified, err := cli.sendContent(ctx, recipientID, messageTimestamp, content, 0, true, nil, nil) if err != nil { return SendMessageResult{ WasSuccessful: false, @@ -793,8 +816,7 @@ func isUrgent(content *signalpb.Content) bool { func getContentHint(content *signalpb.Content) libsignalgo.UnidentifiedSenderMessageContentHint { if content.DataMessage != nil || content.EditMessage != nil { - // TODO add support for resending before setting this - //return libsignalgo.UnidentifiedSenderMessageContentHintResendable + return libsignalgo.UnidentifiedSenderMessageContentHintResendable } if content.TypingMessage != nil || content.ReceiptMessage != nil { return libsignalgo.UnidentifiedSenderMessageContentHintImplicit @@ -809,7 +831,8 @@ func (cli *Client) sendContent( content *signalpb.Content, retryCount int, useUnidentifiedSender bool, - isGroup bool, + groupID *libsignalgo.GroupIdentifier, + ctmOverride *libsignalgo.CiphertextMessage, ) (sentUnidentified bool, err error) { log := zerolog.Ctx(ctx).With(). Str("action", "send content"). @@ -862,7 +885,7 @@ func (cli *Client) sendContent( } var messages []MyMessage - messages, err = cli.buildMessagesToSend(ctx, recipient, content, useUnidentifiedSender, isGroup) + messages, err = cli.buildMessagesToSend(ctx, recipient, content, useUnidentifiedSender, groupID, ctmOverride) if err != nil { log.Err(err).Msg("Error building messages to send") return false, err @@ -934,7 +957,7 @@ func (cli *Client) sendContent( return false, err } // Try to send again (**RECURSIVELY**) - sentUnidentified, err = cli.sendContent(ctx, recipient, messageTimestamp, content, retryCount+1, sentUnidentified, isGroup) + sentUnidentified, err = cli.sendContent(ctx, recipient, messageTimestamp, content, retryCount+1, sentUnidentified, groupID, ctmOverride) if err != nil { log.Err(err).Msg("2nd try sendMessage error") return sentUnidentified, err @@ -945,7 +968,7 @@ func (cli *Client) sendContent( } log.Debug().Msg("Retrying send without sealed sender") // Try to send again (**RECURSIVELY**) - sentUnidentified, err = cli.sendContent(ctx, recipient, messageTimestamp, content, retryCount+1, false, isGroup) + sentUnidentified, err = cli.sendContent(ctx, recipient, messageTimestamp, content, retryCount+1, false, groupID, ctmOverride) if err != nil { log.Err(err).Msg("2nd try sendMessage error") return sentUnidentified, err From bcc5917067dc8a1ed542d434200b517559fe7582 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 8 Dec 2025 23:34:32 +0200 Subject: [PATCH 073/170] libsignalgo: add debug for duplicate destinations in multi-recipient send --- pkg/libsignalgo/sealedsender.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pkg/libsignalgo/sealedsender.go b/pkg/libsignalgo/sealedsender.go index 5327f1c..eb6f655 100644 --- a/pkg/libsignalgo/sealedsender.go +++ b/pkg/libsignalgo/sealedsender.go @@ -24,10 +24,14 @@ import "C" import ( "context" "fmt" + "maps" "runtime" + "slices" "unsafe" "github.com/google/uuid" + "github.com/rs/zerolog" + "go.mau.fi/util/exerrors" ) type SealedSenderAddress struct { @@ -98,10 +102,31 @@ func SealedSenderMultiRecipientEncrypt( defer callbackCtx.Unref() recipientAddresses := make([]C.SignalConstPointerProtocolAddress, len(recipients)) recipientSessions := make([]C.SignalConstPointerSessionRecord, len(recipients)) + + type dedupTuple struct { + Name string + DeviceID uint + } + deviceDedup := make(map[dedupTuple]struct{}) + var duplicateFound *dedupTuple + for i, recipient := range recipients { + name := exerrors.Must(recipient.Address.Name()) + deviceID := exerrors.Must(recipient.Address.DeviceID()) + dedupKey := dedupTuple{name, deviceID} + if _, exists := deviceDedup[dedupKey]; exists { + duplicateFound = &dedupKey + } recipientAddresses[i] = recipient.Address.constPtr() recipientSessions[i] = recipient.Record.constPtr() } + if duplicateFound != nil { + zerolog.Ctx(ctx).Debug(). + Any("full_list", slices.Collect(maps.Keys(deviceDedup))). + Any("last_duplicate", *duplicateFound). + Msg("Duplicate debug data") + return nil, fmt.Errorf("duplicate recipient addresses found in SealedSenderMultiRecipientEncrypt") + } signalFfiError := C.signal_sealed_sender_multi_recipient_encrypt( &encrypted, C.SignalBorrowedSliceOfConstPointerProtocolAddress{ From b661b30b851d6892915a94acf71d1522a43cbcfa Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 9 Dec 2025 00:14:50 +0200 Subject: [PATCH 074/170] commands: add command to reset sender key --- pkg/connector/commands.go | 73 ++++++++++++++++++++++++ pkg/connector/connector.go | 2 + pkg/signalmeow/senderkey.go | 18 ++++++ pkg/signalmeow/store/sender_key_store.go | 10 ++++ 4 files changed, 103 insertions(+) create mode 100644 pkg/connector/commands.go diff --git a/pkg/connector/commands.go b/pkg/connector/commands.go new file mode 100644 index 0000000..0be2370 --- /dev/null +++ b/pkg/connector/commands.go @@ -0,0 +1,73 @@ +// mautrix-signal - A Matrix-Signal puppeting bridge. +// Copyright (C) 2025 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package connector + +import ( + "errors" + + "maunium.net/go/mautrix/bridgev2" + "maunium.net/go/mautrix/bridgev2/commands" + "maunium.net/go/mautrix/bridgev2/networkid" + + "go.mau.fi/mautrix-signal/pkg/signalid" +) + +var CmdDiscardSenderKey = &commands.FullHandler{ + Func: fnDiscardSenderKey, + Name: "discard-sender-key", + Help: commands.HelpMeta{ + Section: commands.HelpSectionChats, + Description: "Discard the Signal-side sender key in the current group", + Args: "[_login ID_]", + }, + RequiresPortal: true, + RequiresLogin: true, +} + +func fnDiscardSenderKey(ce *commands.Event) { + _, groupID, _ := signalid.ParsePortalID(ce.Portal.ID) + if groupID == "" { + ce.Reply("This command can only be used in group chat portals") + return + } + var login *bridgev2.UserLogin + if len(ce.Args) > 0 { + login = ce.Bridge.GetCachedUserLoginByID(networkid.UserLoginID(ce.Args[0])) + if login == nil || login.UserMXID != ce.User.MXID { + ce.Reply("Login not found") + return + } + } else { + var err error + login, _, err = ce.Portal.FindPreferredLogin(ce.Ctx, ce.User, false) + if errors.Is(err, bridgev2.ErrNotLoggedIn) { + ce.Reply("You're not logged in in this portal") + return + } else if err != nil { + ce.Log.Err(err).Msg("Failed to find preferred login for portal") + ce.Reply("Failed to find preferred login for portal") + return + } + } + distributionID, err := login.Client.(*SignalClient).Client.ResetSenderKey(ce.Ctx, groupID) + if err != nil { + ce.Log.Err(err).Msg("Failed to reset sender key") + ce.Reply("Failed to reset sender key") + } else { + ce.Reply("Reset sender key with distribution ID %s", distributionID) + } +} diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go index 59f8640..0debb30 100644 --- a/pkg/connector/connector.go +++ b/pkg/connector/connector.go @@ -26,6 +26,7 @@ import ( "go.mau.fi/util/dbutil" "go.mau.fi/util/exsync" "maunium.net/go/mautrix/bridgev2" + "maunium.net/go/mautrix/bridgev2/commands" "maunium.net/go/mautrix/bridgev2/networkid" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" @@ -64,6 +65,7 @@ func (s *SignalConnector) Init(bridge *bridgev2.Bridge) { s.MsgConv.LocationFormat = s.Config.LocationFormat s.MsgConv.DisappearViewOnce = s.Config.DisappearViewOnce s.MsgConv.ExtEvPolls = s.Config.ExtEvPolls + bridge.Commands.(*commands.Processor).AddHandlers(CmdDiscardSenderKey) } func (s *SignalConnector) SetMaxFileSize(maxSize int64) { diff --git a/pkg/signalmeow/senderkey.go b/pkg/signalmeow/senderkey.go index b676d6c..1c0da8a 100644 --- a/pkg/signalmeow/senderkey.go +++ b/pkg/signalmeow/senderkey.go @@ -46,6 +46,24 @@ const ( contextKeyEncryptionLock contextKey = iota ) +func (cli *Client) ResetSenderKey(ctx context.Context, groupID types.GroupIdentifier) (uuid.UUID, error) { + cli.encryptionLock.Lock() + defer cli.encryptionLock.Unlock() + info, err := cli.Store.SenderKeyStore.GetSenderKeyInfo(ctx, groupID) + if err != nil { + return uuid.Nil, fmt.Errorf("failed to get sender key info: %w", err) + } else if info == nil { + return uuid.Nil, nil + } else if myAddress, err := cli.Store.ACIServiceID().Address(uint(cli.Store.DeviceID)); err != nil { + return uuid.Nil, fmt.Errorf("failed to get own address: %w", err) + } else if err = cli.Store.SenderKeyStore.DeleteSenderKey(ctx, myAddress, info.DistributionID); err != nil { + return info.DistributionID, fmt.Errorf("failed to delete sender key: %w", err) + } else if err = cli.Store.SenderKeyStore.DeleteSenderKeyInfo(ctx, groupID); err != nil { + return info.DistributionID, fmt.Errorf("failed to delete sender key info: %w", err) + } + return info.DistributionID, nil +} + func (cli *Client) sendToGroupWithSenderKey( ctx context.Context, groupID *libsignalgo.GroupIdentifier, diff --git a/pkg/signalmeow/store/sender_key_store.go b/pkg/signalmeow/store/sender_key_store.go index a38e389..1334066 100644 --- a/pkg/signalmeow/store/sender_key_store.go +++ b/pkg/signalmeow/store/sender_key_store.go @@ -34,6 +34,7 @@ type SenderKeyStore interface { libsignalgo.SenderKeyStore DeleteSenderKey(ctx context.Context, address *libsignalgo.Address, distributionID uuid.UUID) error GetSenderKeyInfo(ctx context.Context, groupID types.GroupIdentifier) (*SenderKeyInfo, error) + DeleteSenderKeyInfo(ctx context.Context, groupID types.GroupIdentifier) error PutSenderKeyInfo(ctx context.Context, groupID types.GroupIdentifier, info *SenderKeyInfo) error } @@ -55,6 +56,10 @@ const ( ON CONFLICT (account_id, group_id) DO UPDATE SET distribution_id=excluded.distribution_id, shared_with=excluded.shared_with ` + deleteSenderKeyInfoQuery = ` + DELETE FROM signalmeow_outbound_sender_key_info + WHERE account_id=$1 AND group_id=$2 + ` ) func scanSenderKey(row dbutil.Scannable) (*libsignalgo.SenderKeyRecord, error) { @@ -135,3 +140,8 @@ func (s *sqlStore) PutSenderKeyInfo(ctx context.Context, groupID types.GroupIden _, err := s.db.Exec(ctx, putSenderKeyInfoQuery, s.AccountID, groupID, info.DistributionID, dbutil.JSON{Data: info}) return err } + +func (s *sqlStore) DeleteSenderKeyInfo(ctx context.Context, groupID types.GroupIdentifier) error { + _, err := s.db.Exec(ctx, deleteSenderKeyInfoQuery, s.AccountID, groupID) + return err +} From 1d43ea8c003775ee9816c53b3cb89fc62dff22d9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 9 Dec 2025 12:41:39 +0200 Subject: [PATCH 075/170] client: add connecting bridge state --- pkg/connector/client.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 233ad91..c1ad75c 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -298,6 +298,9 @@ func (s *SignalClient) postLoginConnect() { } func (s *SignalClient) tryConnect(ctx context.Context, retryCount int, doSync bool) { + if retryCount == 0 { + s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnecting}) + } ch, err := s.Client.StartReceiveLoops(ctx) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to start receive loops") From cb678dd2f0b7cc3929671830bf9f2606713a7d64 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 9 Dec 2025 16:42:57 +0200 Subject: [PATCH 076/170] handle*,chatinfo: implement new interface for message requests --- go.mod | 4 +- go.sum | 8 +-- pkg/connector/capabilities.go | 6 +- pkg/connector/chatinfo.go | 6 +- pkg/connector/handlematrix.go | 110 +++++++++++++++++++++++++++---- pkg/connector/handlesignal.go | 32 +++++++++ pkg/signalmeow/events/message.go | 29 +++++--- pkg/signalmeow/receiving.go | 26 ++++++++ pkg/signalmeow/sending.go | 7 +- 9 files changed, 194 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 35a4fb2..03c6635 100644 --- a/go.mod +++ b/go.mod @@ -14,13 +14,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.4-0.20251128195053-c7fab4d88a04 + go.mau.fi/util v0.9.4-0.20251206205611-85e6fd6551e0 golang.org/x/crypto v0.45.0 golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 golang.org/x/net v0.47.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.1-0.20251202132204-2eeece694254 + maunium.net/go/mautrix v0.26.1-0.20251209144156-31579be20ad8 ) require ( diff --git a/go.sum b/go.sum index cc4b594..e085181 100644 --- a/go.sum +++ b/go.sum @@ -65,8 +65,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.4-0.20251128195053-c7fab4d88a04 h1:1xsqu1gqwLUBEolvrsURhj/A3e9GACg95i8gITI0Be0= -go.mau.fi/util v0.9.4-0.20251128195053-c7fab4d88a04/go.mod h1:viDmhBOAFfcqDdKSk53EPJV3N4Mi8Jst5/ahGJ/vwsA= +go.mau.fi/util v0.9.4-0.20251206205611-85e6fd6551e0 h1:ESebxPGULuuxxcZigjcBFyyU62tiyY6ivtX17P4BkvY= +go.mau.fi/util v0.9.4-0.20251206205611-85e6fd6551e0/go.mod h1:viDmhBOAFfcqDdKSk53EPJV3N4Mi8Jst5/ahGJ/vwsA= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= @@ -97,5 +97,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.1-0.20251202132204-2eeece694254 h1:rsc4H0sZVban6xQeIS6err1YangUiK5WzVfTS6s03ms= -maunium.net/go/mautrix v0.26.1-0.20251202132204-2eeece694254/go.mod h1:NaesYcOQWFDbixVYywCVS+Twlzab9hOUpFNlCBlvciE= +maunium.net/go/mautrix v0.26.1-0.20251209144156-31579be20ad8 h1:dbv3iOml42fzC9l1/M2nWPmUPhsesvMJJjgw9ArdnmQ= +maunium.net/go/mautrix v0.26.1-0.20251209144156-31579be20ad8/go.mod h1:pzwIT42s+BhBjEYovmcOt69VlNW2RkJ6pCyZjYQHKIc= diff --git a/pkg/connector/capabilities.go b/pkg/connector/capabilities.go index 97affb9..e791324 100644 --- a/pkg/connector/capabilities.go +++ b/pkg/connector/capabilities.go @@ -38,7 +38,7 @@ func supportedIfFFmpeg() event.CapabilitySupportLevel { } func capID() string { - base := "fi.mau.signal.capabilities.2025_10_28" + base := "fi.mau.signal.capabilities.2025_12_09" if ffmpeg.Supported() { return base + "+ffmpeg" } @@ -171,6 +171,10 @@ var signalCaps = &event.RoomFeatures{ TypingNotifications: true, DeleteChat: true, + MessageRequest: &event.MessageRequestFeatures{ + AcceptWithMessage: event.CapLevelPartialSupport, + AcceptWithButton: event.CapLevelFullySupported, + }, } var signalDisappearingCap = &event.DisappearingTimerCapability{ diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index c8d6c2b..7e5a983 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -480,9 +480,9 @@ func (s *SignalClient) makeCreateDMResponse(ctx context.Context, recipient *type Members: members, Type: ptr.Ptr(database.RoomTypeDM), - CanBackfill: backupChat != nil, - - ExtraUpdates: updatePortalSyncMeta, + MessageRequest: ptr.Ptr(recipient.ACI != uuid.Nil && recipient.NeedsPNISignature), + CanBackfill: backupChat != nil, + ExtraUpdates: updatePortalSyncMeta, }, } } diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 25d3f53..0c47a08 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -43,18 +43,19 @@ import ( ) var ( - _ bridgev2.EditHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.ReactionHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.RedactionHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.ReadReceiptHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.TypingHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.RoomNameHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.RoomAvatarHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.RoomTopicHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.ChatViewingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.DisappearTimerChangingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.DeleteChatHandlingNetworkAPI = (*SignalClient)(nil) - _ bridgev2.PollHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.EditHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.ReactionHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.RedactionHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.ReadReceiptHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.TypingHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.RoomNameHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.RoomAvatarHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.RoomTopicHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.ChatViewingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.DisappearTimerChangingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.DeleteChatHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.PollHandlingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.MessageRequestAcceptingNetworkAPI = (*SignalClient)(nil) ) func (s *SignalClient) sendMessage(ctx context.Context, portalID networkid.PortalID, content *signalpb.Content) error { @@ -705,6 +706,14 @@ func (s *SignalClient) HandleMatrixDeleteChat(ctx context.Context, msg *bridgev2 return fmt.Errorf("failed to parse portal ID: %w", err) } + if msg.Content.FromMessageRequest { + // TODO block and delete support? + err = s.syncMessageRequestResponse(ctx, msg.Portal, signalpb.SyncMessage_MessageRequestResponse_DELETE) + if err != nil { + return fmt.Errorf("failed to send message request delete sync: %w", err) + } + } + // Build ConversationIdentifier based on portal type var conversationID *signalpb.ConversationIdentifier if groupID == "" { @@ -832,3 +841,80 @@ func (s *SignalClient) HandleMatrixPollVote(ctx context.Context, msg *bridgev2.M } return s.doSendMessage(ctx, &msg.MatrixMessage, converted, nil) } + +func (s *SignalClient) syncMessageRequestResponse( + ctx context.Context, + portal *bridgev2.Portal, + respType signalpb.SyncMessage_MessageRequestResponse_Type, +) error { + userID, groupID, err := signalid.ParsePortalID(portal.ID) + if err != nil { + return err + } + accept := &signalpb.SyncMessage_MessageRequestResponse{ + Type: respType.Enum(), + } + if groupID != "" { + gidBytes, err := groupID.Bytes() + if err != nil { + return fmt.Errorf("failed to parse group ID: %w", err) + } + accept.GroupId = gidBytes[:] + } else if userID.Type == libsignalgo.ServiceIDTypeACI { + accept.ThreadAci = ptr.Ptr(userID.UUID.String()) + } else { + return fmt.Errorf("invalid portal ID for message request response: %s", portal.ID) + } + res := s.Client.SendMessage(ctx, libsignalgo.NewACIServiceID(s.Client.Store.ACI), &signalpb.Content{ + SyncMessage: &signalpb.SyncMessage{ + MessageRequestResponse: accept, + }, + }) + if !res.WasSuccessful { + return res.Error + } + return nil +} + +func (s *SignalClient) HandleMatrixAcceptMessageRequest(ctx context.Context, msg *bridgev2.MatrixAcceptMessageRequest) error { + userID, _, err := signalid.ParsePortalID(msg.Portal.ID) + if err != nil { + return err + } + err = s.syncMessageRequestResponse(ctx, msg.Portal, signalpb.SyncMessage_MessageRequestResponse_ACCEPT) + if err != nil { + return fmt.Errorf("failed to sync message request acceptance: %w", err) + } + if userID.Type == libsignalgo.ServiceIDTypeACI { + profileKey, err := s.Client.ProfileKeyForSignalID(ctx, s.Client.Store.ACI) + if err != nil { + return fmt.Errorf("failed to get own profile key: %w", err) + } + var pniSig *signalpb.PniSignatureMessage + if s.Client.Store.AccountRecord.GetPhoneNumberSharingMode() == signalpb.AccountRecord_EVERYBODY { + sig, err := s.Client.Store.PNIIdentityKeyPair.SignAlternateIdentity(s.Client.Store.ACIIdentityKeyPair.GetIdentityKey()) + if err != nil { + return fmt.Errorf("failed to generate PNI signature: %w", err) + } + pniSig = &signalpb.PniSignatureMessage{ + Pni: s.Client.Store.PNI[:], + Signature: sig, + } + } + res := s.Client.SendMessage(ctx, userID, &signalpb.Content{ + DataMessage: &signalpb.DataMessage{ + Flags: proto.Uint32(uint32(signalpb.DataMessage_PROFILE_KEY_UPDATE)), + ProfileKey: profileKey.Slice(), + Timestamp: proto.Uint64(getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender)), + + RequiredProtocolVersion: proto.Uint32(0), + }, + PniSignatureMessage: pniSig, + }) + if !res.WasSuccessful { + return fmt.Errorf("failed to share profile key to accept message request: %w", res.Error) + } + // TODO send read receipts too? + } + return nil +} diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index 0293a53..6e0e302 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -26,6 +26,7 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" "go.mau.fi/util/exzerolog" + "go.mau.fi/util/ptr" "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/database" "maunium.net/go/mautrix/bridgev2/networkid" @@ -52,6 +53,8 @@ func (s *SignalClient) handleSignalEvent(rawEvt events.SignalEvent) bool { return s.handleSignalReadSelf(evt) case *events.DeleteForMe: return s.handleSignalDeleteForMe(evt) + case *events.MessageRequestResponse: + return s.handleSignalMessageRequestResponse(evt) case *events.Call: return s.Main.Bridge.QueueRemoteEvent(s.UserLogin, s.wrapCallEvent(evt)).Success case *events.ContactList: @@ -620,6 +623,35 @@ func (s *SignalClient) handleSignalDeleteForMe(evt *events.DeleteForMe) bool { return true } +func (s *SignalClient) handleSignalMessageRequestResponse(evt *events.MessageRequestResponse) bool { + if evt.Type != signalpb.SyncMessage_MessageRequestResponse_ACCEPT { + // TODO do we need to do anything with blocks/deletes here or are they sent as normal delete events? + return true + } + var portalKey networkid.PortalKey + if evt.GroupID != nil { + portalKey = s.makePortalKey(evt.GroupID.String()) + } else if evt.ThreadACI != uuid.Nil { + portalKey = s.makeDMPortalKey(libsignalgo.NewACIServiceID(evt.ThreadACI)) + } else { + return true + } + res := s.UserLogin.QueueRemoteEvent(&simplevent.ChatInfoChange{ + EventMeta: simplevent.EventMeta{ + Type: bridgev2.RemoteEventChatInfoChange, + PortalKey: portalKey, + Timestamp: time.UnixMilli(int64(evt.Timestamp)), + StreamOrder: int64(evt.Timestamp), + }, + ChatInfoChange: &bridgev2.ChatInfoChange{ + ChatInfo: &bridgev2.ChatInfo{ + MessageRequest: ptr.Ptr(false), + }, + }, + }) + return res.Success +} + func (s *SignalClient) handleSignalACIFound(evt *events.ACIFound) { log := s.UserLogin.Log.With(). Str("action", "handle aci found"). diff --git a/pkg/signalmeow/events/message.go b/pkg/signalmeow/events/message.go index 0642c33..7d3732a 100644 --- a/pkg/signalmeow/events/message.go +++ b/pkg/signalmeow/events/message.go @@ -28,16 +28,17 @@ type SignalEvent interface { isSignalEvent() } -func (*ChatEvent) isSignalEvent() {} -func (*DecryptionError) isSignalEvent() {} -func (*Receipt) isSignalEvent() {} -func (*ReadSelf) isSignalEvent() {} -func (*Call) isSignalEvent() {} -func (*ContactList) isSignalEvent() {} -func (*ACIFound) isSignalEvent() {} -func (*DeleteForMe) isSignalEvent() {} -func (*QueueEmpty) isSignalEvent() {} -func (*LoggedOut) isSignalEvent() {} +func (*ChatEvent) isSignalEvent() {} +func (*DecryptionError) isSignalEvent() {} +func (*Receipt) isSignalEvent() {} +func (*ReadSelf) isSignalEvent() {} +func (*Call) isSignalEvent() {} +func (*ContactList) isSignalEvent() {} +func (*ACIFound) isSignalEvent() {} +func (*DeleteForMe) isSignalEvent() {} +func (*MessageRequestResponse) isSignalEvent() {} +func (*QueueEmpty) isSignalEvent() {} +func (*LoggedOut) isSignalEvent() {} type MessageInfo struct { Sender uuid.UUID @@ -89,6 +90,14 @@ type DeleteForMe struct { *signalpb.SyncMessage_DeleteForMe } +type MessageRequestResponse struct { + Timestamp uint64 + ThreadACI uuid.UUID + GroupID *libsignalgo.GroupIdentifier + Type signalpb.SyncMessage_MessageRequestResponse_Type + Raw *signalpb.SyncMessage_MessageRequestResponse +} + type QueueEmpty struct{} type LoggedOut struct{ Error error } diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index b5ed96d..8cc0be7 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -778,6 +778,32 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess SyncMessage_DeleteForMe: msg.DeleteForMe, }) } + if msg.MessageRequestResponse != nil { + aciUUID, _ := uuid.Parse(msg.MessageRequestResponse.GetThreadAci()) + if aciUUID != uuid.Nil && msg.MessageRequestResponse.GetType() == signalpb.SyncMessage_MessageRequestResponse_ACCEPT { + _, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aciUUID, uuid.Nil, func(recipient *types.Recipient) (changed bool, err error) { + if recipient.NeedsPNISignature { + recipient.NeedsPNISignature = false + return true, nil + } + return false, nil + }) + if err != nil { + log.Err(err).Msg("Failed to clear needs_pni_signature flag after message request accept") + } + } + var groupID *libsignalgo.GroupIdentifier + if len(msg.MessageRequestResponse.GroupId) == libsignalgo.GroupIdentifierLength { + groupID = (*libsignalgo.GroupIdentifier)(msg.MessageRequestResponse.GroupId) + } + handlerSuccess = cli.handleEvent(&events.MessageRequestResponse{ + Timestamp: envelope.GetTimestamp(), + ThreadACI: aciUUID, + GroupID: groupID, + Type: msg.MessageRequestResponse.GetType(), + Raw: msg.MessageRequestResponse, + }) + } return } diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 0ea55f9..fa0818a 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -708,7 +708,7 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv isTypingOrReceipt := content.TypingMessage != nil || content.ReceiptMessage != nil recipientData, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aci, pni, func(recipientData *types.Recipient) (changed bool, err error) { needsPNISignature = recipientID.Type == libsignalgo.ServiceIDTypeACI && recipientData.NeedsPNISignature - if needsPNISignature && !isTypingOrReceipt { + if needsPNISignature && !isTypingOrReceipt && content.PniSignatureMessage == nil { zerolog.Ctx(ctx).Debug(). Stringer("recipient", recipientID). Msg("Including PNI identity in message") @@ -722,6 +722,9 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv Signature: sig, } return true, nil + } else if needsPNISignature && content.PniSignatureMessage != nil { + recipientData.NeedsPNISignature = false + return true, nil } return false, nil }) @@ -842,7 +845,7 @@ func (cli *Client) sendContent( ctx = log.WithContext(ctx) // If it's a data message, add our profile key - if content.DataMessage != nil { + if content.DataMessage != nil && content.DataMessage.ProfileKey == nil { profileKey, err := cli.ProfileKeyForSignalID(ctx, cli.Store.ACI) if err != nil { log.Err(err).Msg("Error getting profile key, not adding to outgoing message") From 3b4b6cf753dffca4bf2f6015d16b8e312924985b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 10 Dec 2025 18:30:00 +0200 Subject: [PATCH 077/170] msgconv/from-signal: fix panic if poll vote target isn't found --- pkg/msgconv/from-signal.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/msgconv/from-signal.go b/pkg/msgconv/from-signal.go index 9392616..c8ac40e 100644 --- a/pkg/msgconv/from-signal.go +++ b/pkg/msgconv/from-signal.go @@ -714,6 +714,9 @@ func (mc *MessageConverter) convertPollVoteToMatrix(ctx context.Context, vote *s if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to get poll vote target message") return invalidPollVote + } else if pollMessage == nil { + zerolog.Ctx(ctx).Warn().Msg("Poll vote target message not found") + return invalidPollVote } mxOptionIDs := pollMessage.Metadata.(*signalid.MessageMetadata).MatrixPollOptionIDs optionIDs := make([]string, len(vote.GetOptionIndexes())) From c79057718a98a1c18089a8d3dc8daef6a7f120c1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 11 Dec 2025 14:18:00 +0200 Subject: [PATCH 078/170] libsignal: update to v0.86.8 --- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/version.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index 5a64e17..ace4048 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit 5a64e17ed4450eaf5fe29bfa611c9838736ac1a6 +Subproject commit ace404879f5dc146a512d88f696115715095a841 diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index dbb024d..f690184 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.86.4" +const Version = "v0.86.8" From 2c78df26384716d7c338a59d5f928395f8607089 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 11 Dec 2025 15:31:47 +0200 Subject: [PATCH 079/170] changelog: update --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f147c6..6785804 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# v25.12 (unreleased) + +* Updated libsignal to v0.86.8. +* Added support for dropping incoming DMs from blocked contacts on Signal. +* Added support for sender key encryption when sending to groups, which makes + sending much faster and enables sending typing notifications. +* Added support for encryption retry receipts. +* Fixed bugs with handling poll votes. +* Fixed history transfer option not showing up when pairing with Signal Android. + # v25.11 * Updated libsignal to v0.86.4. From 7f8b0b7596566af3b973eaa9c7128e41861f7ed8 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 11 Dec 2025 16:27:19 +0200 Subject: [PATCH 080/170] signalmeow/store: handle message request and unregistered status from backup --- pkg/signalmeow/store/backup_store.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/signalmeow/store/backup_store.go b/pkg/signalmeow/store/backup_store.go index fb5d5ff..2b1adf7 100644 --- a/pkg/signalmeow/store/backup_store.go +++ b/pkg/signalmeow/store/backup_store.go @@ -161,11 +161,13 @@ func (s *sqlStore) AddBackupRecipient(ctx context.Context, recipient *backuppb.R if dest.Contact.ProfileGivenName != nil || dest.Contact.ProfileFamilyName != nil { recipient.Profile.Name = strings.TrimSpace(fmt.Sprintf("%s %s", dest.Contact.GetProfileGivenName(), dest.Contact.GetProfileFamilyName())) } + recipient.NeedsPNISignature = dest.Contact.GetVisibility() == backuppb.Contact_HIDDEN_MESSAGE_REQUEST recipient.Blocked = dest.Contact.Blocked changed = oldRecipient.E164 != recipient.E164 || oldRecipient.Profile.Key != recipient.Profile.Key || oldRecipient.Profile.Name != recipient.Profile.Name || - oldRecipient.Blocked != recipient.Blocked + oldRecipient.Blocked != recipient.Blocked || + oldRecipient.NeedsPNISignature != recipient.NeedsPNISignature return }) if err != nil { @@ -177,6 +179,9 @@ func (s *sqlStore) AddBackupRecipient(ctx context.Context, recipient *backuppb.R Any("entry", dest.Contact). Msg("Both ACI and PNI are invalid for registered contact recipient") } + if aci != uuid.Nil { + s.MarkUnregistered(ctx, libsignalgo.NewACIServiceID(aci), dest.Contact.GetNotRegistered() != nil) + } case *backuppb.Recipient_Group: groupMasterKey = types.SerializedGroupMasterKey(base64.StdEncoding.EncodeToString(dest.Group.MasterKey)) if len(dest.Group.MasterKey) == libsignalgo.GroupMasterKeyLength { From e4ad808ad0b1f984a352affd401d634bd079f60c Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 11 Dec 2025 16:28:39 +0200 Subject: [PATCH 081/170] dependencies: update --- go.mod | 20 ++++++++++---------- go.sum | 36 ++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 03c6635..33f2f4d 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-signal go 1.24.0 -toolchain go1.25.4 +toolchain go1.25.5 tool go.mau.fi/util/cmd/maubuild @@ -14,13 +14,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.4-0.20251206205611-85e6fd6551e0 - golang.org/x/crypto v0.45.0 - golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 - golang.org/x/net v0.47.0 + go.mau.fi/util v0.9.4-0.20251211121531-f6527b4882ae + golang.org/x/crypto v0.46.0 + golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 + golang.org/x/net v0.48.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.1-0.20251209144156-31579be20ad8 + maunium.net/go/mautrix v0.26.1-0.20251211121745-efd4136c7a93 ) require ( @@ -42,10 +42,10 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/goldmark v1.7.13 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect - golang.org/x/mod v0.30.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/text v0.32.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index e085181..090940f 100644 --- a/go.sum +++ b/go.sum @@ -65,27 +65,27 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.4-0.20251206205611-85e6fd6551e0 h1:ESebxPGULuuxxcZigjcBFyyU62tiyY6ivtX17P4BkvY= -go.mau.fi/util v0.9.4-0.20251206205611-85e6fd6551e0/go.mod h1:viDmhBOAFfcqDdKSk53EPJV3N4Mi8Jst5/ahGJ/vwsA= +go.mau.fi/util v0.9.4-0.20251211121531-f6527b4882ae h1:tocQOutgT+Z/V6w668Jpk3D5942K5p25XmRAvXg8s2E= +go.mau.fi/util v0.9.4-0.20251211121531-f6527b4882ae/go.mod h1:OwI76F1QINxtH/TOydGAAj5/VvtPG0RnZzB41rtnKcA= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= -golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 h1:DHNhtq3sNNzrvduZZIiFyXWOL9IWaDPHqTnLJp+rCBY= -golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 h1:MDfG8Cvcqlt9XXrmEiD4epKn7VJHZO84hejP9Jmp0MM= +golang.org/x/exp v0.0.0-20251209150349-8475f28825e9/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -97,5 +97,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.1-0.20251209144156-31579be20ad8 h1:dbv3iOml42fzC9l1/M2nWPmUPhsesvMJJjgw9ArdnmQ= -maunium.net/go/mautrix v0.26.1-0.20251209144156-31579be20ad8/go.mod h1:pzwIT42s+BhBjEYovmcOt69VlNW2RkJ6pCyZjYQHKIc= +maunium.net/go/mautrix v0.26.1-0.20251211121745-efd4136c7a93 h1:IG8VJk3YT7N4yGVW5VnJiEt9rA3nKZNatXngxFbwhPs= +maunium.net/go/mautrix v0.26.1-0.20251211121745-efd4136c7a93/go.mod h1:tMXkJiGf+2dEPvfrmhQVD6jReL5E8jI1o2dPSsy/39Y= From b2dbdb684c162a8bc4e3f1c3443dea50571b2355 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 11 Dec 2025 17:53:48 +0200 Subject: [PATCH 082/170] signalmeow: store whitelisted flag and use it for message requests --- pkg/connector/chatinfo.go | 2 +- pkg/connector/client.go | 4 ++- pkg/connector/handlesignal.go | 25 +++++++++++++++++++ pkg/signalmeow/receiving.go | 19 ++++++++------ pkg/signalmeow/sending.go | 8 +++--- pkg/signalmeow/storageservice.go | 5 ++++ pkg/signalmeow/store/backup_store.go | 11 +++++--- pkg/signalmeow/store/recipient_store.go | 13 +++++++--- pkg/signalmeow/store/upgrades/00-latest.sql | 3 ++- .../upgrades/26-recipient-whitelisted.sql | 2 ++ pkg/signalmeow/types/contact.go | 5 ++++ 11 files changed, 76 insertions(+), 21 deletions(-) create mode 100644 pkg/signalmeow/store/upgrades/26-recipient-whitelisted.sql diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 7e5a983..081c6d3 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -480,7 +480,7 @@ func (s *SignalClient) makeCreateDMResponse(ctx context.Context, recipient *type Members: members, Type: ptr.Ptr(database.RoomTypeDM), - MessageRequest: ptr.Ptr(recipient.ACI != uuid.Nil && recipient.NeedsPNISignature), + MessageRequest: ptr.Ptr(recipient.ACI != uuid.Nil && recipient.ProbablyMessageRequest()), CanBackfill: backupChat != nil, ExtraUpdates: updatePortalSyncMeta, }, diff --git a/pkg/connector/client.go b/pkg/connector/client.go index c1ad75c..fb77bb0 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -287,10 +287,12 @@ func (s *SignalClient) postLoginConnect() { s.tryConnect(ctx, 0, false) if s.Client.Store.EphemeralBackupKey != nil { go func() { - s.syncChats(ctx) if s.Client.Store.MasterKey != nil { s.Client.SyncStorage(ctx) + } else { + s.UserLogin.Log.Warn().Msg("No master key for storage sync before backup sync") } + s.syncChats(ctx) }() } else if s.Client.Store.MasterKey != nil { go s.Client.SyncStorage(ctx) diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index 6e0e302..0ad8555 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -642,6 +642,9 @@ func (s *SignalClient) handleSignalMessageRequestResponse(evt *events.MessageReq PortalKey: portalKey, Timestamp: time.UnixMilli(int64(evt.Timestamp)), StreamOrder: int64(evt.Timestamp), + LogContext: func(c zerolog.Context) zerolog.Context { + return c.Str("action", "unmark message request").Str("source", "sync message") + }, }, ChatInfoChange: &bridgev2.ChatInfoChange{ ChatInfo: &bridgev2.ChatInfo{ @@ -706,6 +709,28 @@ func (s *SignalClient) handleSignalContactList(evt *events.ContactList) { if contact.ACI == s.Client.Store.ACI { s.updateRemoteProfile(ctx, true) } + if ptr.Val(contact.Whitelisted) { + portal, err := s.Main.Bridge.GetExistingPortalByKey(ctx, s.makeDMPortalKey(libsignalgo.NewACIServiceID(contact.ACI))) + if err != nil { + log.Err(err).Msg("Failed to get existing portal to update contact info") + continue + } else if portal != nil && portal.MessageRequest { + s.UserLogin.QueueRemoteEvent(&simplevent.ChatInfoChange{ + EventMeta: simplevent.EventMeta{ + Type: bridgev2.RemoteEventChatInfoChange, + LogContext: func(c zerolog.Context) zerolog.Context { + return c.Str("action", "unmark message request").Str("source", "contact list") + }, + PortalKey: portal.PortalKey, + }, + ChatInfoChange: &bridgev2.ChatInfoChange{ + ChatInfo: &bridgev2.ChatInfo{ + MessageRequest: ptr.Ptr(false), + }, + }, + }) + } + } } } diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 8cc0be7..a836893 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -29,6 +29,7 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" + "go.mau.fi/util/ptr" "google.golang.org/protobuf/proto" "go.mau.fi/mautrix-signal/pkg/libsignalgo" @@ -562,12 +563,17 @@ func (cli *Client) handleDecryptedResult( if destinationServiceID == cli.Store.PNIServiceID() { _, err = cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, theirServiceID.UUID, uuid.Nil, func(recipient *types.Recipient) (changed bool, err error) { + if recipient.Whitelisted == nil { + log.Debug().Msg("Marking recipient as not whitelisted") + recipient.Whitelisted = ptr.Ptr(false) + changed = true + } if !recipient.NeedsPNISignature { log.Debug().Msg("Marking recipient as needing PNI signature") recipient.NeedsPNISignature = true - return true, nil + changed = true } - return false, nil + return }) if err != nil { log.Err(err).Msg("Failed to set needs_pni_signature flag after receiving message to PNI service ID") @@ -782,11 +788,10 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess aciUUID, _ := uuid.Parse(msg.MessageRequestResponse.GetThreadAci()) if aciUUID != uuid.Nil && msg.MessageRequestResponse.GetType() == signalpb.SyncMessage_MessageRequestResponse_ACCEPT { _, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aciUUID, uuid.Nil, func(recipient *types.Recipient) (changed bool, err error) { - if recipient.NeedsPNISignature { - recipient.NeedsPNISignature = false - return true, nil - } - return false, nil + changed = !ptr.Val(recipient.Whitelisted) || recipient.NeedsPNISignature + recipient.Whitelisted = ptr.Ptr(true) + recipient.NeedsPNISignature = false + return }) if err != nil { log.Err(err).Msg("Failed to clear needs_pni_signature flag after message request accept") diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index fa0818a..9a523bd 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -698,7 +698,6 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv } else { messageTimestamp = currentMessageTimestamp() } - needsPNISignature := false var aci, pni uuid.UUID if recipientID.Type == libsignalgo.ServiceIDTypeACI { aci = recipientID.UUID @@ -707,7 +706,10 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv } isTypingOrReceipt := content.TypingMessage != nil || content.ReceiptMessage != nil recipientData, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aci, pni, func(recipientData *types.Recipient) (changed bool, err error) { - needsPNISignature = recipientID.Type == libsignalgo.ServiceIDTypeACI && recipientData.NeedsPNISignature + if content.GetDataMessage().GetFlags() == uint32(signalpb.DataMessage_PROFILE_KEY_UPDATE) { + recipientData.Whitelisted = ptr.Ptr(true) + } + needsPNISignature := recipientID.Type == libsignalgo.ServiceIDTypeACI && recipientData.NeedsPNISignature if needsPNISignature && !isTypingOrReceipt && content.PniSignatureMessage == nil { zerolog.Ctx(ctx).Debug(). Stringer("recipient", recipientID). @@ -732,7 +734,7 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv zerolog.Ctx(ctx).Err(err).Msg("Failed to get message recipient data") } // Treat needs PNI signature as "this is a message request" and don't send receipts/typing - if needsPNISignature && isTypingOrReceipt { + if recipientData.ProbablyMessageRequest() && isTypingOrReceipt { zerolog.Ctx(ctx).Debug().Msg("Not sending typing/receipt message to recipient as needs PNI signature flag is set") res := SuccessfulSendResult{Recipient: recipientID} if content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_READ { diff --git a/pkg/signalmeow/storageservice.go b/pkg/signalmeow/storageservice.go index 45a008e..97c3d26 100644 --- a/pkg/signalmeow/storageservice.go +++ b/pkg/signalmeow/storageservice.go @@ -30,6 +30,7 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" "go.mau.fi/util/exerrors" + "go.mau.fi/util/ptr" "golang.org/x/crypto/hkdf" "golang.org/x/exp/maps" "google.golang.org/protobuf/proto" @@ -103,6 +104,10 @@ func (cli *Client) processStorageInTxn(ctx context.Context, update *StorageUpdat changed = true recipient.Blocked = contact.Blocked } + if !ptr.Val(recipient.Whitelisted) { + changed = true + recipient.Whitelisted = &contact.Whitelisted + } topLevelChanged = changed return }) diff --git a/pkg/signalmeow/store/backup_store.go b/pkg/signalmeow/store/backup_store.go index 2b1adf7..e99b110 100644 --- a/pkg/signalmeow/store/backup_store.go +++ b/pkg/signalmeow/store/backup_store.go @@ -161,13 +161,16 @@ func (s *sqlStore) AddBackupRecipient(ctx context.Context, recipient *backuppb.R if dest.Contact.ProfileGivenName != nil || dest.Contact.ProfileFamilyName != nil { recipient.Profile.Name = strings.TrimSpace(fmt.Sprintf("%s %s", dest.Contact.GetProfileGivenName(), dest.Contact.GetProfileFamilyName())) } - recipient.NeedsPNISignature = dest.Contact.GetVisibility() == backuppb.Contact_HIDDEN_MESSAGE_REQUEST + if dest.Contact.ProfileSharing && !ptr.Val(recipient.Whitelisted) { + recipient.Whitelisted = ptr.Ptr(true) + changed = true + } recipient.Blocked = dest.Contact.Blocked - changed = oldRecipient.E164 != recipient.E164 || + changed = changed || + oldRecipient.E164 != recipient.E164 || oldRecipient.Profile.Key != recipient.Profile.Key || oldRecipient.Profile.Name != recipient.Profile.Name || - oldRecipient.Blocked != recipient.Blocked || - oldRecipient.NeedsPNISignature != recipient.NeedsPNISignature + oldRecipient.Blocked != recipient.Blocked return }) if err != nil { diff --git a/pkg/signalmeow/store/recipient_store.go b/pkg/signalmeow/store/recipient_store.go index 98c7315..5f328be 100644 --- a/pkg/signalmeow/store/recipient_store.go +++ b/pkg/signalmeow/store/recipient_store.go @@ -67,7 +67,8 @@ const ( profile_avatar_path, profile_fetched_at, needs_pni_signature, - blocked + blocked, + whitelisted FROM signalmeow_recipients WHERE account_id = $1 ` @@ -93,9 +94,10 @@ const ( profile_avatar_path, profile_fetched_at, needs_pni_signature, - blocked + blocked, + whitelisted ) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) ON CONFLICT (account_id, aci_uuid) DO UPDATE SET pni_uuid = excluded.pni_uuid, e164_number = excluded.e164_number, @@ -109,7 +111,8 @@ const ( profile_avatar_path = excluded.profile_avatar_path, profile_fetched_at = excluded.profile_fetched_at, needs_pni_signature = excluded.needs_pni_signature, - blocked = excluded.blocked + blocked = excluded.blocked, + whitelisted = excluded.whitelisted ` upsertPNIRecipientQuery = ` INSERT INTO signalmeow_recipients ( @@ -147,6 +150,7 @@ func scanRecipient(row dbutil.Scannable) (*types.Recipient, error) { &profileFetchedAt, &recipient.NeedsPNISignature, &recipient.Blocked, + &recipient.Whitelisted, ) if errors.Is(err, sql.ErrNoRows) { return nil, nil @@ -371,6 +375,7 @@ func (s *sqlStore) StoreRecipient(ctx context.Context, recipient *types.Recipien dbutil.UnixMilliPtr(recipient.Profile.FetchedAt), recipient.NeedsPNISignature, recipient.Blocked, + recipient.Whitelisted, ) s.blockCacheLock.Lock() s.blockCache[recipient.ACI] = recipient.Blocked diff --git a/pkg/signalmeow/store/upgrades/00-latest.sql b/pkg/signalmeow/store/upgrades/00-latest.sql index dee3509..8f54eac 100644 --- a/pkg/signalmeow/store/upgrades/00-latest.sql +++ b/pkg/signalmeow/store/upgrades/00-latest.sql @@ -1,4 +1,4 @@ --- v0 -> v25 (compatible with v13+): Latest revision +-- v0 -> v26 (compatible with v13+): Latest revision CREATE TABLE signalmeow_device ( aci_uuid TEXT PRIMARY KEY, @@ -127,6 +127,7 @@ CREATE TABLE signalmeow_recipients ( profile_fetched_at BIGINT, needs_pni_signature BOOLEAN NOT NULL DEFAULT false, blocked BOOLEAN NOT NULL DEFAULT false, + whitelisted BOOLEAN, CONSTRAINT signalmeow_contacts_account_id_fkey FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE, diff --git a/pkg/signalmeow/store/upgrades/26-recipient-whitelisted.sql b/pkg/signalmeow/store/upgrades/26-recipient-whitelisted.sql new file mode 100644 index 0000000..c61bf33 --- /dev/null +++ b/pkg/signalmeow/store/upgrades/26-recipient-whitelisted.sql @@ -0,0 +1,2 @@ +-- v26 (compatible with v13+): Store whitelisted status for recipients +ALTER TABLE signalmeow_recipients ADD COLUMN whitelisted BOOLEAN; diff --git a/pkg/signalmeow/types/contact.go b/pkg/signalmeow/types/contact.go index bed25ac..889dd3e 100644 --- a/pkg/signalmeow/types/contact.go +++ b/pkg/signalmeow/types/contact.go @@ -56,6 +56,11 @@ type Recipient struct { NeedsPNISignature bool Blocked bool + Whitelisted *bool +} + +func (r *Recipient) ProbablyMessageRequest() bool { + return r != nil && (r.NeedsPNISignature || (r.Whitelisted != nil && !*r.Whitelisted)) } type ContactAvatar struct { From fe3c072cd1f71fe90739574cc446e3ae2a552bd6 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 14 Dec 2025 14:08:06 +0200 Subject: [PATCH 083/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 33f2f4d..2d6984d 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.48.0 google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.1-0.20251211121745-efd4136c7a93 + maunium.net/go/mautrix v0.26.1-0.20251213090909-cb6f673e7a70 ) require ( diff --git a/go.sum b/go.sum index 090940f..3bcf2a9 100644 --- a/go.sum +++ b/go.sum @@ -97,5 +97,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.1-0.20251211121745-efd4136c7a93 h1:IG8VJk3YT7N4yGVW5VnJiEt9rA3nKZNatXngxFbwhPs= -maunium.net/go/mautrix v0.26.1-0.20251211121745-efd4136c7a93/go.mod h1:tMXkJiGf+2dEPvfrmhQVD6jReL5E8jI1o2dPSsy/39Y= +maunium.net/go/mautrix v0.26.1-0.20251213090909-cb6f673e7a70 h1:qLTFD+r20eh81SaFUpgBhIsQkDSzUNJWcCQPx+WNnm0= +maunium.net/go/mautrix v0.26.1-0.20251213090909-cb6f673e7a70/go.mod h1:tMXkJiGf+2dEPvfrmhQVD6jReL5E8jI1o2dPSsy/39Y= From df733a3c77670cd6f8e5eb2a43f30863d088eb52 Mon Sep 17 00:00:00 2001 From: Michael Hoang Date: Mon, 15 Dec 2025 19:46:57 +0100 Subject: [PATCH 084/170] signalmeow/storageservice: fix nickname clearing not being bridged (#623) --- pkg/signalmeow/storageservice.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/signalmeow/storageservice.go b/pkg/signalmeow/storageservice.go index 97c3d26..676fc7f 100644 --- a/pkg/signalmeow/storageservice.go +++ b/pkg/signalmeow/storageservice.go @@ -92,9 +92,13 @@ func (cli *Client) processStorageInTxn(ctx context.Context, update *StorageUpdat changed = true recipient.ContactName = strings.TrimSpace(fmt.Sprintf("%s %s", contact.SystemGivenName, contact.SystemFamilyName)) } + newNickname := "" if contact.Nickname != nil { + newNickname = strings.TrimSpace(fmt.Sprintf("%s %s", contact.Nickname.Given, contact.Nickname.Family)) + } + if recipient.Nickname != newNickname { changed = true - recipient.Nickname = strings.TrimSpace(fmt.Sprintf("%s %s", contact.Nickname.Given, contact.Nickname.Family)) + recipient.Nickname = newNickname } if contact.E164 != "" { changed = changed || recipient.E164 != contact.E164 From 57865d0cf4cf10ece07a0a8b69394927e382de38 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 14 Dec 2025 14:38:49 +0200 Subject: [PATCH 085/170] docker: update to Alpine 3.23 --- Dockerfile | 4 ++-- Dockerfile.ci | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 162ac86..63e7542 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ COPY build-rust.sh . RUN ./build-rust.sh # -- Build mautrix-signal (with Go) -- -FROM golang:1-alpine3.22 AS go-builder +FROM golang:1-alpine3.23 AS go-builder RUN apk add --no-cache git ca-certificates build-base olm-dev zlib-dev WORKDIR /build @@ -32,7 +32,7 @@ EOF RUN ./build-go.sh # -- Run mautrix-signal -- -FROM alpine:3.22 +FROM alpine:3.23 ENV UID=1337 \ GID=1337 diff --git a/Dockerfile.ci b/Dockerfile.ci index 7d34502..ea2699f 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -1,6 +1,6 @@ ARG DOCKER_HUB="docker.io" -FROM ${DOCKER_HUB}/alpine:3.22 +FROM ${DOCKER_HUB}/alpine:3.23 ENV UID=1337 \ GID=1337 From 464b0601c173dd207e25c9218f11f39727193bfe Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 16 Dec 2025 12:39:04 +0200 Subject: [PATCH 086/170] ci: update actions and pre-commit hooks --- .github/workflows/go.yml | 8 ++++---- .github/workflows/stale.yml | 2 +- .pre-commit-config.yaml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 3913002..767c119 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -15,10 +15,10 @@ jobs: name: Lint ${{ matrix.go-version == '1.25' && '(latest)' || '(old)' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: ${{ matrix.go-version }} cache: true @@ -44,10 +44,10 @@ jobs: name: Test ${{ matrix.go-version == '1.25' && '(latest)' || '(old)' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: ${{ matrix.go-version }} cache: true diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index c2003f3..c15f2fa 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -17,7 +17,7 @@ jobs: lock-stale: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v5 + - uses: dessant/lock-threads@v6 id: lock with: issue-inactive-days: 90 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f6b3302..c9cc6a3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: - id: check-added-large-files - repo: https://github.com/tekwizely/pre-commit-golang - rev: v1.0.0-rc.2 + rev: v1.0.0-rc.4 hooks: - id: go-imports exclude: "pb\\.go$" From 1e4b47375c3707bbb36b6361560b3f0766a14875 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 16 Dec 2025 12:41:32 +0200 Subject: [PATCH 087/170] Bump version to v25.12 --- CHANGELOG.md | 8 +++++++- cmd/mautrix-signal/main.go | 2 +- go.mod | 8 ++++---- go.sum | 15 ++++++++------- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6785804..1a5d207 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,18 @@ -# v25.12 (unreleased) +# v25.12 * Updated libsignal to v0.86.8. +* Updated Docker image to Alpine 3.23. * Added support for dropping incoming DMs from blocked contacts on Signal. * Added support for sender key encryption when sending to groups, which makes sending much faster and enables sending typing notifications. * Added support for encryption retry receipts. * Fixed bugs with handling poll votes. * Fixed history transfer option not showing up when pairing with Signal Android. +* Fixed nicknames being cleared not being bridged + (thanks to [@Enzime] in [#623]). + +[#623]: https://github.com/mautrix/signal/pull/623 +[@Enzime]: https://github.com/Enzime # v25.11 diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index d224f32..130e307 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -37,7 +37,7 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "25.11", + Version: "25.12", SemCalVer: true, Connector: &connector.SignalConnector{}, diff --git a/go.mod b/go.mod index 2d6984d..f898ff1 100644 --- a/go.mod +++ b/go.mod @@ -14,18 +14,18 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.4-0.20251211121531-f6527b4882ae + go.mau.fi/util v0.9.4 golang.org/x/crypto v0.46.0 golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 golang.org/x/net v0.48.0 - google.golang.org/protobuf v1.36.10 + google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.1-0.20251213090909-cb6f673e7a70 + maunium.net/go/mautrix v0.26.1 ) require ( filippo.io/edwards25519 v1.1.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/coreos/go-systemd/v22 v22.6.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/lib/pq v1.10.9 // indirect diff --git a/go.sum b/go.sum index 3bcf2a9..62da235 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,9 @@ github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7Oputl github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo= +github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -65,8 +66,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.4-0.20251211121531-f6527b4882ae h1:tocQOutgT+Z/V6w668Jpk3D5942K5p25XmRAvXg8s2E= -go.mau.fi/util v0.9.4-0.20251211121531-f6527b4882ae/go.mod h1:OwI76F1QINxtH/TOydGAAj5/VvtPG0RnZzB41rtnKcA= +go.mau.fi/util v0.9.4 h1:gWdUff+K2rCynRPysXalqqQyr2ahkSWaestH6YhSpso= +go.mau.fi/util v0.9.4/go.mod h1:647nVfwUvuhlZFOnro3aRNPmRd2y3iDha9USb8aKSmM= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= @@ -86,8 +87,8 @@ golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= -google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= -google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -97,5 +98,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.1-0.20251213090909-cb6f673e7a70 h1:qLTFD+r20eh81SaFUpgBhIsQkDSzUNJWcCQPx+WNnm0= -maunium.net/go/mautrix v0.26.1-0.20251213090909-cb6f673e7a70/go.mod h1:tMXkJiGf+2dEPvfrmhQVD6jReL5E8jI1o2dPSsy/39Y= +maunium.net/go/mautrix v0.26.1 h1:FWCC1xY5vwJ5ou3duEBjB6w9IIlwfc9el3q3Mju3Dlg= +maunium.net/go/mautrix v0.26.1/go.mod h1:UySSpb8OqXG1sMJ6dDqyzmfcqr2ayZK+KzwqOTAkAOM= From 7fc0b062ee41673f25d849175a6086c2730ab585 Mon Sep 17 00:00:00 2001 From: Nick Mills-Barrett Date: Wed, 17 Dec 2025 10:16:32 +0000 Subject: [PATCH 088/170] client: exit sleep during connect retry if context canceled --- pkg/connector/client.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index fb77bb0..e224c17 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -312,7 +312,12 @@ func (s *SignalClient) tryConnect(ctx context.Context, retryCount int, doSync bo retryInSeconds = 150 } zerolog.Ctx(ctx).Debug().Int("retry_in_seconds", retryInSeconds).Msg("Sleeping and retrying connection") - time.Sleep(time.Duration(retryInSeconds) * time.Second) + select { + case <-time.After(time.Duration(retryInSeconds) * time.Second): + case <-ctx.Done(): + zerolog.Ctx(ctx).Info().Msg("Context canceled, exit tryConnect") + return + } s.tryConnect(ctx, retryCount+1, doSync) } else { go s.bridgeStateLoop(ch) From 28c03d8e0e69566d6339578a706441841d7e0ec1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 21 Dec 2025 23:34:31 +0200 Subject: [PATCH 089/170] libsignalgo/sealedsender: remove unnecessary debug code --- pkg/libsignalgo/sealedsender.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/pkg/libsignalgo/sealedsender.go b/pkg/libsignalgo/sealedsender.go index eb6f655..56ffe8b 100644 --- a/pkg/libsignalgo/sealedsender.go +++ b/pkg/libsignalgo/sealedsender.go @@ -24,14 +24,10 @@ import "C" import ( "context" "fmt" - "maps" "runtime" - "slices" "unsafe" "github.com/google/uuid" - "github.com/rs/zerolog" - "go.mau.fi/util/exerrors" ) type SealedSenderAddress struct { @@ -103,30 +99,10 @@ func SealedSenderMultiRecipientEncrypt( recipientAddresses := make([]C.SignalConstPointerProtocolAddress, len(recipients)) recipientSessions := make([]C.SignalConstPointerSessionRecord, len(recipients)) - type dedupTuple struct { - Name string - DeviceID uint - } - deviceDedup := make(map[dedupTuple]struct{}) - var duplicateFound *dedupTuple - for i, recipient := range recipients { - name := exerrors.Must(recipient.Address.Name()) - deviceID := exerrors.Must(recipient.Address.DeviceID()) - dedupKey := dedupTuple{name, deviceID} - if _, exists := deviceDedup[dedupKey]; exists { - duplicateFound = &dedupKey - } recipientAddresses[i] = recipient.Address.constPtr() recipientSessions[i] = recipient.Record.constPtr() } - if duplicateFound != nil { - zerolog.Ctx(ctx).Debug(). - Any("full_list", slices.Collect(maps.Keys(deviceDedup))). - Any("last_duplicate", *duplicateFound). - Msg("Duplicate debug data") - return nil, fmt.Errorf("duplicate recipient addresses found in SealedSenderMultiRecipientEncrypt") - } signalFfiError := C.signal_sealed_sender_multi_recipient_encrypt( &encrypted, C.SignalBorrowedSliceOfConstPointerProtocolAddress{ From e04ff8b0f6a72a6e202d554a61dc2cbf85718986 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 21 Dec 2025 23:34:49 +0200 Subject: [PATCH 090/170] signalmeow/senderkey: don't mutate recipient list when finding target devices --- pkg/signalmeow/senderkey.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/senderkey.go b/pkg/signalmeow/senderkey.go index 1c0da8a..e8a0714 100644 --- a/pkg/signalmeow/senderkey.go +++ b/pkg/signalmeow/senderkey.go @@ -352,8 +352,8 @@ func (cli *Client) getDevicesIDs( ) { log := zerolog.Ctx(ctx) out := make(map[libsignalgo.ServiceID]senderKeySendMeta) - fallbackRecipients := recipients[:0] senderKeyRecipients := make([]store.SessionAddressTuple, 0, len(recipients)) + fallbackRecipients := make([]libsignalgo.ServiceID, 0) for _, recipient := range recipients { if recipient == cli.Store.ACIServiceID() { // We'll send a sync copy to ourselves, not sender key and no need to include in fallback recipients either From 189fb181cc33605d0c96629639093bd76f14636d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 24 Dec 2025 20:07:53 +0200 Subject: [PATCH 091/170] signalmeow/senderkey: fall back to normal send if there are no sender key recipients --- pkg/signalmeow/senderkey.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/signalmeow/senderkey.go b/pkg/signalmeow/senderkey.go index e8a0714..096d524 100644 --- a/pkg/signalmeow/senderkey.go +++ b/pkg/signalmeow/senderkey.go @@ -99,6 +99,11 @@ func (cli *Client) sendToGroupWithSenderKey( groupIDStr := types.GroupIdentifier(groupID.String()) deviceIDs, senderKeyRecipients, fallbackRecipients := cli.getDevicesIDs(ctx, allRecipients, sec, result) + if len(senderKeyRecipients) == 0 { + doUnlock() + log.Debug().Msg("No sender key recipients, falling back to normal send") + return cli.sendToGroup(ctx, allRecipients, content, messageTimestamp, result, groupID) + } ski, err := cli.Store.SenderKeyStore.GetSenderKeyInfo(ctx, groupIDStr) if err != nil { return nil, fmt.Errorf("failed to get sender key info: %w", err) From f01385849b0988d42a0744970f41465733a73471 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 28 Dec 2025 20:14:46 +0200 Subject: [PATCH 092/170] signalmeow/receiving: save PNI identity keys from sync messages --- pkg/signalmeow/receiving.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index a836893..1b4dce0 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -722,6 +722,19 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess } } } + for _, unident := range syncSent.GetUnidentifiedStatus() { + changed, err := cli.saveSyncPNIIdentityKey(ctx, unident.GetDestinationServiceId(), unident.GetDestinationPniIdentityKey()) + if err != nil { + log.Err(err). + Str("destination_service_id", unident.GetDestinationServiceId()). + Msg("Failed to save PNI identity key from sync message") + } else if changed { + log.Debug(). + Str("destination_service_id", unident.GetDestinationServiceId()). + Msg("Saved new PNI identity key from sync message") + } + } + if destination == nil && syncSent.GetMessage().GetGroupV2() == nil && syncSent.GetEditMessage().GetDataMessage().GetGroupV2() == nil { log.Warn().Msg("sync message sent destination is nil") } else if msg.Sent.Message != nil { @@ -812,6 +825,27 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess return } +func (cli *Client) saveSyncPNIIdentityKey(ctx context.Context, serviceIDString string, identityKeyBytes []byte) (bool, error) { + if identityKeyBytes == nil { + return false, nil + } + identityKey, err := libsignalgo.DeserializeIdentityKey(identityKeyBytes) + if err != nil { + return false, fmt.Errorf("failed to deserialize PNI identity key: %w", err) + } + serviceID, err := libsignalgo.ServiceIDFromString(serviceIDString) + if err != nil { + return false, fmt.Errorf("failed to parse PNI service ID: %w", err) + } else if serviceID.Type != libsignalgo.ServiceIDTypePNI { + return false, nil + } + changed, err := cli.Store.IdentityKeyStore.SaveIdentityKey(ctx, serviceID, identityKey) + if err != nil { + return false, fmt.Errorf("failed to save PNI identity key: %w", err) + } + return changed, nil +} + func (cli *Client) handlePNISignatureMessage(ctx context.Context, sender libsignalgo.ServiceID, msg *signalpb.PniSignatureMessage) error { if sender.Type != libsignalgo.ServiceIDTypeACI { return fmt.Errorf("PNI signature message sender is not an ACI") From 71af50b90cbfff70126ef88cdfd8fb33528308b4 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 30 Dec 2025 23:00:49 +0200 Subject: [PATCH 093/170] chatinfo,handlematrix: fix handling room avatars --- pkg/connector/chatinfo.go | 4 ++-- pkg/connector/handlematrix.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 081c6d3..4ce1f9d 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -326,9 +326,9 @@ func (s *SignalClient) CreateGroup(ctx context.Context, params *bridgev2.GroupCr } var avatarBytes []byte var avatarMXC id.ContentURIString - if params.Avatar != nil { + if params.Avatar != nil && params.Avatar.URL != "" { avatarMXC = params.Avatar.URL - avatarBytes, err = s.Main.Bridge.Bot.DownloadMedia(ctx, params.Avatar.URL, params.Avatar.MSC3414File) + avatarBytes, err = s.Main.Bridge.Bot.DownloadMedia(ctx, params.Avatar.URL, nil) if err != nil { return nil, fmt.Errorf("failed to download avatar: %w", err) } diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 0c47a08..610dd81 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -381,8 +381,8 @@ func (s *SignalClient) HandleMatrixRoomAvatar(ctx context.Context, msg *bridgev2 } var avatarPath string var avatarHash [32]byte - if msg.Content.URL != "" || msg.Content.MSC3414File != nil { - data, err := s.Main.Bridge.Bot.DownloadMedia(ctx, msg.Content.URL, msg.Content.MSC3414File) + if msg.Content.URL != "" { + data, err := s.Main.Bridge.Bot.DownloadMedia(ctx, msg.Content.URL, nil) if err != nil { return false, fmt.Errorf("failed to download avatar: %w", err) } From b33d7c82462fe882245f332f7f36a5515c4ec4ff Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 5 Jan 2026 01:08:18 +0200 Subject: [PATCH 094/170] signalmeow/sending: fix typing message envelope timestamps in DMs --- pkg/signalmeow/sending.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 9a523bd..404571c 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -691,12 +691,22 @@ func (cli *Client) sendSyncCopy(ctx context.Context, content *signalpb.Content, func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.ServiceID, content *signalpb.Content) SendMessageResult { // Assemble the content to send var messageTimestamp uint64 - if content.GetDataMessage() != nil { + switch { + case content.DataMessage != nil: messageTimestamp = *content.DataMessage.Timestamp - } else if content.GetEditMessage().GetDataMessage() != nil { + case content.EditMessage != nil: messageTimestamp = *content.EditMessage.DataMessage.Timestamp - } else { + case content.TypingMessage != nil: + messageTimestamp = *content.TypingMessage.Timestamp + case content.SyncMessage != nil, + content.NullMessage != nil, + content.ReceiptMessage != nil, + content.PniSignatureMessage != nil, + content.SenderKeyDistributionMessage != nil, + content.DecryptionErrorMessage != nil: messageTimestamp = currentMessageTimestamp() + default: + panic(fmt.Errorf("unsupported payload in SendMessage")) } var aci, pni uuid.UUID if recipientID.Type == libsignalgo.ServiceIDTypeACI { From 880849def7edfd54bfac41558e7a2d3d4dc7d2e7 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 7 Jan 2026 14:21:59 +0200 Subject: [PATCH 095/170] signalmeow/web: fix response bodies not being closed --- pkg/signalmeow/attachments.go | 5 +++++ pkg/signalmeow/groups.go | 5 +++++ pkg/signalmeow/profile.go | 2 +- pkg/signalmeow/storageservice.go | 4 +++- pkg/signalmeow/web/web.go | 8 +++++++- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/pkg/signalmeow/attachments.go b/pkg/signalmeow/attachments.go index 22884fe..6b78c68 100644 --- a/pkg/signalmeow/attachments.go +++ b/pkg/signalmeow/attachments.go @@ -225,6 +225,7 @@ func (cli *Client) uploadAttachmentLegacy( Username: &username, Password: &password, }) + web.CloseBody(resp) if err != nil { return fmt.Errorf("failed to send allocate request: %w", err) } else if resp.StatusCode < 200 || resp.StatusCode >= 300 { @@ -239,6 +240,7 @@ func (cli *Client) uploadAttachmentLegacy( Username: &username, Password: &password, }) + web.CloseBody(resp) if err != nil { return fmt.Errorf("failed to send upload request: %w", err) } else if resp.StatusCode < 200 || resp.StatusCode >= 300 { @@ -262,6 +264,7 @@ func (cli *Client) uploadAttachmentTUS( ContentType: web.ContentTypeOffsetOctetStream, Headers: uploadAttributes.Headers, }) + web.CloseBody(resp) // TODO actually support resuming on error if err != nil { return fmt.Errorf("failed to send upload request: %w", err) @@ -309,6 +312,7 @@ func (cli *Client) UploadGroupAvatar(ctx context.Context, avatarBytes []byte, gi return "", err } body, err := io.ReadAll(resp.Body) + web.CloseBody(resp) if err != nil { log.Err(err).Msg("Error decoding response body fetching upload attributes") return "", err @@ -338,6 +342,7 @@ func (cli *Client) UploadGroupAvatar(ctx context.Context, avatarBytes []byte, gi Body: requestBody.Bytes(), ContentType: web.ContentType(w.FormDataContentType()), }) + web.CloseBody(resp) if err != nil { log.Err(err).Msg("Error sending request uploading attachment") return "", err diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index d8ba4b3..d956fcc 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -637,6 +637,7 @@ func (cli *Client) fetchGroupWithMasterKey(ctx context.Context, groupMasterKey t ContentType: web.ContentTypeProtobuf, } response, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodGet, "/v2/groups", opts) + defer web.CloseBody(response) if err != nil { return nil, err } @@ -689,6 +690,7 @@ func (cli *Client) DownloadGroupAvatar(ctx context.Context, avatarPath string, g Password: &password, } resp, err := web.SendHTTPRequest(ctx, web.CDN1Hostname, http.MethodGet, avatarPath, opts) + defer web.CloseBody(resp) if err != nil { return nil, fmt.Errorf("failed to send request: %w", err) } @@ -1473,6 +1475,7 @@ func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupCh Body: requestBody, } resp, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodPatch, path, opts) + defer web.CloseBody(resp) if err != nil { return nil, fmt.Errorf("SendRequest error: %w", err) } @@ -1706,6 +1709,7 @@ func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Grou Body: requestBody, } resp, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodPut, path, opts) + defer web.CloseBody(resp) if err != nil { return nil, fmt.Errorf("SendRequest error: %w", err) } @@ -1776,6 +1780,7 @@ func (cli *Client) GetGroupHistoryPage(ctx context.Context, gid types.GroupIdent // highest known epoch seems to always be 5, but that may change in the future. includeLastState is always false path := fmt.Sprintf("/v2/groups/logs/%d?maxSupportedChangeEpoch=%d&includeFirstState=%t&includeLastState=false", fromRevision, 5, includeFirstState) response, err := web.SendHTTPRequest(ctx, web.StorageHostname, http.MethodGet, path, opts) + defer web.CloseBody(response) if err != nil { return nil, err } diff --git a/pkg/signalmeow/profile.go b/pkg/signalmeow/profile.go index f40d6ce..a515f5a 100644 --- a/pkg/signalmeow/profile.go +++ b/pkg/signalmeow/profile.go @@ -287,7 +287,7 @@ func (cli *Client) DownloadUserAvatar(ctx context.Context, avatarPath string, pr if err != nil { return nil, fmt.Errorf("failed to send request: %w", err) } - defer resp.Body.Close() + defer web.CloseBody(resp) if resp.StatusCode < 200 || resp.StatusCode >= 300 { return nil, fmt.Errorf("unexpected response status %d", resp.StatusCode) } diff --git a/pkg/signalmeow/storageservice.go b/pkg/signalmeow/storageservice.go index 676fc7f..fcf6848 100644 --- a/pkg/signalmeow/storageservice.go +++ b/pkg/signalmeow/storageservice.go @@ -257,6 +257,7 @@ func (cli *Client) fetchStorageManifest(ctx context.Context, storageKey []byte, Password: &storageCreds.Password, ContentType: web.ContentTypeProtobuf, }) + defer web.CloseBody(resp) if err != nil { return nil, fmt.Errorf("failed to fetch storage manifest: %w", err) } else if resp.StatusCode == http.StatusNoContent { @@ -363,11 +364,12 @@ func (cli *Client) fetchStorageItemsChunk(ctx context.Context, recordKeys [][]by Body: body, ContentType: web.ContentTypeProtobuf, }) + defer web.CloseBody(resp) if err != nil { return nil, fmt.Errorf("failed to fetch storage records: %w", err) } else if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("unexpected status code %d fetching storage records", resp.StatusCode) - } else if body, err := io.ReadAll(resp.Body); err != nil { + } else if body, err = io.ReadAll(resp.Body); err != nil { return nil, fmt.Errorf("failed to read storage manifest response: %w", err) } else if err = proto.Unmarshal(body, &storageItems); err != nil { return nil, fmt.Errorf("failed to unmarshal encrypted storage manifest: %w", err) diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index f6c6743..e18ee5a 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -168,6 +168,12 @@ func SendHTTPRequest(ctx context.Context, host, method, path string, opt *HTTPRe return resp, nil } +func CloseBody(resp *http.Response) { + if resp != nil && resp.Body != nil { + _ = resp.Body.Close() + } +} + func DecodeWSResponseBody(ctx context.Context, out any, resp *signalpb.WebSocketResponseMessage) error { if resp == nil { return nil @@ -189,7 +195,7 @@ func DecodeWSResponseBody(ctx context.Context, out any, resp *signalpb.WebSocket // DecodeHTTPResponseBody checks status code, reads an http.Response's Body and decodes it into the provided interface. func DecodeHTTPResponseBody(ctx context.Context, out any, resp *http.Response) error { - defer resp.Body.Close() + defer CloseBody(resp) // Check if status code indicates success if resp.StatusCode < 200 || resp.StatusCode >= 300 { From a2264b2bcac4d262d408450c825c82bb80faedb8 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 7 Jan 2026 15:23:42 +0200 Subject: [PATCH 096/170] client: only sync contacts on startup every 3 days --- pkg/connector/connector.go | 4 +++- pkg/connector/handlesignal.go | 6 ++++++ pkg/signalid/dbmeta.go | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go index 0debb30..f9bdd68 100644 --- a/pkg/connector/connector.go +++ b/pkg/connector/connector.go @@ -32,6 +32,7 @@ import ( "maunium.net/go/mautrix/id" "go.mau.fi/mautrix-signal/pkg/msgconv" + "go.mau.fi/mautrix-signal/pkg/signalid" "go.mau.fi/mautrix-signal/pkg/signalmeow" "go.mau.fi/mautrix-signal/pkg/signalmeow/store" ) @@ -101,7 +102,8 @@ func (s *SignalConnector) LoadUserLogin(ctx context.Context, login *bridgev2.Use sc.UserLogin.Log.With().Str("component", "signalmeow").Logger(), sc.handleSignalEvent, ) - sc.Client.SyncContactsOnConnect = s.Config.SyncContactsOnStartup + sc.Client.SyncContactsOnConnect = s.Config.SyncContactsOnStartup && + time.Since(login.Metadata.(*signalid.UserLoginMetadata).LastContactSync.Time) > 3*24*time.Hour } login.Client = sc return nil diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index 0ad8555..c9f16c1 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -26,6 +26,7 @@ import ( "github.com/google/uuid" "github.com/rs/zerolog" "go.mau.fi/util/exzerolog" + "go.mau.fi/util/jsontime" "go.mau.fi/util/ptr" "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/database" @@ -732,6 +733,11 @@ func (s *SignalClient) handleSignalContactList(evt *events.ContactList) { } } } + s.UserLogin.Metadata.(*signalid.UserLoginMetadata).LastContactSync = jsontime.UnixMilliNow() + err := s.UserLogin.Save(ctx) + if err != nil { + log.Err(err).Msg("Failed to update last contact sync time") + } } func (s *SignalClient) updateRemoteProfile(ctx context.Context, resendState bool) { diff --git a/pkg/signalid/dbmeta.go b/pkg/signalid/dbmeta.go index bbbcc92..8f42e6f 100644 --- a/pkg/signalid/dbmeta.go +++ b/pkg/signalid/dbmeta.go @@ -33,7 +33,8 @@ type MessageMetadata struct { } type UserLoginMetadata struct { - ChatsSynced bool `json:"chats_synced,omitempty"` + ChatsSynced bool `json:"chats_synced,omitempty"` + LastContactSync jsontime.UnixMilli `json:"last_contact_sync,omitempty"` } type GhostMetadata struct { From 9921199fa8ae7cf0e504ae54b8f30eabc8abfef7 Mon Sep 17 00:00:00 2001 From: Nick Mills-Barrett Date: Fri, 9 Jan 2026 12:08:09 +0000 Subject: [PATCH 097/170] signalmeow/web: expose websocket ping timeouts --- pkg/signalmeow/web/signalwebsocket.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index 8a0c845..272acbb 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -37,6 +37,10 @@ import ( "go.mau.fi/mautrix-signal/pkg/signalmeow/wspb" ) +var WebsocketPingInterval = 30 * time.Second +var WebsocketPingTimeout = 20 * time.Second +var WebsocketPingTimeoutLimit = 5 + const WebsocketProvisioningPath = "/v1/websocket/provisioning/" const WebsocketPath = "/v1/websocket/" @@ -342,20 +346,20 @@ func (s *SignalWebsocket) connectLoop( // Ping loop (send a keepalive Ping every 30s) go func() { defer wg.Done() - ticker := time.NewTicker(30 * time.Second) + ticker := time.NewTicker(WebsocketPingInterval) defer ticker.Stop() pingTimeoutCount := 0 for { select { case <-ticker.C: - pingCtx, cancel := context.WithTimeout(loopCtx, 20*time.Second) + pingCtx, cancel := context.WithTimeout(loopCtx, WebsocketPingTimeout) err := ws.Ping(pingCtx) cancel() if err != nil { pingTimeoutCount++ log.Err(err).Msg("Failed to send ping") - if pingTimeoutCount >= 5 { + if pingTimeoutCount >= WebsocketPingTimeoutLimit { log.Warn().Msg("Ping timeout count exceeded, closing websocket") err = ws.Close(websocket.StatusNormalClosure, "Ping timeout") if err != nil { From f62599145fe836e75835ede91b95400bf3a88f09 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 15 Jan 2026 14:08:00 +0200 Subject: [PATCH 098/170] connector,signalmeow: implement network connection resetting (#629) --- go.mod | 4 ++-- go.sum | 8 ++++---- pkg/connector/connector.go | 23 ++++++++++++++++++++++ pkg/signalmeow/receiving.go | 5 +++++ pkg/signalmeow/web/signalwebsocket.go | 20 +++++++++++++++++++ pkg/signalmeow/web/web.go | 28 ++++----------------------- 6 files changed, 58 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index f898ff1..05dfac3 100644 --- a/go.mod +++ b/go.mod @@ -14,13 +14,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.4 + go.mau.fi/util v0.9.5-0.20260114152041-9f2e2b82b503 golang.org/x/crypto v0.46.0 golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 golang.org/x/net v0.48.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.1 + maunium.net/go/mautrix v0.26.2-0.20260115120200-34bcd027e54c ) require ( diff --git a/go.sum b/go.sum index 62da235..dfd2ccc 100644 --- a/go.sum +++ b/go.sum @@ -66,8 +66,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.4 h1:gWdUff+K2rCynRPysXalqqQyr2ahkSWaestH6YhSpso= -go.mau.fi/util v0.9.4/go.mod h1:647nVfwUvuhlZFOnro3aRNPmRd2y3iDha9USb8aKSmM= +go.mau.fi/util v0.9.5-0.20260114152041-9f2e2b82b503 h1:L7ctH5wX8TrkZvIZmfxPkHQ1b8NZYw4fIr5WxXaewPw= +go.mau.fi/util v0.9.5-0.20260114152041-9f2e2b82b503/go.mod h1:647nVfwUvuhlZFOnro3aRNPmRd2y3iDha9USb8aKSmM= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= @@ -98,5 +98,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.1 h1:FWCC1xY5vwJ5ou3duEBjB6w9IIlwfc9el3q3Mju3Dlg= -maunium.net/go/mautrix v0.26.1/go.mod h1:UySSpb8OqXG1sMJ6dDqyzmfcqr2ayZK+KzwqOTAkAOM= +maunium.net/go/mautrix v0.26.2-0.20260115120200-34bcd027e54c h1:ZtJgvgFoH4hxNxFSavFXw7HUnjq49OyjxoEyGcjGk4k= +maunium.net/go/mautrix v0.26.2-0.20260115120200-34bcd027e54c/go.mod h1:vUvbzvY00Tbl8WjBdp5afvc69uIxujnfGHpAugxvR/Q= diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go index f9bdd68..0343d02 100644 --- a/pkg/connector/connector.go +++ b/pkg/connector/connector.go @@ -24,6 +24,7 @@ import ( "github.com/google/uuid" "go.mau.fi/util/dbutil" + "go.mau.fi/util/exhttp" "go.mau.fi/util/exsync" "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/commands" @@ -35,6 +36,7 @@ import ( "go.mau.fi/mautrix-signal/pkg/signalid" "go.mau.fi/mautrix-signal/pkg/signalmeow" "go.mau.fi/mautrix-signal/pkg/signalmeow/store" + "go.mau.fi/mautrix-signal/pkg/signalmeow/web" ) type SignalConnector struct { @@ -74,6 +76,7 @@ func (s *SignalConnector) SetMaxFileSize(maxSize int64) { } func (s *SignalConnector) Start(ctx context.Context) error { + s.ResetHTTPTransport() err := s.Store.Upgrade(ctx) if err != nil { return bridgev2.DBUpgradeError{Err: err, Section: "signalmeow"} @@ -81,6 +84,26 @@ func (s *SignalConnector) Start(ctx context.Context) error { return nil } +func (s *SignalConnector) ResetHTTPTransport() { + settings := exhttp.SensibleClientSettings + hs, ok := s.Bridge.Matrix.(bridgev2.MatrixConnectorWithHTTPSettings) + if ok { + settings = hs.GetHTTPClientSettings() + } + oldClient := web.SignalHTTPClient + web.SignalHTTPClient = settings.WithTLSConfig(web.SignalTLSConfig).Compile() + oldClient.CloseIdleConnections() +} + +func (s *SignalConnector) ResetNetworkConnections() { + for _, login := range s.Bridge.GetAllCachedUserLogins() { + c := login.Client.(*SignalClient) + if c.Client != nil { + c.Client.ForceReconnect() + } + } +} + func (s *SignalConnector) LoadUserLogin(ctx context.Context, login *bridgev2.UserLogin) error { aci, err := uuid.Parse(string(login.ID)) if err != nil { diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 1b4dce0..b802e06 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -280,6 +280,11 @@ func (cli *Client) StartReceiveLoops(ctx context.Context) (chan SignalConnection return statusChan, nil } +func (cli *Client) ForceReconnect() { + cli.AuthedWS.ForceReconnect() + cli.UnauthedWS.ForceReconnect() +} + func (cli *Client) StopReceiveLoops() error { defer func() { cli.AuthedWS = nil diff --git a/pkg/signalmeow/web/signalwebsocket.go b/pkg/signalmeow/web/signalwebsocket.go index 272acbb..a2153a1 100644 --- a/pkg/signalmeow/web/signalwebsocket.go +++ b/pkg/signalmeow/web/signalwebsocket.go @@ -59,6 +59,7 @@ type SignalWebsocket struct { closeEvt *exsync.Event closeCalled atomic.Bool cancel atomic.Pointer[context.CancelFunc] + cancelConn atomic.Pointer[context.CancelCauseFunc] } func NewSignalWebsocket(basicAuth *url.Userinfo) *SignalWebsocket { @@ -160,6 +161,19 @@ func (s *SignalWebsocket) pushOutgoing(ctx context.Context, send SignalWebsocket } } +var ErrForcedReconnect = errors.New("forced reconnect") + +func (s *SignalWebsocket) ForceReconnect() { + if s == nil { + return + } + cancelFn := s.cancelConn.Load() + if cancelFn == nil { + return + } + (*cancelFn)(ErrForcedReconnect) +} + func (s *SignalWebsocket) connectLoop( ctx context.Context, requestHandler RequestHandlerFunc, @@ -312,6 +326,7 @@ func (s *SignalWebsocket) connectLoop( responseChannels := exsync.NewMap[uint64, chan *signalpb.WebSocketResponseMessage]() loopCtx, loopCancel := context.WithCancelCause(ctx) + s.cancelConn.Store(&loopCancel) var wg sync.WaitGroup wg.Add(3) @@ -389,6 +404,11 @@ func (s *SignalWebsocket) connectLoop( } else { errorCount++ s.pushStatus(ctx, SignalWebsocketConnectionEventDisconnected, ctxCauseErr) + if errors.Is(ctxCauseErr, ErrForcedReconnect) { + // Skip the delay for forced reconnects + // TODO should the delay be lowered globally? + isFirstConnect = true + } } // Clean up diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index e18ee5a..d0fcd01 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -26,8 +26,6 @@ import ( "fmt" "io" "net/http" - "net/url" - "os" "runtime" "strings" @@ -37,9 +35,6 @@ import ( signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" ) -const proxyUrlStr = "" // Set this to proxy requests -const caCertPath = "" // Set this to trust a self-signed cert (ie. for mitmproxy) - var BaseUserAgent = "libsignal/" + libsignalgo.Version + " go/" + strings.TrimPrefix(runtime.Version(), "go") var UserAgent = "signalmeow/0.1.0 " + BaseUserAgent var SignalAgent = "MAU" @@ -61,11 +56,11 @@ var CDNHosts = []string{ //go:embed signal-root.crt.der var signalRootCertBytes []byte +var SignalCertPool = x509.NewCertPool() +var SignalTLSConfig = &tls.Config{RootCAs: SignalCertPool} var signalTransport = &http.Transport{ ForceAttemptHTTP2: true, - TLSClientConfig: &tls.Config{ - RootCAs: x509.NewCertPool(), - }, + TLSClientConfig: SignalTLSConfig, } var SignalHTTPClient = &http.Client{ Transport: signalTransport, @@ -76,22 +71,7 @@ func init() { if err != nil { panic(err) } - signalTransport.TLSClientConfig.RootCAs.AddCert(cert) - - if proxyUrlStr != "" { - proxyURL, err := url.Parse(proxyUrlStr) - if err != nil { - panic(err) - } - signalTransport.Proxy = http.ProxyURL(proxyURL) - } - if caCertPath != "" { - caCert, err := os.ReadFile(caCertPath) - if err != nil { - panic(err) - } - signalTransport.TLSClientConfig.RootCAs.AppendCertsFromPEM(caCert) - } + SignalCertPool.AddCert(cert) } type ContentType string From d19f3bdce3fdfc94aeaaea66eb9a3bcdc6555746 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 16 Jan 2026 15:01:48 +0200 Subject: [PATCH 099/170] libsignal: update to v0.86.12 --- pkg/libsignalgo/error.go | 107 +++++++++--- pkg/libsignalgo/groupcipher.go | 2 +- pkg/libsignalgo/kyberprekeystore.go | 35 ++-- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 154 ++++++++++++------ .../senderkeydistributionmessage.go | 2 +- pkg/libsignalgo/serviceid.go | 6 - pkg/libsignalgo/version.go | 2 +- 8 files changed, 209 insertions(+), 101 deletions(-) diff --git a/pkg/libsignalgo/error.go b/pkg/libsignalgo/error.go index b0d79c8..b25130b 100644 --- a/pkg/libsignalgo/error.go +++ b/pkg/libsignalgo/error.go @@ -27,33 +27,86 @@ import ( type ErrorCode int const ( - ErrorCodeUnknownError ErrorCode = 1 - ErrorCodeInvalidState ErrorCode = 2 - ErrorCodeInternalError ErrorCode = 3 - ErrorCodeNullParameter ErrorCode = 4 - ErrorCodeInvalidArgument ErrorCode = 5 - ErrorCodeInvalidType ErrorCode = 6 - ErrorCodeInvalidUtf8String ErrorCode = 7 - ErrorCodeProtobufError ErrorCode = 10 - ErrorCodeLegacyCiphertextVersion ErrorCode = 21 - ErrorCodeUnknownCiphertextVersion ErrorCode = 22 - ErrorCodeUnrecognizedMessageVersion ErrorCode = 23 - ErrorCodeInvalidMessage ErrorCode = 30 - ErrorCodeSealedSenderSelfSend ErrorCode = 31 - ErrorCodeInvalidKey ErrorCode = 40 - ErrorCodeInvalidSignature ErrorCode = 41 - ErrorCodeInvalidAttestationData ErrorCode = 42 - ErrorCodeFingerprintVersionMismatch ErrorCode = 51 - ErrorCodeFingerprintParsingError ErrorCode = 52 - ErrorCodeUntrustedIdentity ErrorCode = 60 - ErrorCodeInvalidKeyIdentifier ErrorCode = 70 - ErrorCodeSessionNotFound ErrorCode = 80 - ErrorCodeInvalidRegistrationId ErrorCode = 81 - ErrorCodeInvalidSession ErrorCode = 82 - ErrorCodeInvalidSenderKeySession ErrorCode = 83 - ErrorCodeDuplicatedMessage ErrorCode = 90 - ErrorCodeCallbackError ErrorCode = 100 - ErrorCodeVerificationFailure ErrorCode = 110 + ErrorCodeUnknownError ErrorCode = 1 + ErrorCodeInvalidState ErrorCode = 2 + ErrorCodeInternalError ErrorCode = 3 + ErrorCodeNullParameter ErrorCode = 4 + ErrorCodeInvalidArgument ErrorCode = 5 + ErrorCodeInvalidType ErrorCode = 6 + ErrorCodeInvalidUtf8String ErrorCode = 7 + ErrorCodeCancelled ErrorCode = 8 + ErrorCodeProtobufError ErrorCode = 10 + ErrorCodeLegacyCiphertextVersion ErrorCode = 21 + ErrorCodeUnknownCiphertextVersion ErrorCode = 22 + ErrorCodeUnrecognizedMessageVersion ErrorCode = 23 + ErrorCodeInvalidMessage ErrorCode = 30 + ErrorCodeSealedSenderSelfSend ErrorCode = 31 + ErrorCodeInvalidKey ErrorCode = 40 + ErrorCodeInvalidSignature ErrorCode = 41 + ErrorCodeInvalidAttestationData ErrorCode = 42 + ErrorCodeFingerprintVersionMismatch ErrorCode = 51 + ErrorCodeFingerprintParsingError ErrorCode = 52 + ErrorCodeUntrustedIdentity ErrorCode = 60 + ErrorCodeInvalidKeyIdentifier ErrorCode = 70 + ErrorCodeSessionNotFound ErrorCode = 80 + ErrorCodeInvalidRegistrationId ErrorCode = 81 + ErrorCodeInvalidSession ErrorCode = 82 + ErrorCodeInvalidSenderKeySession ErrorCode = 83 + ErrorCodeInvalidProtocolAddress ErrorCode = 84 + ErrorCodeDuplicatedMessage ErrorCode = 90 + ErrorCodeCallbackError ErrorCode = 100 + ErrorCodeVerificationFailure ErrorCode = 110 + ErrorCodeUsernameCannotBeEmpty ErrorCode = 120 + ErrorCodeUsernameCannotStartWithDigit ErrorCode = 121 + ErrorCodeUsernameMissingSeparator ErrorCode = 122 + ErrorCodeUsernameBadDiscriminatorCharacter ErrorCode = 123 + ErrorCodeUsernameBadNicknameCharacter ErrorCode = 124 + ErrorCodeUsernameTooShort ErrorCode = 125 + ErrorCodeUsernameTooLong ErrorCode = 126 + ErrorCodeUsernameLinkInvalidEntropyDataLength ErrorCode = 127 + ErrorCodeUsernameLinkInvalid ErrorCode = 128 + ErrorCodeUsernameDiscriminatorCannotBeEmpty ErrorCode = 130 + ErrorCodeUsernameDiscriminatorCannotBeZero ErrorCode = 131 + ErrorCodeUsernameDiscriminatorCannotBeSingleDigit ErrorCode = 132 + ErrorCodeUsernameDiscriminatorCannotHaveLeadingZeros ErrorCode = 133 + ErrorCodeUsernameDiscriminatorTooLarge ErrorCode = 134 + ErrorCodeIoError ErrorCode = 140 + ErrorCodeInvalidMediaInput ErrorCode = 141 + ErrorCodeUnsupportedMediaInput ErrorCode = 142 + ErrorCodeConnectionTimedOut ErrorCode = 143 + ErrorCodeNetworkProtocol ErrorCode = 144 + ErrorCodeRateLimited ErrorCode = 145 + ErrorCodeWebSocket ErrorCode = 146 + ErrorCodeCdsiInvalidToken ErrorCode = 147 + ErrorCodeConnectionFailed ErrorCode = 148 + ErrorCodeChatServiceInactive ErrorCode = 149 + ErrorCodeRequestTimedOut ErrorCode = 150 + ErrorCodeRateLimitChallenge ErrorCode = 151 + ErrorCodePossibleCaptiveNetwork ErrorCode = 152 + ErrorCodeSvrDataMissing ErrorCode = 160 + ErrorCodeSvrRestoreFailed ErrorCode = 161 + ErrorCodeSvrRotationMachineTooManySteps ErrorCode = 162 + ErrorCodeSvrRequestFailed ErrorCode = 163 + ErrorCodeAppExpired ErrorCode = 170 + ErrorCodeDeviceDeregistered ErrorCode = 171 + ErrorCodeConnectionInvalidated ErrorCode = 172 + ErrorCodeConnectedElsewhere ErrorCode = 173 + ErrorCodeBackupValidation ErrorCode = 180 + ErrorCodeRegistrationInvalidSessionId ErrorCode = 190 + ErrorCodeRegistrationUnknown ErrorCode = 192 + ErrorCodeRegistrationSessionNotFound ErrorCode = 193 + ErrorCodeRegistrationNotReadyForVerification ErrorCode = 194 + ErrorCodeRegistrationSendVerificationCodeFailed ErrorCode = 195 + ErrorCodeRegistrationCodeNotDeliverable ErrorCode = 196 + ErrorCodeRegistrationSessionUpdateRejected ErrorCode = 197 + ErrorCodeRegistrationCredentialsCouldNotBeParsed ErrorCode = 198 + ErrorCodeRegistrationDeviceTransferPossible ErrorCode = 199 + ErrorCodeRegistrationRecoveryVerificationFailed ErrorCode = 200 + ErrorCodeRegistrationLock ErrorCode = 201 + ErrorCodeKeyTransparencyError ErrorCode = 210 + ErrorCodeKeyTransparencyVerificationFailed ErrorCode = 211 + ErrorCodeRequestUnauthorized ErrorCode = 220 + ErrorCodeMismatchedDevices ErrorCode = 221 ) type SignalError struct { diff --git a/pkg/libsignalgo/groupcipher.go b/pkg/libsignalgo/groupcipher.go index 7b58207..9ec5997 100644 --- a/pkg/libsignalgo/groupcipher.go +++ b/pkg/libsignalgo/groupcipher.go @@ -36,7 +36,7 @@ func GroupEncrypt(ctx context.Context, ptext []byte, sender *Address, distributi signalFfiError := C.signal_group_encrypt_message( &ciphertextMessage, sender.constPtr(), - (*[C.SignalUUID_LEN]C.uchar)(unsafe.Pointer(&distributionID)), + *(*C.SignalUuid)(unsafe.Pointer(&distributionID)), BytesToBuffer(ptext), callbackCtx.wrapSenderKeyStore(store)) runtime.KeepAlive(ptext) diff --git a/pkg/libsignalgo/kyberprekeystore.go b/pkg/libsignalgo/kyberprekeystore.go index 072db99..ebb5a9f 100644 --- a/pkg/libsignalgo/kyberprekeystore.go +++ b/pkg/libsignalgo/kyberprekeystore.go @@ -20,11 +20,10 @@ package libsignalgo /* #include "./libsignal-ffi.h" -typedef const SignalKyberPreKeyRecord const_kyber_pre_key_record; - -extern int signal_load_kyber_pre_key_callback(void *store_ctx, SignalKyberPreKeyRecord **recordp, uint32_t id); -extern int signal_store_kyber_pre_key_callback(void *store_ctx, uint32_t id, const_kyber_pre_key_record *record); -extern int signal_mark_kyber_pre_key_used_callback(void *store_ctx, uint32_t id); +extern int signal_load_kyber_pre_key_callback(void *store_ctx, SignalMutPointerKyberPreKeyRecord *recordp, uint32_t id); +extern int signal_store_kyber_pre_key_callback(void *store_ctx, uint32_t id, SignalMutPointerKyberPreKeyRecord record); +extern int signal_mark_kyber_pre_key_used_callback(void *store_ctx, uint32_t id, uint32_t ec_prekey_id, SignalMutPointerPublicKey base_key); +extern void signal_destroy_kyber_pre_key_store_callback(void *store_ctx); */ import "C" import ( @@ -39,21 +38,21 @@ type KyberPreKeyStore interface { } //export signal_load_kyber_pre_key_callback -func signal_load_kyber_pre_key_callback(storeCtx unsafe.Pointer, keyp **C.SignalKyberPreKeyRecord, id C.uint32_t) C.int { +func signal_load_kyber_pre_key_callback(storeCtx unsafe.Pointer, keyp *C.SignalMutPointerKyberPreKeyRecord, id C.uint32_t) C.int { return wrapStoreCallback(storeCtx, func(store KyberPreKeyStore, ctx context.Context) error { key, err := store.LoadKyberPreKey(ctx, uint32(id)) if err == nil && key != nil { key.CancelFinalizer() - *keyp = key.ptr + keyp.raw = key.ptr } return err }) } //export signal_store_kyber_pre_key_callback -func signal_store_kyber_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t, preKeyRecord *C.const_kyber_pre_key_record) C.int { +func signal_store_kyber_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t, preKeyRecord C.SignalMutPointerKyberPreKeyRecord) C.int { return wrapStoreCallback(storeCtx, func(store KyberPreKeyStore, ctx context.Context) error { - record := KyberPreKeyRecord{ptr: (*C.SignalKyberPreKeyRecord)(unsafe.Pointer(preKeyRecord))} + record := KyberPreKeyRecord{ptr: preKeyRecord.raw} cloned, err := record.Clone() if err != nil { return err @@ -63,18 +62,24 @@ func signal_store_kyber_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t, } //export signal_mark_kyber_pre_key_used_callback -func signal_mark_kyber_pre_key_used_callback(storeCtx unsafe.Pointer, id C.uint32_t) C.int { +func signal_mark_kyber_pre_key_used_callback(storeCtx unsafe.Pointer, id C.uint32_t, ecPrekeyID C.uint32_t, baseKey C.SignalMutPointerPublicKey) C.int { return wrapStoreCallback(storeCtx, func(store KyberPreKeyStore, ctx context.Context) error { - err := store.MarkKyberPreKeyUsed(ctx, uint32(id)) - return err + // TODO use ecPrekeyID and baseKey? + return store.MarkKyberPreKeyUsed(ctx, uint32(id)) }) } +//export signal_destroy_kyber_pre_key_store_callback +func signal_destroy_kyber_pre_key_store_callback(storeCtx unsafe.Pointer) { + // No-op: Go's garbage collector handles cleanup +} + func (ctx *CallbackContext) wrapKyberPreKeyStore(store KyberPreKeyStore) C.SignalConstPointerFfiKyberPreKeyStoreStruct { return C.SignalConstPointerFfiKyberPreKeyStoreStruct{&C.SignalKyberPreKeyStore{ ctx: wrapStore(ctx, store), - load_kyber_pre_key: C.SignalLoadKyberPreKey(C.signal_load_kyber_pre_key_callback), - store_kyber_pre_key: C.SignalStoreKyberPreKey(C.signal_store_kyber_pre_key_callback), - mark_kyber_pre_key_used: C.SignalMarkKyberPreKeyUsed(C.signal_mark_kyber_pre_key_used_callback), + load_kyber_pre_key: C.SignalFfiBridgeKyberPreKeyStoreLoadKyberPreKey(C.signal_load_kyber_pre_key_callback), + store_kyber_pre_key: C.SignalFfiBridgeKyberPreKeyStoreStoreKyberPreKey(C.signal_store_kyber_pre_key_callback), + mark_kyber_pre_key_used: C.SignalFfiBridgeKyberPreKeyStoreMarkKyberPreKeyUsed(C.signal_mark_kyber_pre_key_used_callback), + destroy: C.SignalFfiBridgeKyberPreKeyStoreDestroy(C.signal_destroy_kyber_pre_key_store_callback), }} } diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index ace4048..0480b16 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit ace404879f5dc146a512d88f696115715095a841 +Subproject commit 0480b16ac3c4ca9d641bc160b1b231f89d2e5fe3 diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index 26cbb6b..e2ddc02 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -233,6 +233,7 @@ typedef enum { SignalErrorCodeChatServiceInactive = 149, SignalErrorCodeRequestTimedOut = 150, SignalErrorCodeRateLimitChallenge = 151, + SignalErrorCodePossibleCaptiveNetwork = 152, SignalErrorCodeSvrDataMissing = 160, SignalErrorCodeSvrRestoreFailed = 161, SignalErrorCodeSvrRotationMachineTooManySteps = 162, @@ -341,6 +342,8 @@ typedef struct SignalPrivateKey SignalPrivateKey; */ typedef struct SignalProtocolAddress SignalProtocolAddress; +typedef struct SignalProvisioningChatConnection SignalProvisioningChatConnection; + typedef struct SignalPublicKey SignalPublicKey; typedef struct SignalRegisterAccountRequest SignalRegisterAccountRequest; @@ -511,9 +514,13 @@ typedef struct { SignalChatConnectionInfo *raw; } SignalMutPointerChatConnectionInfo; -typedef void (*SignalReceivedIncomingMessage)(void *ctx, SignalOwnedBuffer envelope, uint64_t timestamp_millis, SignalServerMessageAck *cleanup); +typedef struct { + SignalServerMessageAck *raw; +} SignalMutPointerServerMessageAck; -typedef void (*SignalReceivedQueueEmpty)(void *ctx); +typedef int (*SignalFfiChatListenerReceivedIncomingMessage)(void *ctx, SignalOwnedBuffer envelope, uint64_t timestamp, SignalMutPointerServerMessageAck ack); + +typedef int (*SignalFfiChatListenerReceivedQueueEmpty)(void *ctx); /** * A representation of a array allocated on the Rust heap for use in C code. @@ -533,34 +540,19 @@ typedef struct { typedef SignalBytestringArray SignalStringArray; -typedef void (*SignalReceivedAlerts)(void *ctx, SignalStringArray alerts); +typedef int (*SignalFfiChatListenerReceivedAlerts)(void *ctx, SignalStringArray alerts); -typedef void (*SignalConnectionInterrupted)(void *ctx, SignalFfiError *error); +typedef int (*SignalFfiChatListenerConnectionInterrupted)(void *ctx, SignalFfiError *disconnect_cause); -typedef void (*SignalDestroyChatListener)(void *ctx); +typedef void (*SignalFfiChatListenerDestroy)(void *ctx); -/** - * Callbacks for [`ChatListener`]. - * - * Callbacks will be serialized (i.e. two calls will not come in at the same time), but may not - * always happen on the same thread. Calls should be responded to promptly to avoid blocking later - * messages. - * - * # Safety - * - * This type contains raw pointers. Code that constructs an instance of this type must ensure - * memory safety assuming that - * - the callback function pointer fields are called with `ctx` as an argument; - * - the `destroy` function pointer field is called with `ctx` as an argument; - * - no function pointer fields are called after `destroy` is called. - */ typedef struct { void *ctx; - SignalReceivedIncomingMessage received_incoming_message; - SignalReceivedQueueEmpty received_queue_empty; - SignalReceivedAlerts received_alerts; - SignalConnectionInterrupted connection_interrupted; - SignalDestroyChatListener destroy; + SignalFfiChatListenerReceivedIncomingMessage received_incoming_message; + SignalFfiChatListenerReceivedQueueEmpty received_queue_empty; + SignalFfiChatListenerReceivedAlerts received_alerts; + SignalFfiChatListenerConnectionInterrupted connection_interrupted; + SignalFfiChatListenerDestroy destroy; } SignalFfiChatListenerStruct; typedef struct { @@ -610,6 +602,13 @@ typedef struct { const SignalHttpRequest *raw; } SignalConstPointerHttpRequest; +/** + * A wrapper type for raw UUIDs, because C treats arrays specially in argument position. + */ +typedef struct { + uint8_t bytes[16]; +} SignalUuid; + /** * The fixed-width binary representation of a ServiceId. * @@ -860,22 +859,23 @@ typedef struct { SignalKyberPreKeyRecord *raw; } SignalMutPointerKyberPreKeyRecord; -typedef int (*SignalLoadKyberPreKey)(void *store_ctx, SignalMutPointerKyberPreKeyRecord *recordp, uint32_t id); +typedef int (*SignalFfiBridgeKyberPreKeyStoreLoadKyberPreKey)(void *ctx, SignalMutPointerKyberPreKeyRecord *out, uint32_t id); -typedef struct { - const SignalKyberPreKeyRecord *raw; -} SignalConstPointerKyberPreKeyRecord; +typedef int (*SignalFfiBridgeKyberPreKeyStoreStoreKyberPreKey)(void *ctx, uint32_t id, SignalMutPointerKyberPreKeyRecord record); -typedef int (*SignalStoreKyberPreKey)(void *store_ctx, uint32_t id, SignalConstPointerKyberPreKeyRecord record); +typedef int (*SignalFfiBridgeKyberPreKeyStoreMarkKyberPreKeyUsed)(void *ctx, uint32_t id, uint32_t ec_prekey_id, SignalMutPointerPublicKey base_key); -typedef int (*SignalMarkKyberPreKeyUsed)(void *store_ctx, uint32_t id, uint32_t signed_prekey_id, SignalConstPointerPublicKey base_key); +typedef void (*SignalFfiBridgeKyberPreKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalLoadKyberPreKey load_kyber_pre_key; - SignalStoreKyberPreKey store_kyber_pre_key; - SignalMarkKyberPreKeyUsed mark_kyber_pre_key_used; -} SignalKyberPreKeyStore; + SignalFfiBridgeKyberPreKeyStoreLoadKyberPreKey load_kyber_pre_key; + SignalFfiBridgeKyberPreKeyStoreStoreKyberPreKey store_kyber_pre_key; + SignalFfiBridgeKyberPreKeyStoreMarkKyberPreKeyUsed mark_kyber_pre_key_used; + SignalFfiBridgeKyberPreKeyStoreDestroy destroy; +} SignalFfiBridgeKyberPreKeyStoreStruct; + +typedef SignalFfiBridgeKyberPreKeyStoreStruct SignalKyberPreKeyStore; typedef struct { const SignalKyberPreKeyStore *raw; @@ -1104,6 +1104,10 @@ typedef struct { SignalKyberSecretKey *raw; } SignalMutPointerKyberSecretKey; +typedef struct { + const SignalKyberPreKeyRecord *raw; +} SignalConstPointerKyberPreKeyRecord; + typedef struct { const SignalKyberPublicKey *raw; } SignalConstPointerKyberPublicKey; @@ -1186,6 +1190,49 @@ typedef struct { const SignalSenderKeyDistributionMessage *raw; } SignalConstPointerSenderKeyDistributionMessage; +typedef struct { + SignalProvisioningChatConnection *raw; +} SignalMutPointerProvisioningChatConnection; + +/** + * A C callback used to report the results of Rust futures. + * + * cbindgen will produce independent C types like `SignalCPromisei32` and + * `SignalCPromiseProtocolAddress`. + * + * This derives Copy because it behaves like a C type; nevertheless, a promise should still only be + * completed once. + */ +typedef struct { + void (*complete)(SignalFfiError *error, const SignalMutPointerProvisioningChatConnection *result, const void *context); + const void *context; + SignalCancellationId cancellation_id; +} SignalCPromiseMutPointerProvisioningChatConnection; + +typedef struct { + const SignalProvisioningChatConnection *raw; +} SignalConstPointerProvisioningChatConnection; + +typedef int (*SignalFfiProvisioningListenerReceivedAddress)(void *ctx, const char *address, SignalMutPointerServerMessageAck send_ack); + +typedef int (*SignalFfiProvisioningListenerReceivedEnvelope)(void *ctx, SignalOwnedBuffer envelope, SignalMutPointerServerMessageAck send_ack); + +typedef int (*SignalFfiProvisioningListenerConnectionInterrupted)(void *ctx, SignalFfiError *disconnect_cause); + +typedef void (*SignalFfiProvisioningListenerDestroy)(void *ctx); + +typedef struct { + void *ctx; + SignalFfiProvisioningListenerReceivedAddress received_address; + SignalFfiProvisioningListenerReceivedEnvelope received_envelope; + SignalFfiProvisioningListenerConnectionInterrupted connection_interrupted; + SignalFfiProvisioningListenerDestroy destroy; +} SignalFfiProvisioningListenerStruct; + +typedef struct { + const SignalFfiProvisioningListenerStruct *raw; +} SignalConstPointerFfiProvisioningListenerStruct; + typedef struct { SignalRegisterAccountRequest *raw; } SignalMutPointerRegisterAccountRequest; @@ -1209,7 +1256,10 @@ typedef struct { const SignalRegisterAccountResponse *raw; } SignalConstPointerRegisterAccountResponse; -typedef uint8_t SignalOptionalUuid[17]; +typedef struct { + bool present; + uint8_t bytes[16]; +} SignalOptionalUuid; typedef SignalAccountAttributes SignalRegistrationAccountAttributes; @@ -1402,10 +1452,6 @@ typedef struct { const SignalSenderKeyMessage *raw; } SignalConstPointerSenderKeyMessage; -typedef struct { - SignalServerMessageAck *raw; -} SignalMutPointerServerMessageAck; - typedef struct { const SignalServerMessageAck *raw; } SignalConstPointerServerMessageAck; @@ -1606,7 +1652,7 @@ SignalFfiError *signal_backup_auth_credential_request_context_check_valid_conten SignalFfiError *signal_backup_auth_credential_request_context_get_request(SignalOwnedBuffer *out, SignalBorrowedBuffer context_bytes); -SignalFfiError *signal_backup_auth_credential_request_context_new(SignalOwnedBuffer *out, const uint8_t (*backup_key)[32], const uint8_t (*uuid)[16]); +SignalFfiError *signal_backup_auth_credential_request_context_new(SignalOwnedBuffer *out, const uint8_t (*backup_key)[32], SignalUuid uuid); SignalFfiError *signal_backup_auth_credential_request_context_receive_response(SignalOwnedBuffer *out, SignalBorrowedBuffer context_bytes, SignalBorrowedBuffer response_bytes, uint64_t expected_redemption_time, SignalBorrowedBuffer params_bytes); @@ -1804,7 +1850,7 @@ uint32_t signal_error_get_type(const SignalFfiError *err); SignalFfiError *signal_error_get_unknown_fields(SignalStringArray *out, SignalUnwindSafeArgSignalFfiError err); -SignalFfiError *signal_error_get_uuid(uint8_t (*out)[16], SignalUnwindSafeArgSignalFfiError err); +SignalFfiError *signal_error_get_uuid(SignalUuid *out, SignalUnwindSafeArgSignalFfiError err); SignalFfiError *signal_expiring_profile_key_credential_check_valid_contents(SignalBorrowedBuffer buffer); @@ -1850,7 +1896,7 @@ SignalFfiError *signal_generic_server_secret_params_get_public_params(SignalOwne SignalFfiError *signal_group_decrypt_message(SignalOwnedBuffer *out, SignalConstPointerProtocolAddress sender, SignalBorrowedBuffer message, SignalConstPointerFfiSenderKeyStoreStruct store); -SignalFfiError *signal_group_encrypt_message(SignalMutPointerCiphertextMessage *out, SignalConstPointerProtocolAddress sender, const uint8_t (*distribution_id)[16], SignalBorrowedBuffer message, SignalConstPointerFfiSenderKeyStoreStruct store); +SignalFfiError *signal_group_encrypt_message(SignalMutPointerCiphertextMessage *out, SignalConstPointerProtocolAddress sender, SignalUuid distribution_id, SignalBorrowedBuffer message, SignalConstPointerFfiSenderKeyStoreStruct store); SignalFfiError *signal_group_master_key_check_valid_contents(SignalBorrowedBuffer buffer); @@ -2226,6 +2272,16 @@ SignalFfiError *signal_profile_key_get_commitment(unsigned char (*out)[SignalPRO SignalFfiError *signal_profile_key_get_profile_key_version(uint8_t (*out)[SignalPROFILE_KEY_VERSION_ENCODED_LEN], const unsigned char (*profile_key)[SignalPROFILE_KEY_LEN], const SignalServiceIdFixedWidthBinaryBytes *user_id); +SignalFfiError *signal_provisioning_chat_connection_connect(SignalCPromiseMutPointerProvisioningChatConnection *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerConnectionManager connection_manager); + +SignalFfiError *signal_provisioning_chat_connection_destroy(SignalMutPointerProvisioningChatConnection p); + +SignalFfiError *signal_provisioning_chat_connection_disconnect(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerProvisioningChatConnection chat); + +SignalFfiError *signal_provisioning_chat_connection_info(SignalMutPointerChatConnectionInfo *out, SignalConstPointerProvisioningChatConnection chat); + +SignalFfiError *signal_provisioning_chat_connection_init_listener(SignalConstPointerProvisioningChatConnection chat, SignalConstPointerFfiProvisioningListenerStruct listener); + SignalFfiError *signal_publickey_clone(SignalMutPointerPublicKey *new_obj, SignalConstPointerPublicKey obj); SignalFfiError *signal_publickey_compare(int32_t *out, SignalConstPointerPublicKey key1, SignalConstPointerPublicKey key2); @@ -2402,7 +2458,7 @@ SignalFfiError *signal_sender_certificate_validate(bool *out, SignalConstPointer SignalFfiError *signal_sender_key_distribution_message_clone(SignalMutPointerSenderKeyDistributionMessage *new_obj, SignalConstPointerSenderKeyDistributionMessage obj); -SignalFfiError *signal_sender_key_distribution_message_create(SignalMutPointerSenderKeyDistributionMessage *out, SignalConstPointerProtocolAddress sender, const uint8_t (*distribution_id)[16], SignalConstPointerFfiSenderKeyStoreStruct store); +SignalFfiError *signal_sender_key_distribution_message_create(SignalMutPointerSenderKeyDistributionMessage *out, SignalConstPointerProtocolAddress sender, SignalUuid distribution_id, SignalConstPointerFfiSenderKeyStoreStruct store); SignalFfiError *signal_sender_key_distribution_message_deserialize(SignalMutPointerSenderKeyDistributionMessage *out, SignalBorrowedBuffer data); @@ -2412,13 +2468,13 @@ SignalFfiError *signal_sender_key_distribution_message_get_chain_id(uint32_t *ou SignalFfiError *signal_sender_key_distribution_message_get_chain_key(SignalOwnedBuffer *out, SignalConstPointerSenderKeyDistributionMessage obj); -SignalFfiError *signal_sender_key_distribution_message_get_distribution_id(uint8_t (*out)[16], SignalConstPointerSenderKeyDistributionMessage obj); +SignalFfiError *signal_sender_key_distribution_message_get_distribution_id(SignalUuid *out, SignalConstPointerSenderKeyDistributionMessage obj); SignalFfiError *signal_sender_key_distribution_message_get_iteration(uint32_t *out, SignalConstPointerSenderKeyDistributionMessage obj); SignalFfiError *signal_sender_key_distribution_message_get_signature_key(SignalMutPointerPublicKey *out, SignalConstPointerSenderKeyDistributionMessage m); -SignalFfiError *signal_sender_key_distribution_message_new(SignalMutPointerSenderKeyDistributionMessage *out, uint8_t message_version, const uint8_t (*distribution_id)[16], uint32_t chain_id, uint32_t iteration, SignalBorrowedBuffer chainkey, SignalConstPointerPublicKey pk); +SignalFfiError *signal_sender_key_distribution_message_new(SignalMutPointerSenderKeyDistributionMessage *out, uint8_t message_version, SignalUuid distribution_id, uint32_t chain_id, uint32_t iteration, SignalBorrowedBuffer chainkey, SignalConstPointerPublicKey pk); SignalFfiError *signal_sender_key_distribution_message_serialize(SignalOwnedBuffer *out, SignalConstPointerSenderKeyDistributionMessage obj); @@ -2432,11 +2488,11 @@ SignalFfiError *signal_sender_key_message_get_chain_id(uint32_t *out, SignalCons SignalFfiError *signal_sender_key_message_get_cipher_text(SignalOwnedBuffer *out, SignalConstPointerSenderKeyMessage obj); -SignalFfiError *signal_sender_key_message_get_distribution_id(uint8_t (*out)[16], SignalConstPointerSenderKeyMessage obj); +SignalFfiError *signal_sender_key_message_get_distribution_id(SignalUuid *out, SignalConstPointerSenderKeyMessage obj); SignalFfiError *signal_sender_key_message_get_iteration(uint32_t *out, SignalConstPointerSenderKeyMessage obj); -SignalFfiError *signal_sender_key_message_new(SignalMutPointerSenderKeyMessage *out, uint8_t message_version, const uint8_t (*distribution_id)[16], uint32_t chain_id, uint32_t iteration, SignalBorrowedBuffer ciphertext, SignalConstPointerPrivateKey pk); +SignalFfiError *signal_sender_key_message_new(SignalMutPointerSenderKeyMessage *out, uint8_t message_version, SignalUuid distribution_id, uint32_t chain_id, uint32_t iteration, SignalBorrowedBuffer ciphertext, SignalConstPointerPrivateKey pk); SignalFfiError *signal_sender_key_message_serialize(SignalOwnedBuffer *out, SignalConstPointerSenderKeyMessage obj); @@ -2602,7 +2658,7 @@ SignalFfiError *signal_unauthenticated_chat_connection_init_listener(SignalConst SignalFfiError *signal_unauthenticated_chat_connection_look_up_username_hash(SignalCPromiseOptionalUuid *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer hash); -SignalFfiError *signal_unauthenticated_chat_connection_look_up_username_link(SignalCPromiseOptionalPairOfc_charu832 *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, const uint8_t (*uuid)[16], SignalBorrowedBuffer entropy); +SignalFfiError *signal_unauthenticated_chat_connection_look_up_username_link(SignalCPromiseOptionalPairOfc_charu832 *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalUuid uuid, SignalBorrowedBuffer entropy); SignalFfiError *signal_unauthenticated_chat_connection_send(SignalCPromiseFfiChatResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalConstPointerHttpRequest http_request, uint32_t timeout_millis); diff --git a/pkg/libsignalgo/senderkeydistributionmessage.go b/pkg/libsignalgo/senderkeydistributionmessage.go index d07c558..c9f6099 100644 --- a/pkg/libsignalgo/senderkeydistributionmessage.go +++ b/pkg/libsignalgo/senderkeydistributionmessage.go @@ -60,7 +60,7 @@ func NewSenderKeyDistributionMessage(ctx context.Context, sender *Address, distr signalFfiError := C.signal_sender_key_distribution_message_create( &skdm, sender.constPtr(), - (*[C.SignalUUID_LEN]C.uchar)(unsafe.Pointer(&distributionID)), + *(*C.SignalUuid)(unsafe.Pointer(&distributionID)), callbackCtx.wrapSenderKeyStore(store), ) runtime.KeepAlive(sender) diff --git a/pkg/libsignalgo/serviceid.go b/pkg/libsignalgo/serviceid.go index 6b0c864..ae7cea7 100644 --- a/pkg/libsignalgo/serviceid.go +++ b/pkg/libsignalgo/serviceid.go @@ -31,12 +31,6 @@ import ( "github.com/rs/zerolog" ) -func init() { - if C.SignalUUID_LEN != 16 { - panic("libsignal-ffi uuid type size mismatch") - } -} - type ServiceIDType byte const ( diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index f690184..fddfaa8 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.86.8" +const Version = "v0.86.12" From f0c6cc1e0466662a8a8762ebddf7c76364a9e4aa Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 16 Jan 2026 15:03:08 +0200 Subject: [PATCH 100/170] dependencies: update --- go.mod | 24 ++++++++++++------------ go.sum | 44 ++++++++++++++++++++++---------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 05dfac3..ff53eb1 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-signal go 1.24.0 -toolchain go1.25.5 +toolchain go1.25.6 tool go.mau.fi/util/cmd/maubuild @@ -14,13 +14,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.5-0.20260114152041-9f2e2b82b503 - golang.org/x/crypto v0.46.0 - golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 - golang.org/x/net v0.48.0 + go.mau.fi/util v0.9.5 + golang.org/x/crypto v0.47.0 + golang.org/x/exp v0.0.0-20260112195511-716be5621a96 + golang.org/x/net v0.49.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.2-0.20260115120200-34bcd027e54c + maunium.net/go/mautrix v0.26.2 ) require ( @@ -31,8 +31,8 @@ require ( github.com/lib/pq v1.10.9 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.32 // indirect - github.com/petermattis/goid v0.0.0-20251121121749-a11dd1a45f9a // indirect + github.com/mattn/go-sqlite3 v1.14.33 // indirect + github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/rs/xid v1.6.0 // indirect @@ -40,12 +40,12 @@ require ( github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect - github.com/yuin/goldmark v1.7.13 // indirect + github.com/yuin/goldmark v1.7.16 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect - golang.org/x/mod v0.31.0 // indirect + golang.org/x/mod v0.32.0 // indirect golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.39.0 // indirect - golang.org/x/text v0.32.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/text v0.33.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index dfd2ccc..3c13426 100644 --- a/go.sum +++ b/go.sum @@ -35,10 +35,10 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= -github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= -github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/petermattis/goid v0.0.0-20251121121749-a11dd1a45f9a h1:VweslR2akb/ARhXfqSfRbj1vpWwYXf3eeAUyw/ndms0= -github.com/petermattis/goid v0.0.0-20251121121749-a11dd1a45f9a/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/mattn/go-sqlite3 v1.14.33 h1:A5blZ5ulQo2AtayQ9/limgHEkFreKj1Dv226a1K73s0= +github.com/mattn/go-sqlite3 v1.14.33/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 h1:KPpdlQLZcHfTMQRi6bFQ7ogNO0ltFT4PmtwTLW4W+14= +github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -64,29 +64,29 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= -github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.5-0.20260114152041-9f2e2b82b503 h1:L7ctH5wX8TrkZvIZmfxPkHQ1b8NZYw4fIr5WxXaewPw= -go.mau.fi/util v0.9.5-0.20260114152041-9f2e2b82b503/go.mod h1:647nVfwUvuhlZFOnro3aRNPmRd2y3iDha9USb8aKSmM= +github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= +github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +go.mau.fi/util v0.9.5 h1:7AoWPCIZJGv4jvtFEuCe3GhAbI7uF9ckIooaXvwlIR4= +go.mau.fi/util v0.9.5/go.mod h1:g1uvZ03VQhtTt2BgaRGVytS/Zj67NV0YNIECch0sQCQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= -golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= -golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= -golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 h1:MDfG8Cvcqlt9XXrmEiD4epKn7VJHZO84hejP9Jmp0MM= -golang.org/x/exp v0.0.0-20251209150349-8475f28825e9/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= -golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= -golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= -golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= -golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= +golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -98,5 +98,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.2-0.20260115120200-34bcd027e54c h1:ZtJgvgFoH4hxNxFSavFXw7HUnjq49OyjxoEyGcjGk4k= -maunium.net/go/mautrix v0.26.2-0.20260115120200-34bcd027e54c/go.mod h1:vUvbzvY00Tbl8WjBdp5afvc69uIxujnfGHpAugxvR/Q= +maunium.net/go/mautrix v0.26.2 h1:rLiZLQoSKCJDZ+mF1gBQS4p74h3jZXs83g8D4W6Te8g= +maunium.net/go/mautrix v0.26.2/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= From b425489845e5de7e3320614de9531d914d6ee5be Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 16 Jan 2026 15:08:11 +0200 Subject: [PATCH 101/170] Bump version to v26.01 --- CHANGELOG.md | 9 +++++++++ cmd/mautrix-signal/main.go | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a5d207..29f2299 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# v26.01 + +* Updated libsignal to v0.86.12. +* Changed automatic contact list sync option to only sync every 3 days rather + than on every restart. +* Fixed sending messages to groups with no other registered members. +* Fixed sender key sends failing if some users had changed devices. +* Fixed timestamps of outgoing typing notifications in DMs. + # v25.12 * Updated libsignal to v0.86.8. diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index 130e307..5391084 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -37,7 +37,7 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "25.12", + Version: "26.01", SemCalVer: true, Connector: &connector.SignalConnector{}, From 6b66216d24d8a7ec3e1f1dc6f47add3d26105c2a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 19 Jan 2026 15:17:21 +0200 Subject: [PATCH 102/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ff53eb1..d135335 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.49.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.2 + maunium.net/go/mautrix v0.26.3-0.20260119125818-e28f7170bc4b ) require ( diff --git a/go.sum b/go.sum index 3c13426..05055d0 100644 --- a/go.sum +++ b/go.sum @@ -98,5 +98,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.2 h1:rLiZLQoSKCJDZ+mF1gBQS4p74h3jZXs83g8D4W6Te8g= -maunium.net/go/mautrix v0.26.2/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= +maunium.net/go/mautrix v0.26.3-0.20260119125818-e28f7170bc4b h1:OaZ5Y1l4XACFlgy4BmZcCLdYPJZzgZWqZJnpdSITmoM= +maunium.net/go/mautrix v0.26.3-0.20260119125818-e28f7170bc4b/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= From a820c16ab6adffeac18c86b0f160e0cc7876f6de Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 20 Jan 2026 12:14:00 +0200 Subject: [PATCH 103/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d135335..d430a07 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.49.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.3-0.20260119125818-e28f7170bc4b + maunium.net/go/mautrix v0.26.3-0.20260120100901-a55693bbd7c6 ) require ( diff --git a/go.sum b/go.sum index 05055d0..64cbfa9 100644 --- a/go.sum +++ b/go.sum @@ -98,5 +98,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.3-0.20260119125818-e28f7170bc4b h1:OaZ5Y1l4XACFlgy4BmZcCLdYPJZzgZWqZJnpdSITmoM= -maunium.net/go/mautrix v0.26.3-0.20260119125818-e28f7170bc4b/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= +maunium.net/go/mautrix v0.26.3-0.20260120100901-a55693bbd7c6 h1:Xi2JR5xkAs1tdvL/qNYK/koLaPwi8/ZbWAKXOe3q2tI= +maunium.net/go/mautrix v0.26.3-0.20260120100901-a55693bbd7c6/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= From 45690972cd60867c00fc7def38524d8e61c00592 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Fri, 23 Jan 2026 16:46:10 +0100 Subject: [PATCH 104/170] handlesignal: assign beeper action message content for incoming calls (#632) --- go.mod | 4 ++-- go.sum | 7 ++++--- pkg/connector/handlesignal.go | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index d430a07..5f90925 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.49.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.3-0.20260120100901-a55693bbd7c6 + maunium.net/go/mautrix v0.26.3-0.20260123143817-d057f1c6732e ) require ( @@ -37,7 +37,7 @@ require ( github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/rs/xid v1.6.0 // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect - github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/match v1.2.0 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/goldmark v1.7.16 // indirect diff --git a/go.sum b/go.sum index 64cbfa9..cb0c5ee 100644 --- a/go.sum +++ b/go.sum @@ -57,8 +57,9 @@ github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/match v1.2.0 h1:0pt8FlkOwjN2fPt4bIl4BoNxb98gGHN2ObFEDkrfZnM= +github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -98,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.3-0.20260120100901-a55693bbd7c6 h1:Xi2JR5xkAs1tdvL/qNYK/koLaPwi8/ZbWAKXOe3q2tI= -maunium.net/go/mautrix v0.26.3-0.20260120100901-a55693bbd7c6/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= +maunium.net/go/mautrix v0.26.3-0.20260123143817-d057f1c6732e h1:lV73mGcvK73DWiAjZY4HBCo/Wr9R5Q8OgQ7U2Giraww= +maunium.net/go/mautrix v0.26.3-0.20260123143817-d057f1c6732e/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index c9f16c1..fb1a3ce 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -102,6 +102,9 @@ func convertCallEvent(ctx context.Context, portal *bridgev2.Portal, intent bridg if userID, _, _ := signalid.ParsePortalID(portal.ID); !userID.IsEmpty() { content.MsgType = event.MsgText } + content.BeeperActionMessage = &event.BeeperActionMessage{ + Type: event.BeeperActionMessageCall, + } } else { content.Body = "Call ended" } From 30d983192206f42ce546c3933b6af0d02610f9e4 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 29 Jan 2026 18:30:26 +0200 Subject: [PATCH 105/170] signalmeow/senderkey: log removed devices when resetting --- pkg/signalmeow/senderkey.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/pkg/signalmeow/senderkey.go b/pkg/signalmeow/senderkey.go index 096d524..48a3203 100644 --- a/pkg/signalmeow/senderkey.go +++ b/pkg/signalmeow/senderkey.go @@ -125,9 +125,11 @@ func (cli *Client) sendToGroupWithSenderKey( } else { log.Debug().Any("sender_key_info", ski).Msg("Reusing existing sender key") } - xak, devicesAddedTo, reset := diffRecipients(ski.SharedWith, deviceIDs) - if reset { - log.Debug().Msg("Resetting sender key due to recipient device changes") + xak, devicesAddedTo, removedDevices := diffRecipients(ski.SharedWith, deviceIDs) + if len(removedDevices) > 0 { + log.Debug(). + Any("removed_devices", removedDevices). + Msg("Resetting sender key due to recipient device changes") devicesAddedTo = slices.Collect(maps.Keys(deviceIDs)) err = cli.Store.SenderKeyStore.DeleteSenderKey(ctx, myAddress, ski.DistributionID) if err != nil { @@ -304,9 +306,12 @@ func (cli *Client) encryptWithSenderKey( } func diffRecipients( - prevDevices map[libsignalgo.ServiceID][]int, newDevices map[libsignalgo.ServiceID]senderKeySendMeta, + prevDevices map[libsignalgo.ServiceID][]int, + newDevices map[libsignalgo.ServiceID]senderKeySendMeta, ) ( - xak *libsignalgo.AccessKey, devicesAddedTo []libsignalgo.ServiceID, reset bool, + xak *libsignalgo.AccessKey, + devicesAddedTo []libsignalgo.ServiceID, + globalRemovedDevices map[libsignalgo.ServiceID][]int, ) { collector := make(map[libsignalgo.ServiceID]uint8, max(len(prevDevices), len(newDevices))) for key := range prevDevices { @@ -315,6 +320,7 @@ func diffRecipients( for key := range newDevices { collector[key] |= 0b10 } + globalRemovedDevices = make(map[libsignalgo.ServiceID][]int) for serviceID, mask := range collector { if mask != 0b01 { xak = xak.Xor(newDevices[serviceID].AccessKey) @@ -322,7 +328,7 @@ func diffRecipients( switch mask { case 0b01: // Someone left the group - reset = true + globalRemovedDevices[serviceID] = prevDevices[serviceID] case 0b10: // Someone was added to the group devicesAddedTo = append(devicesAddedTo, serviceID) @@ -330,7 +336,7 @@ func diffRecipients( removedDevices, addedDevices := exslices.Diff(prevDevices[serviceID], newDevices[serviceID].DeviceIDs) if len(removedDevices) > 0 { // Device was removed - reset = true + globalRemovedDevices[serviceID] = removedDevices } else if len(addedDevices) > 0 { // User got new devices devicesAddedTo = append(devicesAddedTo, serviceID) From c90be170f490cda593a270dcfdf7fb7a204d7178 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 29 Jan 2026 18:45:34 +0200 Subject: [PATCH 106/170] signalmeow/sending: refetch prekeys on error 80 --- pkg/libsignalgo/error.go | 8 ++++++++ pkg/signalmeow/sending.go | 9 +++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pkg/libsignalgo/error.go b/pkg/libsignalgo/error.go index b25130b..888f8ea 100644 --- a/pkg/libsignalgo/error.go +++ b/pkg/libsignalgo/error.go @@ -26,6 +26,10 @@ import ( type ErrorCode int +func (e ErrorCode) Error() string { + return fmt.Sprintf("libsignalgo.ErrorCode(%d)", int(e)) +} + const ( ErrorCodeUnknownError ErrorCode = 1 ErrorCodeInvalidState ErrorCode = 2 @@ -118,6 +122,10 @@ func (e *SignalError) Error() string { return fmt.Sprintf("%d: %s", e.Code, e.Message) } +func (e *SignalError) Unwrap() error { + return e.Code +} + func (ctx *CallbackContext) wrapError(signalError *C.SignalFfiError) error { if signalError == nil { return nil diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 404571c..8e6b892 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -150,6 +150,7 @@ func (cli *Client) buildMessagesToSend( unauthenticated bool, groupID *libsignalgo.GroupIdentifier, ctmOverride *libsignalgo.CiphertextMessage, + forceResync bool, ) ([]MyMessage, error) { if ctx.Value(contextKeyEncryptionLock) != true { cli.encryptionLock.Lock() @@ -157,7 +158,7 @@ func (cli *Client) buildMessagesToSend( } sessions, err := cli.Store.ACISessionStore.AllSessionsForServiceID(ctx, recipient) - if err == nil && len(sessions) == 0 { + if err == nil && (len(sessions) == 0 || forceResync) { // No sessions, make one with prekey err = cli.FetchAndProcessPreKey(ctx, recipient, -1) if err != nil { @@ -900,7 +901,11 @@ func (cli *Client) sendContent( } var messages []MyMessage - messages, err = cli.buildMessagesToSend(ctx, recipient, content, useUnidentifiedSender, groupID, ctmOverride) + messages, err = cli.buildMessagesToSend(ctx, recipient, content, useUnidentifiedSender, groupID, ctmOverride, false) + if errors.Is(err, libsignalgo.ErrorCodeSessionNotFound) { + log.Err(err).Msg("Got session not found error from libsignal, trying to refetch prekeys") + messages, err = cli.buildMessagesToSend(ctx, recipient, content, useUnidentifiedSender, groupID, ctmOverride, true) + } if err != nil { log.Err(err).Msg("Error building messages to send") return false, err From 93da772584b20ac1975e872e26739b273314b73e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 29 Jan 2026 19:47:37 +0200 Subject: [PATCH 107/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5f90925..728ffb7 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.49.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.3-0.20260123143817-d057f1c6732e + maunium.net/go/mautrix v0.26.3-0.20260129174719-d2364b382275 ) require ( diff --git a/go.sum b/go.sum index cb0c5ee..8dba58f 100644 --- a/go.sum +++ b/go.sum @@ -99,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.3-0.20260123143817-d057f1c6732e h1:lV73mGcvK73DWiAjZY4HBCo/Wr9R5Q8OgQ7U2Giraww= -maunium.net/go/mautrix v0.26.3-0.20260123143817-d057f1c6732e/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= +maunium.net/go/mautrix v0.26.3-0.20260129174719-d2364b382275 h1:r8BL0+HW4Dar1xV7Fc7NV/LxGH6VCvffkCUGe9ZfJg8= +maunium.net/go/mautrix v0.26.3-0.20260129174719-d2364b382275/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= From d603b7665d15b5514a115c4d77d7d4525976a5a2 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 9 Feb 2026 13:54:02 +0200 Subject: [PATCH 108/170] libsignal: update to v0.87.1 --- pkg/libsignalgo/identitykey.go | 3 +- pkg/libsignalgo/identitykeystore.go | 80 +++++------ pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 150 +++++++++++++-------- pkg/libsignalgo/prekeystore.go | 27 ++-- pkg/libsignalgo/publickey.go | 10 +- pkg/libsignalgo/senderkeystore.go | 34 ++--- pkg/libsignalgo/sessionstore.go | 30 +++-- pkg/libsignalgo/signedprekeystore.go | 25 ++-- pkg/libsignalgo/update-ffi-docker-inner.sh | 2 +- pkg/libsignalgo/version.go | 2 +- 11 files changed, 207 insertions(+), 158 deletions(-) diff --git a/pkg/libsignalgo/identitykey.go b/pkg/libsignalgo/identitykey.go index f35d116..0226e11 100644 --- a/pkg/libsignalgo/identitykey.go +++ b/pkg/libsignalgo/identitykey.go @@ -84,8 +84,7 @@ func (i *IdentityKey) VerifyAlternateIdentity(other *IdentityKey, signature []by } func (i *IdentityKey) Equal(other *IdentityKey) (bool, error) { - result, err := i.publicKey.Compare(other.publicKey) - return result == 0, err + return i.publicKey.Equal(other.publicKey) } type IdentityKeyPair struct { diff --git a/pkg/libsignalgo/identitykeystore.go b/pkg/libsignalgo/identitykeystore.go index c59b660..6a425e8 100644 --- a/pkg/libsignalgo/identitykeystore.go +++ b/pkg/libsignalgo/identitykeystore.go @@ -20,14 +20,12 @@ package libsignalgo /* #include "./libsignal-ffi.h" -typedef const SignalProtocolAddress const_address; -typedef const SignalPublicKey const_public_key; - -extern int signal_get_identity_key_pair_callback(void *store_ctx, SignalPrivateKey **keyp); +extern int signal_get_identity_key_pair_callback(void *store_ctx, SignalMutPointerPrivateKey *keyp); extern int signal_get_local_registration_id_callback(void *store_ctx, uint32_t *idp); -extern int signal_save_identity_key_callback(void *store_ctx, const_address *address, const_public_key *public_key); -extern int signal_get_identity_key_callback(void *store_ctx, SignalPublicKey **public_keyp, const_address *address); -extern int signal_is_trusted_identity_callback(void *store_ctx, const_address *address, const_public_key *public_key, unsigned int direction); +extern int signal_save_identity_key_callback(void *store_ctx, uint8_t *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key); +extern int signal_get_identity_key_callback(void *store_ctx, SignalMutPointerPublicKey *public_keyp, SignalMutPointerProtocolAddress address); +extern int signal_is_trusted_identity_callback(void *store_ctx, bool *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key, uint32_t direction); +extern void signal_destroy_identity_key_store_callback(void *store_ctx); */ import "C" import ( @@ -51,21 +49,21 @@ type IdentityKeyStore interface { } //export signal_get_identity_key_pair_callback -func signal_get_identity_key_pair_callback(storeCtx unsafe.Pointer, keyp **C.SignalPrivateKey) C.int { +func signal_get_identity_key_pair_callback(storeCtx unsafe.Pointer, keyp *C.SignalMutPointerPrivateKey) C.int { return wrapStoreCallback(storeCtx, func(store IdentityKeyStore, ctx context.Context) error { key, err := store.GetIdentityKeyPair(ctx) if err != nil { return err } if key == nil { - *keyp = nil + keyp.raw = nil } else { clone, err := key.privateKey.Clone() if err != nil { return err } clone.CancelFinalizer() - *keyp = clone.ptr + keyp.raw = clone.ptr } return err }) @@ -83,17 +81,17 @@ func signal_get_local_registration_id_callback(storeCtx unsafe.Pointer, idp *C.u } //export signal_save_identity_key_callback -func signal_save_identity_key_callback(storeCtx unsafe.Pointer, address *C.const_address, publicKey *C.const_public_key) C.int { - return wrapStoreCallbackCustomReturn(storeCtx, func(store IdentityKeyStore, ctx context.Context) (int, error) { - publicKeyStruct := PublicKey{ptr: (*C.SignalPublicKey)(unsafe.Pointer(publicKey))} +func signal_save_identity_key_callback(storeCtx unsafe.Pointer, out *C.uint8_t, address C.SignalMutPointerProtocolAddress, publicKey C.SignalMutPointerPublicKey) C.int { + return wrapStoreCallback(storeCtx, func(store IdentityKeyStore, ctx context.Context) error { + publicKeyStruct := PublicKey{ptr: publicKey.raw} cloned, err := publicKeyStruct.Clone() if err != nil { - return -1, err + return err } - addr := &Address{ptr: (*C.SignalProtocolAddress)(unsafe.Pointer(address))} + addr := &Address{ptr: address.raw} theirServiceID, err := addr.NameServiceID() if err != nil { - return -1, err + return err } replaced, err := store.SaveIdentityKey( ctx, @@ -101,20 +99,21 @@ func signal_save_identity_key_callback(storeCtx unsafe.Pointer, address *C.const &IdentityKey{cloned}, ) if err != nil { - return -1, err + return err } if replaced { - return 1, nil + *out = 1 } else { - return 0, nil + *out = 0 } + return nil }) } //export signal_get_identity_key_callback -func signal_get_identity_key_callback(storeCtx unsafe.Pointer, public_keyp **C.SignalPublicKey, address *C.const_address) C.int { +func signal_get_identity_key_callback(storeCtx unsafe.Pointer, public_keyp *C.SignalMutPointerPublicKey, address C.SignalMutPointerProtocolAddress) C.int { return wrapStoreCallback(storeCtx, func(store IdentityKeyStore, ctx context.Context) error { - addr := &Address{ptr: (*C.SignalProtocolAddress)(unsafe.Pointer(address))} + addr := &Address{ptr: address.raw} theirServiceID, err := addr.NameServiceID() if err != nil { return err @@ -122,39 +121,42 @@ func signal_get_identity_key_callback(storeCtx unsafe.Pointer, public_keyp **C.S key, err := store.GetIdentityKey(ctx, theirServiceID) if err == nil && key != nil { key.publicKey.CancelFinalizer() - *public_keyp = key.publicKey.ptr + public_keyp.raw = key.publicKey.ptr } return err }) } //export signal_is_trusted_identity_callback -func signal_is_trusted_identity_callback(storeCtx unsafe.Pointer, address *C.const_address, public_key *C.const_public_key, direction C.uint) C.int { - return wrapStoreCallbackCustomReturn(storeCtx, func(store IdentityKeyStore, ctx context.Context) (int, error) { - addr := &Address{ptr: (*C.SignalProtocolAddress)(unsafe.Pointer(address))} +func signal_is_trusted_identity_callback(storeCtx unsafe.Pointer, out *C.bool, address C.SignalMutPointerProtocolAddress, public_key C.SignalMutPointerPublicKey, direction C.uint32_t) C.int { + return wrapStoreCallback(storeCtx, func(store IdentityKeyStore, ctx context.Context) error { + addr := &Address{ptr: address.raw} theirServiceID, err := addr.NameServiceID() if err != nil { - return -1, err + return err } - trusted, err := store.IsTrustedIdentity(ctx, theirServiceID, &IdentityKey{&PublicKey{ptr: (*C.SignalPublicKey)(unsafe.Pointer(public_key))}}, SignalDirection(direction)) + trusted, err := store.IsTrustedIdentity(ctx, theirServiceID, &IdentityKey{&PublicKey{ptr: public_key.raw}}, SignalDirection(direction)) if err != nil { - return -1, err - } - if trusted { - return 1, nil - } else { - return 0, nil + return err } + *out = C.bool(trusted) + return nil }) } +//export signal_destroy_identity_key_store_callback +func signal_destroy_identity_key_store_callback(storeCtx unsafe.Pointer) { + // No-op: Go's garbage collector handles cleanup +} + func (ctx *CallbackContext) wrapIdentityKeyStore(store IdentityKeyStore) C.SignalConstPointerFfiIdentityKeyStoreStruct { return C.SignalConstPointerFfiIdentityKeyStoreStruct{&C.SignalIdentityKeyStore{ - ctx: wrapStore(ctx, store), - get_identity_key_pair: C.SignalGetIdentityKeyPair(C.signal_get_identity_key_pair_callback), - get_local_registration_id: C.SignalGetLocalRegistrationId(C.signal_get_local_registration_id_callback), - save_identity: C.SignalSaveIdentityKey(C.signal_save_identity_key_callback), - get_identity: C.SignalGetIdentityKey(C.signal_get_identity_key_callback), - is_trusted_identity: C.SignalIsTrustedIdentity(C.signal_is_trusted_identity_callback), + ctx: wrapStore(ctx, store), + get_local_identity_private_key: C.SignalFfiBridgeIdentityKeyStoreGetLocalIdentityPrivateKey(C.signal_get_identity_key_pair_callback), + get_local_registration_id: C.SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId(C.signal_get_local_registration_id_callback), + get_identity_key: C.SignalFfiBridgeIdentityKeyStoreGetIdentityKey(C.signal_get_identity_key_callback), + save_identity_key: C.SignalFfiBridgeIdentityKeyStoreSaveIdentityKey(C.signal_save_identity_key_callback), + is_trusted_identity: C.SignalFfiBridgeIdentityKeyStoreIsTrustedIdentity(C.signal_is_trusted_identity_callback), + destroy: C.SignalFfiBridgeIdentityKeyStoreDestroy(C.signal_destroy_identity_key_store_callback), }} } diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index 0480b16..f08390b 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit 0480b16ac3c4ca9d641bc160b1b231f89d2e5fe3 +Subproject commit f08390b0e2f67d5faf47bb9d1a3db191314db93c diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index e2ddc02..deb72cd 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -29,6 +29,8 @@ SPDX-License-Identifier: AGPL-3.0-only #define SignalBackupId_LEN 16 +#define SignalCallLinkSecretParams_ROOT_KEY_MAX_BYTES_FOR_SHO 16 + #define SignalNUM_AUTH_CRED_ATTRIBUTES 3 #define SignalNUM_PROFILE_KEY_CRED_ATTRIBUTES 4 @@ -755,50 +757,52 @@ typedef struct { SignalSessionRecord *raw; } SignalMutPointerSessionRecord; -typedef int (*SignalLoadSession)(void *store_ctx, SignalMutPointerSessionRecord *recordp, SignalConstPointerProtocolAddress address); +typedef int (*SignalFfiBridgeSessionStoreLoadSession)(void *ctx, SignalMutPointerSessionRecord *out, SignalMutPointerProtocolAddress address); -typedef struct { - const SignalSessionRecord *raw; -} SignalConstPointerSessionRecord; +typedef int (*SignalFfiBridgeSessionStoreStoreSession)(void *ctx, SignalMutPointerProtocolAddress address, SignalMutPointerSessionRecord record); -typedef int (*SignalStoreSession)(void *store_ctx, SignalConstPointerProtocolAddress address, SignalConstPointerSessionRecord record); +typedef void (*SignalFfiBridgeSessionStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalLoadSession load_session; - SignalStoreSession store_session; -} SignalSessionStore; + SignalFfiBridgeSessionStoreLoadSession load_session; + SignalFfiBridgeSessionStoreStoreSession store_session; + SignalFfiBridgeSessionStoreDestroy destroy; +} SignalFfiBridgeSessionStoreStruct; + +typedef SignalFfiBridgeSessionStoreStruct SignalSessionStore; typedef struct { const SignalSessionStore *raw; } SignalConstPointerFfiSessionStoreStruct; -typedef int (*SignalGetIdentityKeyPair)(void *store_ctx, SignalMutPointerPrivateKey *keyp); +typedef int (*SignalFfiBridgeIdentityKeyStoreGetLocalIdentityPrivateKey)(void *ctx, SignalMutPointerPrivateKey *out); -typedef int (*SignalGetLocalRegistrationId)(void *store_ctx, uint32_t *idp); - -typedef struct { - const SignalPublicKey *raw; -} SignalConstPointerPublicKey; - -typedef int (*SignalSaveIdentityKey)(void *store_ctx, SignalConstPointerProtocolAddress address, SignalConstPointerPublicKey public_key); +typedef int (*SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId)(void *ctx, uint32_t *out); typedef struct { SignalPublicKey *raw; } SignalMutPointerPublicKey; -typedef int (*SignalGetIdentityKey)(void *store_ctx, SignalMutPointerPublicKey *public_keyp, SignalConstPointerProtocolAddress address); +typedef int (*SignalFfiBridgeIdentityKeyStoreGetIdentityKey)(void *ctx, SignalMutPointerPublicKey *out, SignalMutPointerProtocolAddress address); -typedef int (*SignalIsTrustedIdentity)(void *store_ctx, SignalConstPointerProtocolAddress address, SignalConstPointerPublicKey public_key, unsigned int direction); +typedef int (*SignalFfiBridgeIdentityKeyStoreSaveIdentityKey)(void *ctx, uint8_t *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key); + +typedef int (*SignalFfiBridgeIdentityKeyStoreIsTrustedIdentity)(void *ctx, bool *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key, uint32_t direction); + +typedef void (*SignalFfiBridgeIdentityKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalGetIdentityKeyPair get_identity_key_pair; - SignalGetLocalRegistrationId get_local_registration_id; - SignalSaveIdentityKey save_identity; - SignalGetIdentityKey get_identity; - SignalIsTrustedIdentity is_trusted_identity; -} SignalIdentityKeyStore; + SignalFfiBridgeIdentityKeyStoreGetLocalIdentityPrivateKey get_local_identity_private_key; + SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId get_local_registration_id; + SignalFfiBridgeIdentityKeyStoreGetIdentityKey get_identity_key; + SignalFfiBridgeIdentityKeyStoreSaveIdentityKey save_identity_key; + SignalFfiBridgeIdentityKeyStoreIsTrustedIdentity is_trusted_identity; + SignalFfiBridgeIdentityKeyStoreDestroy destroy; +} SignalFfiBridgeIdentityKeyStoreStruct; + +typedef SignalFfiBridgeIdentityKeyStoreStruct SignalIdentityKeyStore; typedef struct { const SignalIdentityKeyStore *raw; @@ -812,22 +816,23 @@ typedef struct { SignalPreKeyRecord *raw; } SignalMutPointerPreKeyRecord; -typedef int (*SignalLoadPreKey)(void *store_ctx, SignalMutPointerPreKeyRecord *recordp, uint32_t id); +typedef int (*SignalFfiBridgePreKeyStoreLoadPreKey)(void *ctx, SignalMutPointerPreKeyRecord *out, uint32_t id); -typedef struct { - const SignalPreKeyRecord *raw; -} SignalConstPointerPreKeyRecord; +typedef int (*SignalFfiBridgePreKeyStoreStorePreKey)(void *ctx, uint32_t id, SignalMutPointerPreKeyRecord record); -typedef int (*SignalStorePreKey)(void *store_ctx, uint32_t id, SignalConstPointerPreKeyRecord record); +typedef int (*SignalFfiBridgePreKeyStoreRemovePreKey)(void *ctx, uint32_t id); -typedef int (*SignalRemovePreKey)(void *store_ctx, uint32_t id); +typedef void (*SignalFfiBridgePreKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalLoadPreKey load_pre_key; - SignalStorePreKey store_pre_key; - SignalRemovePreKey remove_pre_key; -} SignalPreKeyStore; + SignalFfiBridgePreKeyStoreLoadPreKey load_pre_key; + SignalFfiBridgePreKeyStoreStorePreKey store_pre_key; + SignalFfiBridgePreKeyStoreRemovePreKey remove_pre_key; + SignalFfiBridgePreKeyStoreDestroy destroy; +} SignalFfiBridgePreKeyStoreStruct; + +typedef SignalFfiBridgePreKeyStoreStruct SignalPreKeyStore; typedef struct { const SignalPreKeyStore *raw; @@ -837,19 +842,20 @@ typedef struct { SignalSignedPreKeyRecord *raw; } SignalMutPointerSignedPreKeyRecord; -typedef int (*SignalLoadSignedPreKey)(void *store_ctx, SignalMutPointerSignedPreKeyRecord *recordp, uint32_t id); +typedef int (*SignalFfiBridgeSignedPreKeyStoreLoadSignedPreKey)(void *ctx, SignalMutPointerSignedPreKeyRecord *out, uint32_t id); -typedef struct { - const SignalSignedPreKeyRecord *raw; -} SignalConstPointerSignedPreKeyRecord; +typedef int (*SignalFfiBridgeSignedPreKeyStoreStoreSignedPreKey)(void *ctx, uint32_t id, SignalMutPointerSignedPreKeyRecord record); -typedef int (*SignalStoreSignedPreKey)(void *store_ctx, uint32_t id, SignalConstPointerSignedPreKeyRecord record); +typedef void (*SignalFfiBridgeSignedPreKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalLoadSignedPreKey load_signed_pre_key; - SignalStoreSignedPreKey store_signed_pre_key; -} SignalSignedPreKeyStore; + SignalFfiBridgeSignedPreKeyStoreLoadSignedPreKey load_signed_pre_key; + SignalFfiBridgeSignedPreKeyStoreStoreSignedPreKey store_signed_pre_key; + SignalFfiBridgeSignedPreKeyStoreDestroy destroy; +} SignalFfiBridgeSignedPreKeyStoreStruct; + +typedef SignalFfiBridgeSignedPreKeyStoreStruct SignalSignedPreKeyStore; typedef struct { const SignalSignedPreKeyStore *raw; @@ -946,6 +952,10 @@ typedef struct { const SignalFingerprint *raw; } SignalConstPointerFingerprint; +typedef struct { + const SignalPublicKey *raw; +} SignalConstPointerPublicKey; + typedef struct { /** * The badge ID. @@ -987,19 +997,20 @@ typedef struct { SignalSenderKeyRecord *raw; } SignalMutPointerSenderKeyRecord; -typedef int (*SignalLoadSenderKey)(void *store_ctx, SignalMutPointerSenderKeyRecord*, SignalConstPointerProtocolAddress, const uint8_t (*distribution_id)[16]); +typedef int (*SignalFfiBridgeSenderKeyStoreLoadSenderKey)(void *ctx, SignalMutPointerSenderKeyRecord *out, SignalMutPointerProtocolAddress sender, SignalUuid distribution_id); -typedef struct { - const SignalSenderKeyRecord *raw; -} SignalConstPointerSenderKeyRecord; +typedef int (*SignalFfiBridgeSenderKeyStoreStoreSenderKey)(void *ctx, SignalMutPointerProtocolAddress sender, SignalUuid distribution_id, SignalMutPointerSenderKeyRecord record); -typedef int (*SignalStoreSenderKey)(void *store_ctx, SignalConstPointerProtocolAddress, const uint8_t (*distribution_id)[16], SignalConstPointerSenderKeyRecord); +typedef void (*SignalFfiBridgeSenderKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalLoadSenderKey load_sender_key; - SignalStoreSenderKey store_sender_key; -} SignalSenderKeyStore; + SignalFfiBridgeSenderKeyStoreLoadSenderKey load_sender_key; + SignalFfiBridgeSenderKeyStoreStoreSenderKey store_sender_key; + SignalFfiBridgeSenderKeyStoreDestroy destroy; +} SignalFfiBridgeSenderKeyStoreStruct; + +typedef SignalFfiBridgeSenderKeyStoreStruct SignalSenderKeyStore; typedef struct { const SignalSenderKeyStore *raw; @@ -1136,15 +1147,20 @@ typedef struct { const SignalMessageBackupValidationOutcome *raw; } SignalConstPointerMessageBackupValidationOutcome; -typedef int (*SignalRead)(void *ctx, uint8_t *buf, size_t buf_len, size_t *amount_read); +typedef int (*SignalFfiBridgeInputStreamRead)(void *ctx, size_t *out, SignalBorrowedMutableBuffer buf); -typedef int (*SignalSkip)(void *ctx, uint64_t amount); +typedef int (*SignalFfiBridgeInputStreamSkip)(void *ctx, uint64_t amount); + +typedef void (*SignalFfiBridgeInputStreamDestroy)(void *ctx); typedef struct { void *ctx; - SignalRead read; - SignalSkip skip; -} SignalInputStream; + SignalFfiBridgeInputStreamRead read; + SignalFfiBridgeInputStreamSkip skip; + SignalFfiBridgeInputStreamDestroy destroy; +} SignalFfiBridgeInputStreamStruct; + +typedef SignalFfiBridgeInputStreamStruct SignalInputStream; typedef struct { const SignalInputStream *raw; @@ -1182,6 +1198,10 @@ typedef struct { const SignalPreKeyBundle *raw; } SignalConstPointerPreKeyBundle; +typedef struct { + const SignalPreKeyRecord *raw; +} SignalConstPointerPreKeyRecord; + typedef struct { SignalPreKeySignalMessage *raw; } SignalMutPointerPreKeySignalMessage; @@ -1374,6 +1394,10 @@ typedef struct { size_t length; } SignalBorrowedSliceOfConstPointerProtocolAddress; +typedef struct { + const SignalSessionRecord *raw; +} SignalConstPointerSessionRecord; + typedef struct { const SignalConstPointerSessionRecord *base; size_t length; @@ -1452,6 +1476,10 @@ typedef struct { const SignalSenderKeyMessage *raw; } SignalConstPointerSenderKeyMessage; +typedef struct { + const SignalSenderKeyRecord *raw; +} SignalConstPointerSenderKeyRecord; + typedef struct { const SignalServerMessageAck *raw; } SignalConstPointerServerMessageAck; @@ -1468,6 +1496,10 @@ typedef struct { const SignalSgxClientState *raw; } SignalConstPointerSgxClientState; +typedef struct { + const SignalSignedPreKeyRecord *raw; +} SignalConstPointerSignedPreKeyRecord; + typedef struct { SignalTokioAsyncContext *raw; } SignalMutPointerTokioAsyncContext; @@ -1546,7 +1578,9 @@ typedef struct { SignalValidatingMac *raw; } SignalMutPointerValidatingMac; -typedef SignalInputStream SignalSyncInputStream; +typedef SignalFfiBridgeInputStreamStruct SignalFfiBridgeSyncInputStreamStruct; + +typedef SignalFfiBridgeSyncInputStreamStruct SignalSyncInputStream; typedef struct { const SignalSyncInputStream *raw; @@ -2284,8 +2318,6 @@ SignalFfiError *signal_provisioning_chat_connection_init_listener(SignalConstPoi SignalFfiError *signal_publickey_clone(SignalMutPointerPublicKey *new_obj, SignalConstPointerPublicKey obj); -SignalFfiError *signal_publickey_compare(int32_t *out, SignalConstPointerPublicKey key1, SignalConstPointerPublicKey key2); - SignalFfiError *signal_publickey_deserialize(SignalMutPointerPublicKey *out, SignalBorrowedBuffer data); SignalFfiError *signal_publickey_destroy(SignalMutPointerPublicKey p); @@ -2646,6 +2678,8 @@ SignalFfiError *signal_tokio_async_context_destroy(SignalMutPointerTokioAsyncCon SignalFfiError *signal_tokio_async_context_new(SignalMutPointerTokioAsyncContext *out); +SignalFfiError *signal_unauthenticated_chat_connection_account_exists(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, const SignalServiceIdFixedWidthBinaryBytes *account); + SignalFfiError *signal_unauthenticated_chat_connection_connect(SignalCPromiseMutPointerUnauthenticatedChatConnection *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerConnectionManager connection_manager, SignalBorrowedBytestringArray languages); SignalFfiError *signal_unauthenticated_chat_connection_destroy(SignalMutPointerUnauthenticatedChatConnection p); diff --git a/pkg/libsignalgo/prekeystore.go b/pkg/libsignalgo/prekeystore.go index 643e286..ed8ea21 100644 --- a/pkg/libsignalgo/prekeystore.go +++ b/pkg/libsignalgo/prekeystore.go @@ -20,11 +20,10 @@ package libsignalgo /* #include "./libsignal-ffi.h" -typedef const SignalPreKeyRecord const_pre_key_record; - -extern int signal_load_pre_key_callback(void *store_ctx, SignalPreKeyRecord **recordp, uint32_t id); -extern int signal_store_pre_key_callback(void *store_ctx, uint32_t id, const_pre_key_record *record); +extern int signal_load_pre_key_callback(void *store_ctx, SignalMutPointerPreKeyRecord *recordp, uint32_t id); +extern int signal_store_pre_key_callback(void *store_ctx, uint32_t id, SignalMutPointerPreKeyRecord record); extern int signal_remove_pre_key_callback(void *store_ctx, uint32_t id); +extern void signal_destroy_pre_key_store_callback(void *store_ctx); */ import "C" import ( @@ -39,21 +38,21 @@ type PreKeyStore interface { } //export signal_load_pre_key_callback -func signal_load_pre_key_callback(storeCtx unsafe.Pointer, keyp **C.SignalPreKeyRecord, id C.uint32_t) C.int { +func signal_load_pre_key_callback(storeCtx unsafe.Pointer, keyp *C.SignalMutPointerPreKeyRecord, id C.uint32_t) C.int { return wrapStoreCallback(storeCtx, func(store PreKeyStore, ctx context.Context) error { key, err := store.LoadPreKey(ctx, uint32(id)) if err == nil && key != nil { key.CancelFinalizer() - *keyp = key.ptr + keyp.raw = key.ptr } return err }) } //export signal_store_pre_key_callback -func signal_store_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t, preKeyRecord *C.const_pre_key_record) C.int { +func signal_store_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t, preKeyRecord C.SignalMutPointerPreKeyRecord) C.int { return wrapStoreCallback(storeCtx, func(store PreKeyStore, ctx context.Context) error { - record := PreKeyRecord{ptr: (*C.SignalPreKeyRecord)(unsafe.Pointer(preKeyRecord))} + record := PreKeyRecord{ptr: preKeyRecord.raw} cloned, err := record.Clone() if err != nil { return err @@ -69,11 +68,17 @@ func signal_remove_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t) C.in }) } +//export signal_destroy_pre_key_store_callback +func signal_destroy_pre_key_store_callback(storeCtx unsafe.Pointer) { + // No-op: Go's garbage collector handles cleanup +} + func (ctx *CallbackContext) wrapPreKeyStore(store PreKeyStore) C.SignalConstPointerFfiPreKeyStoreStruct { return C.SignalConstPointerFfiPreKeyStoreStruct{&C.SignalPreKeyStore{ ctx: wrapStore(ctx, store), - load_pre_key: C.SignalLoadPreKey(C.signal_load_pre_key_callback), - store_pre_key: C.SignalStorePreKey(C.signal_store_pre_key_callback), - remove_pre_key: C.SignalRemovePreKey(C.signal_remove_pre_key_callback), + load_pre_key: C.SignalFfiBridgePreKeyStoreLoadPreKey(C.signal_load_pre_key_callback), + store_pre_key: C.SignalFfiBridgePreKeyStoreStorePreKey(C.signal_store_pre_key_callback), + remove_pre_key: C.SignalFfiBridgePreKeyStoreRemovePreKey(C.signal_remove_pre_key_callback), + destroy: C.SignalFfiBridgePreKeyStoreDestroy(C.signal_destroy_pre_key_store_callback), }} } diff --git a/pkg/libsignalgo/publickey.go b/pkg/libsignalgo/publickey.go index bd7452e..fdd76e5 100644 --- a/pkg/libsignalgo/publickey.go +++ b/pkg/libsignalgo/publickey.go @@ -84,15 +84,15 @@ func (k *PublicKey) CancelFinalizer() { runtime.SetFinalizer(k, nil) } -func (k *PublicKey) Compare(other *PublicKey) (int, error) { - var comparison C.int - signalFfiError := C.signal_publickey_compare(&comparison, k.constPtr(), other.constPtr()) +func (k *PublicKey) Equal(other *PublicKey) (bool, error) { + var comparison C.bool + signalFfiError := C.signal_publickey_equals(&comparison, k.constPtr(), other.constPtr()) runtime.KeepAlive(k) runtime.KeepAlive(other) if signalFfiError != nil { - return 0, wrapError(signalFfiError) + return false, wrapError(signalFfiError) } - return int(comparison), nil + return bool(comparison), nil } func (k *PublicKey) Bytes() ([]byte, error) { diff --git a/pkg/libsignalgo/senderkeystore.go b/pkg/libsignalgo/senderkeystore.go index 30df4ad..a07a287 100644 --- a/pkg/libsignalgo/senderkeystore.go +++ b/pkg/libsignalgo/senderkeystore.go @@ -20,13 +20,9 @@ package libsignalgo /* #include "./libsignal-ffi.h" -typedef const SignalProtocolAddress const_address; - -typedef const SignalSenderKeyRecord const_sender_key_record; -typedef const uint8_t const_uuid_bytes[16]; - -extern int signal_load_sender_key_callback(void *store_ctx, SignalSenderKeyRecord**, const_address*, const_uuid_bytes*); -extern int signal_store_sender_key_callback(void *store_ctx, const_address*, const_uuid_bytes*, const_sender_key_record*); +extern int signal_load_sender_key_callback(void *store_ctx, SignalMutPointerSenderKeyRecord *out, SignalMutPointerProtocolAddress sender, SignalUuid distribution_id); +extern int signal_store_sender_key_callback(void *store_ctx, SignalMutPointerProtocolAddress sender, SignalUuid distribution_id, SignalMutPointerSenderKeyRecord record); +extern void signal_destroy_sender_key_store_callback(void *store_ctx); */ import "C" import ( @@ -42,36 +38,40 @@ type SenderKeyStore interface { } //export signal_load_sender_key_callback -func signal_load_sender_key_callback(storeCtx unsafe.Pointer, recordp **C.SignalSenderKeyRecord, address *C.const_address, distributionIDBytes *C.const_uuid_bytes) C.int { +func signal_load_sender_key_callback(storeCtx unsafe.Pointer, recordp *C.SignalMutPointerSenderKeyRecord, address C.SignalMutPointerProtocolAddress, distributionID C.SignalUuid) C.int { return wrapStoreCallback(storeCtx, func(store SenderKeyStore, ctx context.Context) error { - distributionID := uuid.UUID(*(*[16]byte)(unsafe.Pointer(distributionIDBytes))) - record, err := store.LoadSenderKey(ctx, &Address{ptr: (*C.SignalProtocolAddress)(unsafe.Pointer(address))}, distributionID) + record, err := store.LoadSenderKey(ctx, &Address{ptr: address.raw}, *(*uuid.UUID)(unsafe.Pointer(&distributionID))) if err == nil && record != nil { record.CancelFinalizer() - *recordp = record.ptr + recordp.raw = record.ptr } return err }) } //export signal_store_sender_key_callback -func signal_store_sender_key_callback(storeCtx unsafe.Pointer, address *C.const_address, distributionIDBytes *C.const_uuid_bytes, senderKeyRecord *C.const_sender_key_record) C.int { +func signal_store_sender_key_callback(storeCtx unsafe.Pointer, address C.SignalMutPointerProtocolAddress, distributionID C.SignalUuid, senderKeyRecord C.SignalMutPointerSenderKeyRecord) C.int { return wrapStoreCallback(storeCtx, func(store SenderKeyStore, ctx context.Context) error { - distributionID := uuid.UUID(*(*[16]byte)(unsafe.Pointer(distributionIDBytes))) - record := SenderKeyRecord{ptr: (*C.SignalSenderKeyRecord)(unsafe.Pointer(senderKeyRecord))} + record := SenderKeyRecord{ptr: senderKeyRecord.raw} cloned, err := record.Clone() if err != nil { return err } - return store.StoreSenderKey(ctx, &Address{ptr: (*C.SignalProtocolAddress)(unsafe.Pointer(address))}, distributionID, cloned) + return store.StoreSenderKey(ctx, &Address{ptr: address.raw}, *(*uuid.UUID)(unsafe.Pointer(&distributionID)), cloned) }) } +//export signal_destroy_sender_key_store_callback +func signal_destroy_sender_key_store_callback(storeCtx unsafe.Pointer) { + // No-op: Go's garbage collector handles cleanup +} + func (ctx *CallbackContext) wrapSenderKeyStore(store SenderKeyStore) C.SignalConstPointerFfiSenderKeyStoreStruct { return C.SignalConstPointerFfiSenderKeyStoreStruct{&C.SignalSenderKeyStore{ ctx: wrapStore(ctx, store), - load_sender_key: C.SignalLoadSenderKey(C.signal_load_sender_key_callback), - store_sender_key: C.SignalStoreSenderKey(C.signal_store_sender_key_callback), + load_sender_key: C.SignalFfiBridgeSenderKeyStoreLoadSenderKey(C.signal_load_sender_key_callback), + store_sender_key: C.SignalFfiBridgeSenderKeyStoreStoreSenderKey(C.signal_store_sender_key_callback), + destroy: C.SignalFfiBridgeSenderKeyStoreDestroy(C.signal_destroy_sender_key_store_callback), }} } diff --git a/pkg/libsignalgo/sessionstore.go b/pkg/libsignalgo/sessionstore.go index da430c1..2515232 100644 --- a/pkg/libsignalgo/sessionstore.go +++ b/pkg/libsignalgo/sessionstore.go @@ -20,11 +20,9 @@ package libsignalgo /* #include "./libsignal-ffi.h" -typedef const SignalSessionRecord const_session_record; -typedef const SignalProtocolAddress const_address; - -extern int signal_load_session_callback(void *store_ctx, SignalSessionRecord **recordp, const_address *address); -extern int signal_store_session_callback(void *store_ctx, const_address *address, const_session_record *record); +extern int signal_load_session_callback(void *store_ctx, SignalMutPointerSessionRecord *recordp, SignalMutPointerProtocolAddress address); +extern int signal_store_session_callback(void *store_ctx, SignalMutPointerProtocolAddress address, SignalMutPointerSessionRecord record); +extern void signal_destroy_session_store_callback(void *store_ctx); */ import "C" import ( @@ -38,33 +36,39 @@ type SessionStore interface { } //export signal_load_session_callback -func signal_load_session_callback(storeCtx unsafe.Pointer, recordp **C.SignalSessionRecord, address *C.const_address) C.int { +func signal_load_session_callback(storeCtx unsafe.Pointer, recordp *C.SignalMutPointerSessionRecord, address C.SignalMutPointerProtocolAddress) C.int { return wrapStoreCallback(storeCtx, func(store SessionStore, ctx context.Context) error { - record, err := store.LoadSession(ctx, &Address{ptr: (*C.SignalProtocolAddress)(unsafe.Pointer(address))}) + record, err := store.LoadSession(ctx, &Address{ptr: address.raw}) if err == nil && record != nil { record.CancelFinalizer() - *recordp = record.ptr + recordp.raw = record.ptr } return err }) } //export signal_store_session_callback -func signal_store_session_callback(storeCtx unsafe.Pointer, address *C.const_address, sessionRecord *C.const_session_record) C.int { +func signal_store_session_callback(storeCtx unsafe.Pointer, address C.SignalMutPointerProtocolAddress, sessionRecord C.SignalMutPointerSessionRecord) C.int { return wrapStoreCallback(storeCtx, func(store SessionStore, ctx context.Context) error { - record := SessionRecord{ptr: (*C.SignalSessionRecord)(unsafe.Pointer(sessionRecord))} + record := SessionRecord{ptr: sessionRecord.raw} cloned, err := record.Clone() if err != nil { return err } - return store.StoreSession(ctx, &Address{ptr: (*C.SignalProtocolAddress)(unsafe.Pointer(address))}, cloned) + return store.StoreSession(ctx, &Address{ptr: address.raw}, cloned) }) } +//export signal_destroy_session_store_callback +func signal_destroy_session_store_callback(storeCtx unsafe.Pointer) { + // No-op: Go's garbage collector handles cleanup +} + func (ctx *CallbackContext) wrapSessionStore(store SessionStore) C.SignalConstPointerFfiSessionStoreStruct { return C.SignalConstPointerFfiSessionStoreStruct{&C.SignalSessionStore{ ctx: wrapStore(ctx, store), - load_session: C.SignalLoadSession(C.signal_load_session_callback), - store_session: C.SignalStoreSession(C.signal_store_session_callback), + load_session: C.SignalFfiBridgeSessionStoreLoadSession(C.signal_load_session_callback), + store_session: C.SignalFfiBridgeSessionStoreStoreSession(C.signal_store_session_callback), + destroy: C.SignalFfiBridgeSessionStoreDestroy(C.signal_destroy_session_store_callback), }} } diff --git a/pkg/libsignalgo/signedprekeystore.go b/pkg/libsignalgo/signedprekeystore.go index b595578..cfb3015 100644 --- a/pkg/libsignalgo/signedprekeystore.go +++ b/pkg/libsignalgo/signedprekeystore.go @@ -20,10 +20,9 @@ package libsignalgo /* #include "./libsignal-ffi.h" -typedef const SignalSignedPreKeyRecord const_signed_pre_key_record; - -extern int signal_load_signed_pre_key_callback(void *store_ctx, SignalSignedPreKeyRecord **recordp, uint32_t id); -extern int signal_store_signed_pre_key_callback(void *store_ctx, uint32_t id, const_signed_pre_key_record *record); +extern int signal_load_signed_pre_key_callback(void *store_ctx, SignalMutPointerSignedPreKeyRecord *recordp, uint32_t id); +extern int signal_store_signed_pre_key_callback(void *store_ctx, uint32_t id, SignalMutPointerSignedPreKeyRecord record); +extern void signal_destroy_signed_pre_key_store_callback(void *store_ctx); */ import "C" import ( @@ -37,21 +36,21 @@ type SignedPreKeyStore interface { } //export signal_load_signed_pre_key_callback -func signal_load_signed_pre_key_callback(storeCtx unsafe.Pointer, keyp **C.SignalSignedPreKeyRecord, id C.uint32_t) C.int { +func signal_load_signed_pre_key_callback(storeCtx unsafe.Pointer, keyp *C.SignalMutPointerSignedPreKeyRecord, id C.uint32_t) C.int { return wrapStoreCallback(storeCtx, func(store SignedPreKeyStore, ctx context.Context) error { key, err := store.LoadSignedPreKey(ctx, uint32(id)) if err == nil && key != nil { key.CancelFinalizer() - *keyp = key.ptr + keyp.raw = key.ptr } return err }) } //export signal_store_signed_pre_key_callback -func signal_store_signed_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t, preKeyRecord *C.const_signed_pre_key_record) C.int { +func signal_store_signed_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t, preKeyRecord C.SignalMutPointerSignedPreKeyRecord) C.int { return wrapStoreCallback(storeCtx, func(store SignedPreKeyStore, ctx context.Context) error { - record := SignedPreKeyRecord{ptr: (*C.SignalSignedPreKeyRecord)(unsafe.Pointer(preKeyRecord))} + record := SignedPreKeyRecord{ptr: preKeyRecord.raw} cloned, err := record.Clone() if err != nil { return err @@ -60,10 +59,16 @@ func signal_store_signed_pre_key_callback(storeCtx unsafe.Pointer, id C.uint32_t }) } +//export signal_destroy_signed_pre_key_store_callback +func signal_destroy_signed_pre_key_store_callback(storeCtx unsafe.Pointer) { + // No-op: Go's garbage collector handles cleanup +} + func (ctx *CallbackContext) wrapSignedPreKeyStore(store SignedPreKeyStore) C.SignalConstPointerFfiSignedPreKeyStoreStruct { return C.SignalConstPointerFfiSignedPreKeyStoreStruct{&C.SignalSignedPreKeyStore{ ctx: wrapStore(ctx, store), - load_signed_pre_key: C.SignalLoadSignedPreKey(C.signal_load_signed_pre_key_callback), - store_signed_pre_key: C.SignalStoreSignedPreKey(C.signal_store_signed_pre_key_callback), + load_signed_pre_key: C.SignalFfiBridgeSignedPreKeyStoreLoadSignedPreKey(C.signal_load_signed_pre_key_callback), + store_signed_pre_key: C.SignalFfiBridgeSignedPreKeyStoreStoreSignedPreKey(C.signal_store_signed_pre_key_callback), + destroy: C.SignalFfiBridgeSignedPreKeyStoreDestroy(C.signal_destroy_signed_pre_key_store_callback), }} } diff --git a/pkg/libsignalgo/update-ffi-docker-inner.sh b/pkg/libsignalgo/update-ffi-docker-inner.sh index 7641701..e343887 100755 --- a/pkg/libsignalgo/update-ffi-docker-inner.sh +++ b/pkg/libsignalgo/update-ffi-docker-inner.sh @@ -1,7 +1,7 @@ #!/bin/sh cd /data export RUSTFLAGS="-Ctarget-feature=-crt-static" RUSTC_WRAPPER="" -apk add --no-cache git make cmake protoc musl-dev g++ clang-dev cbindgen +apk add --no-cache git make cmake protobuf-dev musl-dev g++ clang-dev cbindgen cd libsignal cargo build -p libsignal-ffi --release cbindgen --profile release rust/bridge/ffi -o libsignal-ffi.h diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index fddfaa8..8f445ad 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.86.12" +const Version = "v0.87.1" From eb955598253755732e0de57880f535ad6bfdd922 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 9 Feb 2026 14:13:18 +0200 Subject: [PATCH 109/170] signalmeow: update protobufs --- pkg/signalmeow/groups.go | 94 +- .../protobuf/ContactDiscovery.pb.go | 4 +- pkg/signalmeow/protobuf/DeviceName.pb.go | 4 +- pkg/signalmeow/protobuf/Groups.pb.go | 1857 ++++++++-------- pkg/signalmeow/protobuf/Groups.proto | 325 +-- pkg/signalmeow/protobuf/Provisioning.pb.go | 4 +- pkg/signalmeow/protobuf/SignalService.pb.go | 1147 ++++++---- pkg/signalmeow/protobuf/SignalService.proto | 46 +- .../protobuf/StickerResources.pb.go | 4 +- pkg/signalmeow/protobuf/StorageService.pb.go | 129 +- pkg/signalmeow/protobuf/StorageService.proto | 29 +- .../protobuf/UnidentifiedDelivery.pb.go | 4 +- .../protobuf/WebSocketResources.pb.go | 4 +- pkg/signalmeow/protobuf/backuppb/Backup.pb.go | 1897 ++++++++++++----- pkg/signalmeow/protobuf/backuppb/Backup.proto | 78 + pkg/signalmeow/protobuf/update-protos.sh | 6 +- 16 files changed, 3547 insertions(+), 2085 deletions(-) diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index d956fcc..dcdfe7d 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -106,8 +106,8 @@ func (group *Group) GetInviteLink() (string, error) { if err != nil { return "", fmt.Errorf("couldn't decode invite link password") } - inviteLinkContents := signalpb.GroupInviteLink_V1Contents{ - V1Contents: &signalpb.GroupInviteLink_GroupInviteLinkContentsV1{ + inviteLinkContents := signalpb.GroupInviteLink_ContentsV1{ + ContentsV1: &signalpb.GroupInviteLink_GroupInviteLinkContentsV1{ GroupMasterKey: masterKeyBytes[:], InviteLinkPassword: inviteLinkPasswordBytes, }, @@ -471,7 +471,7 @@ func decryptGroup(ctx context.Context, encryptedGroup *signalpb.Group, groupMast descriptionBlob, err := decryptGroupPropertyIntoBlob(groupSecretParams, encryptedGroup.Description) if err == nil { // treat a failure in obtaining the description as non-fatal - decryptedGroup.Description = cleanupStringProperty(descriptionBlob.GetDescription()) + decryptedGroup.Description = cleanupStringProperty(descriptionBlob.GetDescriptionText()) } if encryptedGroup.DisappearingMessagesTimer != nil && len(encryptedGroup.DisappearingMessagesTimer) > 0 { @@ -483,8 +483,8 @@ func decryptGroup(ctx context.Context, encryptedGroup *signalpb.Group, groupMast } // These aren't encrypted - decryptedGroup.AvatarPath = encryptedGroup.Avatar - decryptedGroup.Revision = encryptedGroup.Revision + decryptedGroup.AvatarPath = encryptedGroup.AvatarUrl + decryptedGroup.Revision = encryptedGroup.Version // Decrypt members for _, member := range encryptedGroup.Members { @@ -498,7 +498,7 @@ func decryptGroup(ctx context.Context, encryptedGroup *signalpb.Group, groupMast decryptedGroup.Members = append(decryptedGroup.Members, decryptedMember) } - for _, pendingMember := range encryptedGroup.PendingMembers { + for _, pendingMember := range encryptedGroup.MembersPendingProfileKey { if pendingMember == nil { continue } @@ -510,7 +510,7 @@ func decryptGroup(ctx context.Context, encryptedGroup *signalpb.Group, groupMast decryptedGroup.PendingMembers = append(decryptedGroup.PendingMembers, decryptedPendingMember) } - for _, requestingMember := range encryptedGroup.RequestingMembers { + for _, requestingMember := range encryptedGroup.MembersPendingAdminApproval { if requestingMember == nil { continue } @@ -521,7 +521,7 @@ func decryptGroup(ctx context.Context, encryptedGroup *signalpb.Group, groupMast decryptedGroup.RequestingMembers = append(decryptedGroup.RequestingMembers, decryptedRequestingMember) } - for _, bannedMember := range encryptedGroup.BannedMembers { + for _, bannedMember := range encryptedGroup.MembersBanned { if bannedMember == nil { continue } @@ -789,14 +789,14 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange return nil, err } - sourceServiceID, err := groupSecretParams.DecryptServiceID(libsignalgo.UUIDCiphertext(encryptedActions.SourceServiceId)) + sourceServiceID, err := groupSecretParams.DecryptServiceID(libsignalgo.UUIDCiphertext(encryptedActions.SourceUserId)) if err != nil { log.Err(err).Msg("Couldn't decrypt source serviceID") return nil, err } decryptedGroupChange := &GroupChange{ GroupMasterKey: groupMasterKey, - Revision: encryptedActions.Revision, + Revision: encryptedActions.Version, SourceServiceID: sourceServiceID, } @@ -816,7 +816,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange descriptionBlob, err := decryptGroupPropertyIntoBlob(groupSecretParams, encryptedActions.ModifyDescription.Description) if err == nil { // treat a failure in obtaining the description as non-fatal - newDescription := cleanupStringProperty(descriptionBlob.GetDescription()) + newDescription := cleanupStringProperty(descriptionBlob.GetDescriptionText()) decryptedGroupChange.ModifyDescription = &newDescription } } @@ -891,7 +891,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange } } - for _, addPendingMember := range encryptedActions.AddPendingMembers { + for _, addPendingMember := range encryptedActions.AddMembersPendingProfileKey { if addPendingMember == nil { continue } @@ -904,7 +904,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange decryptedGroupChange.AddPendingMembers = append(decryptedGroupChange.AddPendingMembers, decryptedPendingMember) } - for _, deletePendingMember := range encryptedActions.DeletePendingMembers { + for _, deletePendingMember := range encryptedActions.DeleteMembersPendingProfileKey { if deletePendingMember == nil { continue } @@ -917,7 +917,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange decryptedGroupChange.DeletePendingMembers = append(decryptedGroupChange.DeletePendingMembers, &userID) } - for _, promotePendingMember := range encryptedActions.PromotePendingMembers { + for _, promotePendingMember := range encryptedActions.PromoteMembersPendingProfileKey { if promotePendingMember == nil { continue } @@ -936,7 +936,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange } } - for _, promotePendingPniAciMember := range encryptedActions.PromotePendingPniAciMembers { + for _, promotePendingPniAciMember := range encryptedActions.PromoteMembersPendingPniAciProfileKey { // TODO: pretending this is a PendingMember should do for mautrix-signal, but we probably want to treat them separately at some point if promotePendingPniAciMember == nil { continue @@ -966,7 +966,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange } } - for _, addRequestingMember := range encryptedActions.AddRequestingMembers { + for _, addRequestingMember := range encryptedActions.AddMembersPendingAdminApproval { if addRequestingMember == nil { continue } @@ -982,7 +982,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange } } - for _, deleteRequestingMember := range encryptedActions.DeleteRequestingMembers { + for _, deleteRequestingMember := range encryptedActions.DeleteMembersPendingAdminApproval { if deleteRequestingMember == nil { continue } @@ -995,7 +995,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange decryptedGroupChange.DeleteRequestingMembers = append(decryptedGroupChange.DeleteRequestingMembers, &serviceID.UUID) } - for _, promoteRequestingMember := range encryptedActions.PromoteRequestingMembers { + for _, promoteRequestingMember := range encryptedActions.PromoteMembersPendingAdminApproval { if promoteRequestingMember == nil { continue } @@ -1011,7 +1011,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange }) } - for _, addBannedMember := range encryptedActions.AddBannedMembers { + for _, addBannedMember := range encryptedActions.AddMembersBanned { if addBannedMember == nil { continue } @@ -1028,7 +1028,7 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange }) } - for _, deleteBannedMember := range encryptedActions.DeleteBannedMembers { + for _, deleteBannedMember := range encryptedActions.DeleteMembersBanned { if deleteBannedMember == nil { continue } @@ -1056,8 +1056,8 @@ func (cli *Client) decryptGroupChange(ctx context.Context, encryptedGroupChange if encryptedActions.ModifyAnnouncementsOnly != nil { decryptedGroupChange.ModifyAnnouncementsOnly = &encryptedActions.ModifyAnnouncementsOnly.AnnouncementsOnly } - if encryptedActions.ModifyDisappearingMessagesTimer != nil && len(encryptedActions.ModifyDisappearingMessagesTimer.Timer) > 0 { - timerBlob, err := decryptGroupPropertyIntoBlob(groupSecretParams, encryptedActions.ModifyDisappearingMessagesTimer.Timer) + if encryptedActions.ModifyDisappearingMessageTimer != nil && len(encryptedActions.ModifyDisappearingMessageTimer.Timer) > 0 { + timerBlob, err := decryptGroupPropertyIntoBlob(groupSecretParams, encryptedActions.ModifyDisappearingMessageTimer.Timer) if err != nil { return nil, err } @@ -1128,11 +1128,11 @@ func decryptMember(ctx context.Context, member *signalpb.Member, groupSecretPara ACI: *aci, ProfileKey: *profileKey, Role: GroupMemberRole(member.Role), - JoinedAtRevision: member.JoinedAtRevision, + JoinedAtRevision: member.JoinedAtVersion, }, nil } -func decryptPendingMember(ctx context.Context, pendingMember *signalpb.PendingMember, groupSecretParams libsignalgo.GroupSecretParams) (*PendingMember, error) { +func decryptPendingMember(ctx context.Context, pendingMember *signalpb.MemberPendingProfileKey, groupSecretParams libsignalgo.GroupSecretParams) (*PendingMember, error) { log := zerolog.Ctx(ctx) encryptedUserID := libsignalgo.UUIDCiphertext(pendingMember.Member.UserId) userID, err := groupSecretParams.DecryptServiceID(encryptedUserID) @@ -1155,7 +1155,7 @@ func decryptPendingMember(ctx context.Context, pendingMember *signalpb.PendingMe }, nil } -func decryptRequestingMember(ctx context.Context, requestingMember *signalpb.RequestingMember, groupSecretParams libsignalgo.GroupSecretParams) (*RequestingMember, error) { +func decryptRequestingMember(ctx context.Context, requestingMember *signalpb.MemberPendingAdminApproval, groupSecretParams libsignalgo.GroupSecretParams) (*RequestingMember, error) { aci, profileKey, err := decryptPKeyAndIDorPresentation(ctx, requestingMember.UserId, requestingMember.ProfileKey, requestingMember.Presentation, groupSecretParams) if err != nil { return nil, err @@ -1176,7 +1176,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("Could not get groupSecretParams from master key") return nil, err } - groupChangeActions := &signalpb.GroupChange_Actions{Revision: decryptedGroupChange.Revision} + groupChangeActions := &signalpb.GroupChange_Actions{Version: decryptedGroupChange.Revision} if decryptedGroupChange.ModifyTitle != nil { attributeBlob := signalpb.GroupAttributeBlob{Content: &signalpb.GroupAttributeBlob_Title{Title: *decryptedGroupChange.ModifyTitle}} encryptedTitle, err := encryptBlobIntoGroupProperty(groupSecretParams, &attributeBlob) @@ -1187,7 +1187,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup groupChangeActions.ModifyTitle = &signalpb.GroupChange_Actions_ModifyTitleAction{Title: *encryptedTitle} } if decryptedGroupChange.ModifyDescription != nil { - attributeBlob := signalpb.GroupAttributeBlob{Content: &signalpb.GroupAttributeBlob_Description{Description: *decryptedGroupChange.ModifyDescription}} + attributeBlob := signalpb.GroupAttributeBlob{Content: &signalpb.GroupAttributeBlob_DescriptionText{DescriptionText: *decryptedGroupChange.ModifyDescription}} encryptedDescription, err := encryptBlobIntoGroupProperty(groupSecretParams, &attributeBlob) if err != nil { log.Err(err).Msg("Could not get encrypt description") @@ -1209,7 +1209,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup JoinFromInviteLink: addMember.JoinFromInviteLink, }) } else { - groupChangeActions.AddPendingMembers = append(groupChangeActions.AddPendingMembers, &signalpb.GroupChange_Actions_AddPendingMemberAction{ + groupChangeActions.AddMembersPendingProfileKey = append(groupChangeActions.AddMembersPendingProfileKey, &signalpb.GroupChange_Actions_AddMemberPendingProfileKeyAction{ Added: encryptedPendingMember, }) } @@ -1241,7 +1241,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("Failed to encrypt pendingMember") return nil, err } - groupChangeActions.AddPendingMembers = append(groupChangeActions.AddPendingMembers, &signalpb.GroupChange_Actions_AddPendingMemberAction{ + groupChangeActions.AddMembersPendingProfileKey = append(groupChangeActions.AddMembersPendingProfileKey, &signalpb.GroupChange_Actions_AddMemberPendingProfileKeyAction{ Added: encryptedPendingMember, }) } @@ -1251,7 +1251,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("Encrypt UserId error for deletePendingMember") return nil, err } - groupChangeActions.DeletePendingMembers = append(groupChangeActions.DeletePendingMembers, &signalpb.GroupChange_Actions_DeletePendingMemberAction{ + groupChangeActions.DeleteMembersPendingProfileKey = append(groupChangeActions.DeleteMembersPendingProfileKey, &signalpb.GroupChange_Actions_DeleteMemberPendingProfileKeyAction{ DeletedUserId: encryptedUserID[:], }) } @@ -1269,7 +1269,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("failed creating expiring profile key credential presentation for addMember") return nil, err } - groupChangeActions.PromotePendingMembers = append(groupChangeActions.PromotePendingMembers, &signalpb.GroupChange_Actions_PromotePendingMemberAction{ + groupChangeActions.PromoteMembersPendingProfileKey = append(groupChangeActions.PromoteMembersPendingProfileKey, &signalpb.GroupChange_Actions_PromoteMemberPendingProfileKeyAction{ Presentation: *presentation, }) } @@ -1287,8 +1287,8 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("failed creating expiring profile key credential presentation for addMember") return nil, err } - groupChangeActions.AddRequestingMembers = append(groupChangeActions.AddRequestingMembers, &signalpb.GroupChange_Actions_AddRequestingMemberAction{ - Added: &signalpb.RequestingMember{ + groupChangeActions.AddMembersPendingAdminApproval = append(groupChangeActions.AddMembersPendingAdminApproval, &signalpb.GroupChange_Actions_AddMemberPendingAdminApprovalAction{ + Added: &signalpb.MemberPendingAdminApproval{ Presentation: *presentation, }, }) @@ -1299,7 +1299,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("Encrypt UserId error for deleteRequestingMember") return nil, err } - groupChangeActions.DeleteRequestingMembers = append(groupChangeActions.DeleteRequestingMembers, &signalpb.GroupChange_Actions_DeleteRequestingMemberAction{ + groupChangeActions.DeleteMembersPendingAdminApproval = append(groupChangeActions.DeleteMembersPendingAdminApproval, &signalpb.GroupChange_Actions_DeleteMemberPendingAdminApprovalAction{ DeletedUserId: encryptedUserID[:], }) } @@ -1310,7 +1310,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup return nil, err } - groupChangeActions.PromoteRequestingMembers = append(groupChangeActions.PromoteRequestingMembers, &signalpb.GroupChange_Actions_PromoteRequestingMemberAction{ + groupChangeActions.PromoteMembersPendingAdminApproval = append(groupChangeActions.PromoteMembersPendingAdminApproval, &signalpb.GroupChange_Actions_PromoteMemberPendingAdminApprovalAction{ UserId: encryptedUserID[:], Role: signalpb.Member_Role(promoteRequestingMember.Role), }) @@ -1321,8 +1321,8 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("Encrypt UserId error for promoteRequestingMember") return nil, err } - groupChangeActions.AddBannedMembers = append(groupChangeActions.AddBannedMembers, &signalpb.GroupChange_Actions_AddBannedMemberAction{ - Added: &signalpb.BannedMember{ + groupChangeActions.AddMembersBanned = append(groupChangeActions.AddMembersBanned, &signalpb.GroupChange_Actions_AddMemberBannedAction{ + Added: &signalpb.MemberBanned{ UserId: encryptedUserID[:], Timestamp: addBannedMember.Timestamp, }, @@ -1334,7 +1334,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("Encrypt UserId error for promoteRequestingMember") return nil, err } - groupChangeActions.DeleteBannedMembers = append(groupChangeActions.DeleteBannedMembers, &signalpb.GroupChange_Actions_DeleteBannedMemberAction{ + groupChangeActions.DeleteMembersBanned = append(groupChangeActions.DeleteMembersBanned, &signalpb.GroupChange_Actions_DeleteMemberBannedAction{ DeletedUserId: encryptedUserID[:], }) } @@ -1365,7 +1365,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup log.Err(err).Msg("Could not get encrypt Title") return nil, err } - groupChangeActions.ModifyDisappearingMessagesTimer = &signalpb.GroupChange_Actions_ModifyDisappearingMessagesTimerAction{Timer: *encryptedTimer} + groupChangeActions.ModifyDisappearingMessageTimer = &signalpb.GroupChange_Actions_ModifyDisappearingMessageTimerAction{Timer: *encryptedTimer} } if decryptedGroupChange.ModifyInviteLinkPassword != nil { inviteLinkPasswordBytes, err := inviteLinkPasswordToBytes(*decryptedGroupChange.ModifyInviteLinkPassword) @@ -1380,7 +1380,7 @@ func (cli *Client) EncryptAndSignGroupChange(ctx context.Context, decryptedGroup return cli.patchGroup(ctx, groupChangeActions, groupMasterKey, nil) } -func (cli *Client) encryptMember(ctx context.Context, member *GroupMember, groupSecretParams *libsignalgo.GroupSecretParams) (*signalpb.Member, *signalpb.PendingMember, error) { +func (cli *Client) encryptMember(ctx context.Context, member *GroupMember, groupSecretParams *libsignalgo.GroupSecretParams) (*signalpb.Member, *signalpb.MemberPendingProfileKey, error) { log := zerolog.Ctx(ctx) expiringProfileKeyCredential, err := cli.FetchExpiringProfileKeyCredentialById(ctx, member.ACI) if err != nil { @@ -1408,7 +1408,7 @@ func (cli *Client) encryptMember(ctx context.Context, member *GroupMember, group return &encryptedMember, nil, nil } -func (cli *Client) encryptPendingMember(ctx context.Context, pendingMember *PendingMember, groupSecretParams *libsignalgo.GroupSecretParams) (*signalpb.PendingMember, error) { +func (cli *Client) encryptPendingMember(ctx context.Context, pendingMember *PendingMember, groupSecretParams *libsignalgo.GroupSecretParams) (*signalpb.MemberPendingProfileKey, error) { log := zerolog.Ctx(ctx) encryptedUserID, err := groupSecretParams.EncryptServiceID(pendingMember.ServiceID) if err != nil { @@ -1420,7 +1420,7 @@ func (cli *Client) encryptPendingMember(ctx context.Context, pendingMember *Pend log.Err(err).Msg("Encrypt AddedByUserId error for addPendingMember") return nil, err } - encryptedPendingMember := signalpb.PendingMember{ + encryptedPendingMember := signalpb.MemberPendingProfileKey{ AddedByUserId: encryptedAddedByUserID[:], Member: &signalpb.Member{ UserId: encryptedUserID[:], @@ -1600,12 +1600,12 @@ func (cli *Client) EncryptGroup(ctx context.Context, decryptedGroup *Group, grou encryptedGroup := &signalpb.Group{ PublicKey: groupPublicParams[:], Title: *encryptedTitle, - Avatar: decryptedGroup.AvatarPath, + AvatarUrl: decryptedGroup.AvatarPath, AnnouncementsOnly: decryptedGroup.AnnouncementsOnly, - Revision: 0, + Version: 0, } if decryptedGroup.Description != "" { - attributeBlob := signalpb.GroupAttributeBlob{Content: &signalpb.GroupAttributeBlob_Description{Description: decryptedGroup.Description}} + attributeBlob := signalpb.GroupAttributeBlob{Content: &signalpb.GroupAttributeBlob_DescriptionText{DescriptionText: decryptedGroup.Description}} encryptedDescription, err := encryptBlobIntoGroupProperty(groupSecretParams, &attributeBlob) if err != nil { log.Err(err).Msg("Could not get encrypt Description") @@ -1631,7 +1631,7 @@ func (cli *Client) EncryptGroup(ctx context.Context, decryptedGroup *Group, grou if encryptedMember != nil { encryptedGroup.Members = append(encryptedGroup.Members, encryptedMember) } else { - encryptedGroup.PendingMembers = append(encryptedGroup.PendingMembers, encryptedPendingMember) + encryptedGroup.MembersPendingProfileKey = append(encryptedGroup.MembersPendingProfileKey, encryptedPendingMember) } } for _, pendingMember := range decryptedGroup.PendingMembers { @@ -1640,7 +1640,7 @@ func (cli *Client) EncryptGroup(ctx context.Context, decryptedGroup *Group, grou log.Err(err).Msg("Failed to encrypt pendingMember") return nil, err } - encryptedGroup.PendingMembers = append(encryptedGroup.PendingMembers, encryptedPendingMember) + encryptedGroup.MembersPendingProfileKey = append(encryptedGroup.MembersPendingProfileKey, encryptedPendingMember) } return encryptedGroup, nil } diff --git a/pkg/signalmeow/protobuf/ContactDiscovery.pb.go b/pkg/signalmeow/protobuf/ContactDiscovery.pb.go index 5523a0e..637a2d2 100644 --- a/pkg/signalmeow/protobuf/ContactDiscovery.pb.go +++ b/pkg/signalmeow/protobuf/ContactDiscovery.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: ContactDiscovery.proto // Copyright 2021 Signal Messenger, LLC diff --git a/pkg/signalmeow/protobuf/DeviceName.pb.go b/pkg/signalmeow/protobuf/DeviceName.pb.go index 144428d..5666b7e 100644 --- a/pkg/signalmeow/protobuf/DeviceName.pb.go +++ b/pkg/signalmeow/protobuf/DeviceName.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: DeviceName.proto // Copyright 2018 Signal Messenger, LLC diff --git a/pkg/signalmeow/protobuf/Groups.pb.go b/pkg/signalmeow/protobuf/Groups.pb.go index 3e5cc7a..c7717ff 100644 --- a/pkg/signalmeow/protobuf/Groups.pb.go +++ b/pkg/signalmeow/protobuf/Groups.pb.go @@ -1,12 +1,11 @@ -//* -// Copyright (C) 2019 Open Whisper Systems // -// Licensed according to the LICENSE file in this repository. +// Copyright 2020 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: Groups.proto package signalpb @@ -223,14 +222,16 @@ func (x *AvatarUploadAttributes) GetSignature() string { } type Member struct { - state protoimpl.MessageState `protogen:"open.v1"` - UserId []byte `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` - Role Member_Role `protobuf:"varint,2,opt,name=role,proto3,enum=Member_Role" json:"role,omitempty"` - ProfileKey []byte `protobuf:"bytes,3,opt,name=profileKey,proto3" json:"profileKey,omitempty"` - Presentation []byte `protobuf:"bytes,4,opt,name=presentation,proto3" json:"presentation,omitempty"` // Only set when sending to server - JoinedAtRevision uint32 `protobuf:"varint,5,opt,name=joinedAtRevision,proto3" json:"joinedAtRevision,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserId []byte `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` + Role Member_Role `protobuf:"varint,2,opt,name=role,proto3,enum=signal.Member_Role" json:"role,omitempty"` + ProfileKey []byte `protobuf:"bytes,3,opt,name=profileKey,proto3" json:"profileKey,omitempty"` + Presentation []byte `protobuf:"bytes,4,opt,name=presentation,proto3" json:"presentation,omitempty"` + JoinedAtVersion uint32 `protobuf:"varint,5,opt,name=joinedAtVersion,proto3" json:"joinedAtVersion,omitempty"` + LabelEmoji []byte `protobuf:"bytes,6,opt,name=labelEmoji,proto3" json:"labelEmoji,omitempty"` // decrypts to a UTF-8 string + LabelString []byte `protobuf:"bytes,7,opt,name=labelString,proto3" json:"labelString,omitempty"` // decrypts to a UTF-8 string + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Member) Reset() { @@ -291,36 +292,50 @@ func (x *Member) GetPresentation() []byte { return nil } -func (x *Member) GetJoinedAtRevision() uint32 { +func (x *Member) GetJoinedAtVersion() uint32 { if x != nil { - return x.JoinedAtRevision + return x.JoinedAtVersion } return 0 } -type PendingMember struct { +func (x *Member) GetLabelEmoji() []byte { + if x != nil { + return x.LabelEmoji + } + return nil +} + +func (x *Member) GetLabelString() []byte { + if x != nil { + return x.LabelString + } + return nil +} + +type MemberPendingProfileKey struct { state protoimpl.MessageState `protogen:"open.v1"` Member *Member `protobuf:"bytes,1,opt,name=member,proto3" json:"member,omitempty"` AddedByUserId []byte `protobuf:"bytes,2,opt,name=addedByUserId,proto3" json:"addedByUserId,omitempty"` - Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *PendingMember) Reset() { - *x = PendingMember{} +func (x *MemberPendingProfileKey) Reset() { + *x = MemberPendingProfileKey{} mi := &file_Groups_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *PendingMember) String() string { +func (x *MemberPendingProfileKey) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PendingMember) ProtoMessage() {} +func (*MemberPendingProfileKey) ProtoMessage() {} -func (x *PendingMember) ProtoReflect() protoreflect.Message { +func (x *MemberPendingProfileKey) ProtoReflect() protoreflect.Message { mi := &file_Groups_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -332,56 +347,56 @@ func (x *PendingMember) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PendingMember.ProtoReflect.Descriptor instead. -func (*PendingMember) Descriptor() ([]byte, []int) { +// Deprecated: Use MemberPendingProfileKey.ProtoReflect.Descriptor instead. +func (*MemberPendingProfileKey) Descriptor() ([]byte, []int) { return file_Groups_proto_rawDescGZIP(), []int{2} } -func (x *PendingMember) GetMember() *Member { +func (x *MemberPendingProfileKey) GetMember() *Member { if x != nil { return x.Member } return nil } -func (x *PendingMember) GetAddedByUserId() []byte { +func (x *MemberPendingProfileKey) GetAddedByUserId() []byte { if x != nil { return x.AddedByUserId } return nil } -func (x *PendingMember) GetTimestamp() uint64 { +func (x *MemberPendingProfileKey) GetTimestamp() uint64 { if x != nil { return x.Timestamp } return 0 } -type RequestingMember struct { +type MemberPendingAdminApproval struct { state protoimpl.MessageState `protogen:"open.v1"` UserId []byte `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` ProfileKey []byte `protobuf:"bytes,2,opt,name=profileKey,proto3" json:"profileKey,omitempty"` - Presentation []byte `protobuf:"bytes,3,opt,name=presentation,proto3" json:"presentation,omitempty"` // Only set when sending to server - Timestamp uint64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Presentation []byte `protobuf:"bytes,3,opt,name=presentation,proto3" json:"presentation,omitempty"` + Timestamp uint64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *RequestingMember) Reset() { - *x = RequestingMember{} +func (x *MemberPendingAdminApproval) Reset() { + *x = MemberPendingAdminApproval{} mi := &file_Groups_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *RequestingMember) String() string { +func (x *MemberPendingAdminApproval) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RequestingMember) ProtoMessage() {} +func (*MemberPendingAdminApproval) ProtoMessage() {} -func (x *RequestingMember) ProtoReflect() protoreflect.Message { +func (x *MemberPendingAdminApproval) ProtoReflect() protoreflect.Message { mi := &file_Groups_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -393,61 +408,61 @@ func (x *RequestingMember) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RequestingMember.ProtoReflect.Descriptor instead. -func (*RequestingMember) Descriptor() ([]byte, []int) { +// Deprecated: Use MemberPendingAdminApproval.ProtoReflect.Descriptor instead. +func (*MemberPendingAdminApproval) Descriptor() ([]byte, []int) { return file_Groups_proto_rawDescGZIP(), []int{3} } -func (x *RequestingMember) GetUserId() []byte { +func (x *MemberPendingAdminApproval) GetUserId() []byte { if x != nil { return x.UserId } return nil } -func (x *RequestingMember) GetProfileKey() []byte { +func (x *MemberPendingAdminApproval) GetProfileKey() []byte { if x != nil { return x.ProfileKey } return nil } -func (x *RequestingMember) GetPresentation() []byte { +func (x *MemberPendingAdminApproval) GetPresentation() []byte { if x != nil { return x.Presentation } return nil } -func (x *RequestingMember) GetTimestamp() uint64 { +func (x *MemberPendingAdminApproval) GetTimestamp() uint64 { if x != nil { return x.Timestamp } return 0 } -type BannedMember struct { +type MemberBanned struct { state protoimpl.MessageState `protogen:"open.v1"` UserId []byte `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` - Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *BannedMember) Reset() { - *x = BannedMember{} +func (x *MemberBanned) Reset() { + *x = MemberBanned{} mi := &file_Groups_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *BannedMember) String() string { +func (x *MemberBanned) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BannedMember) ProtoMessage() {} +func (*MemberBanned) ProtoMessage() {} -func (x *BannedMember) ProtoReflect() protoreflect.Message { +func (x *MemberBanned) ProtoReflect() protoreflect.Message { mi := &file_Groups_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -459,19 +474,19 @@ func (x *BannedMember) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BannedMember.ProtoReflect.Descriptor instead. -func (*BannedMember) Descriptor() ([]byte, []int) { +// Deprecated: Use MemberBanned.ProtoReflect.Descriptor instead. +func (*MemberBanned) Descriptor() ([]byte, []int) { return file_Groups_proto_rawDescGZIP(), []int{4} } -func (x *BannedMember) GetUserId() []byte { +func (x *MemberBanned) GetUserId() []byte { if x != nil { return x.UserId } return nil } -func (x *BannedMember) GetTimestamp() uint64 { +func (x *MemberBanned) GetTimestamp() uint64 { if x != nil { return x.Timestamp } @@ -480,9 +495,9 @@ func (x *BannedMember) GetTimestamp() uint64 { type AccessControl struct { state protoimpl.MessageState `protogen:"open.v1"` - Attributes AccessControl_AccessRequired `protobuf:"varint,1,opt,name=attributes,proto3,enum=AccessControl_AccessRequired" json:"attributes,omitempty"` - Members AccessControl_AccessRequired `protobuf:"varint,2,opt,name=members,proto3,enum=AccessControl_AccessRequired" json:"members,omitempty"` - AddFromInviteLink AccessControl_AccessRequired `protobuf:"varint,3,opt,name=addFromInviteLink,proto3,enum=AccessControl_AccessRequired" json:"addFromInviteLink,omitempty"` + Attributes AccessControl_AccessRequired `protobuf:"varint,1,opt,name=attributes,proto3,enum=signal.AccessControl_AccessRequired" json:"attributes,omitempty"` + Members AccessControl_AccessRequired `protobuf:"varint,2,opt,name=members,proto3,enum=signal.AccessControl_AccessRequired" json:"members,omitempty"` + AddFromInviteLink AccessControl_AccessRequired `protobuf:"varint,3,opt,name=addFromInviteLink,proto3,enum=signal.AccessControl_AccessRequired" json:"addFromInviteLink,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -539,22 +554,24 @@ func (x *AccessControl) GetAddFromInviteLink() AccessControl_AccessRequired { } type Group struct { - state protoimpl.MessageState `protogen:"open.v1"` - PublicKey []byte `protobuf:"bytes,1,opt,name=publicKey,proto3" json:"publicKey,omitempty"` - Title []byte `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` - Avatar string `protobuf:"bytes,3,opt,name=avatar,proto3" json:"avatar,omitempty"` - DisappearingMessagesTimer []byte `protobuf:"bytes,4,opt,name=disappearingMessagesTimer,proto3" json:"disappearingMessagesTimer,omitempty"` - AccessControl *AccessControl `protobuf:"bytes,5,opt,name=accessControl,proto3" json:"accessControl,omitempty"` - Revision uint32 `protobuf:"varint,6,opt,name=revision,proto3" json:"revision,omitempty"` - Members []*Member `protobuf:"bytes,7,rep,name=members,proto3" json:"members,omitempty"` - PendingMembers []*PendingMember `protobuf:"bytes,8,rep,name=pendingMembers,proto3" json:"pendingMembers,omitempty"` - RequestingMembers []*RequestingMember `protobuf:"bytes,9,rep,name=requestingMembers,proto3" json:"requestingMembers,omitempty"` - InviteLinkPassword []byte `protobuf:"bytes,10,opt,name=inviteLinkPassword,proto3" json:"inviteLinkPassword,omitempty"` - Description []byte `protobuf:"bytes,11,opt,name=description,proto3" json:"description,omitempty"` - AnnouncementsOnly bool `protobuf:"varint,12,opt,name=announcementsOnly,proto3" json:"announcementsOnly,omitempty"` - BannedMembers []*BannedMember `protobuf:"bytes,13,rep,name=bannedMembers,proto3" json:"bannedMembers,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PublicKey []byte `protobuf:"bytes,1,opt,name=publicKey,proto3" json:"publicKey,omitempty"` + Title []byte `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Description []byte `protobuf:"bytes,11,opt,name=description,proto3" json:"description,omitempty"` + // The URL for this group's avatar. The content at this URL can be + // decrypted/deserialized into a `GroupAttributeBlob`. + AvatarUrl string `protobuf:"bytes,3,opt,name=avatarUrl,proto3" json:"avatarUrl,omitempty"` + DisappearingMessagesTimer []byte `protobuf:"bytes,4,opt,name=disappearingMessagesTimer,proto3" json:"disappearingMessagesTimer,omitempty"` + AccessControl *AccessControl `protobuf:"bytes,5,opt,name=accessControl,proto3" json:"accessControl,omitempty"` + Version uint32 `protobuf:"varint,6,opt,name=version,proto3" json:"version,omitempty"` + Members []*Member `protobuf:"bytes,7,rep,name=members,proto3" json:"members,omitempty"` + MembersPendingProfileKey []*MemberPendingProfileKey `protobuf:"bytes,8,rep,name=membersPendingProfileKey,proto3" json:"membersPendingProfileKey,omitempty"` + MembersPendingAdminApproval []*MemberPendingAdminApproval `protobuf:"bytes,9,rep,name=membersPendingAdminApproval,proto3" json:"membersPendingAdminApproval,omitempty"` + InviteLinkPassword []byte `protobuf:"bytes,10,opt,name=inviteLinkPassword,proto3" json:"inviteLinkPassword,omitempty"` + AnnouncementsOnly bool `protobuf:"varint,12,opt,name=announcements_only,json=announcementsOnly,proto3" json:"announcements_only,omitempty"` + MembersBanned []*MemberBanned `protobuf:"bytes,13,rep,name=members_banned,json=membersBanned,proto3" json:"members_banned,omitempty"` // next: 14 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Group) Reset() { @@ -601,9 +618,16 @@ func (x *Group) GetTitle() []byte { return nil } -func (x *Group) GetAvatar() string { +func (x *Group) GetDescription() []byte { if x != nil { - return x.Avatar + return x.Description + } + return nil +} + +func (x *Group) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl } return "" } @@ -622,9 +646,9 @@ func (x *Group) GetAccessControl() *AccessControl { return nil } -func (x *Group) GetRevision() uint32 { +func (x *Group) GetVersion() uint32 { if x != nil { - return x.Revision + return x.Version } return 0 } @@ -636,16 +660,16 @@ func (x *Group) GetMembers() []*Member { return nil } -func (x *Group) GetPendingMembers() []*PendingMember { +func (x *Group) GetMembersPendingProfileKey() []*MemberPendingProfileKey { if x != nil { - return x.PendingMembers + return x.MembersPendingProfileKey } return nil } -func (x *Group) GetRequestingMembers() []*RequestingMember { +func (x *Group) GetMembersPendingAdminApproval() []*MemberPendingAdminApproval { if x != nil { - return x.RequestingMembers + return x.MembersPendingAdminApproval } return nil } @@ -657,13 +681,6 @@ func (x *Group) GetInviteLinkPassword() []byte { return nil } -func (x *Group) GetDescription() []byte { - if x != nil { - return x.Description - } - return nil -} - func (x *Group) GetAnnouncementsOnly() bool { if x != nil { return x.AnnouncementsOnly @@ -671,225 +688,9 @@ func (x *Group) GetAnnouncementsOnly() bool { return false } -func (x *Group) GetBannedMembers() []*BannedMember { +func (x *Group) GetMembersBanned() []*MemberBanned { if x != nil { - return x.BannedMembers - } - return nil -} - -type GroupChange struct { - state protoimpl.MessageState `protogen:"open.v1"` - Actions []byte `protobuf:"bytes,1,opt,name=actions,proto3" json:"actions,omitempty"` - ServerSignature []byte `protobuf:"bytes,2,opt,name=serverSignature,proto3" json:"serverSignature,omitempty"` - ChangeEpoch uint32 `protobuf:"varint,3,opt,name=changeEpoch,proto3" json:"changeEpoch,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GroupChange) Reset() { - *x = GroupChange{} - mi := &file_Groups_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GroupChange) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GroupChange) ProtoMessage() {} - -func (x *GroupChange) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[7] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GroupChange.ProtoReflect.Descriptor instead. -func (*GroupChange) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7} -} - -func (x *GroupChange) GetActions() []byte { - if x != nil { - return x.Actions - } - return nil -} - -func (x *GroupChange) GetServerSignature() []byte { - if x != nil { - return x.ServerSignature - } - return nil -} - -func (x *GroupChange) GetChangeEpoch() uint32 { - if x != nil { - return x.ChangeEpoch - } - return 0 -} - -type GroupResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` - GroupSendEndorsementsResponse []byte `protobuf:"bytes,2,opt,name=groupSendEndorsementsResponse,proto3" json:"groupSendEndorsementsResponse,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GroupResponse) Reset() { - *x = GroupResponse{} - mi := &file_Groups_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GroupResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GroupResponse) ProtoMessage() {} - -func (x *GroupResponse) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[8] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GroupResponse.ProtoReflect.Descriptor instead. -func (*GroupResponse) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{8} -} - -func (x *GroupResponse) GetGroup() *Group { - if x != nil { - return x.Group - } - return nil -} - -func (x *GroupResponse) GetGroupSendEndorsementsResponse() []byte { - if x != nil { - return x.GroupSendEndorsementsResponse - } - return nil -} - -type GroupChanges struct { - state protoimpl.MessageState `protogen:"open.v1"` - GroupChanges []*GroupChanges_GroupChangeState `protobuf:"bytes,1,rep,name=groupChanges,proto3" json:"groupChanges,omitempty"` - GroupSendEndorsementsResponse []byte `protobuf:"bytes,2,opt,name=groupSendEndorsementsResponse,proto3" json:"groupSendEndorsementsResponse,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GroupChanges) Reset() { - *x = GroupChanges{} - mi := &file_Groups_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GroupChanges) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GroupChanges) ProtoMessage() {} - -func (x *GroupChanges) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[9] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GroupChanges.ProtoReflect.Descriptor instead. -func (*GroupChanges) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{9} -} - -func (x *GroupChanges) GetGroupChanges() []*GroupChanges_GroupChangeState { - if x != nil { - return x.GroupChanges - } - return nil -} - -func (x *GroupChanges) GetGroupSendEndorsementsResponse() []byte { - if x != nil { - return x.GroupSendEndorsementsResponse - } - return nil -} - -type GroupChangeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - GroupChange *GroupChange `protobuf:"bytes,1,opt,name=groupChange,proto3" json:"groupChange,omitempty"` - GroupSendEndorsementsResponse []byte `protobuf:"bytes,2,opt,name=groupSendEndorsementsResponse,proto3" json:"groupSendEndorsementsResponse,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GroupChangeResponse) Reset() { - *x = GroupChangeResponse{} - mi := &file_Groups_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GroupChangeResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GroupChangeResponse) ProtoMessage() {} - -func (x *GroupChangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[10] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GroupChangeResponse.ProtoReflect.Descriptor instead. -func (*GroupChangeResponse) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{10} -} - -func (x *GroupChangeResponse) GetGroupChange() *GroupChange { - if x != nil { - return x.GroupChange - } - return nil -} - -func (x *GroupChangeResponse) GetGroupSendEndorsementsResponse() []byte { - if x != nil { - return x.GroupSendEndorsementsResponse + return x.MembersBanned } return nil } @@ -901,7 +702,7 @@ type GroupAttributeBlob struct { // *GroupAttributeBlob_Title // *GroupAttributeBlob_Avatar // *GroupAttributeBlob_DisappearingMessagesDuration - // *GroupAttributeBlob_Description + // *GroupAttributeBlob_DescriptionText Content isGroupAttributeBlob_Content `protobuf_oneof:"content"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -909,7 +710,7 @@ type GroupAttributeBlob struct { func (x *GroupAttributeBlob) Reset() { *x = GroupAttributeBlob{} - mi := &file_Groups_proto_msgTypes[11] + mi := &file_Groups_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -921,7 +722,7 @@ func (x *GroupAttributeBlob) String() string { func (*GroupAttributeBlob) ProtoMessage() {} func (x *GroupAttributeBlob) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[11] + mi := &file_Groups_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -934,7 +735,7 @@ func (x *GroupAttributeBlob) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupAttributeBlob.ProtoReflect.Descriptor instead. func (*GroupAttributeBlob) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{11} + return file_Groups_proto_rawDescGZIP(), []int{7} } func (x *GroupAttributeBlob) GetContent() isGroupAttributeBlob_Content { @@ -971,10 +772,10 @@ func (x *GroupAttributeBlob) GetDisappearingMessagesDuration() uint32 { return 0 } -func (x *GroupAttributeBlob) GetDescription() string { +func (x *GroupAttributeBlob) GetDescriptionText() string { if x != nil { - if x, ok := x.Content.(*GroupAttributeBlob_Description); ok { - return x.Description + if x, ok := x.Content.(*GroupAttributeBlob_DescriptionText); ok { + return x.DescriptionText } } return "" @@ -996,8 +797,8 @@ type GroupAttributeBlob_DisappearingMessagesDuration struct { DisappearingMessagesDuration uint32 `protobuf:"varint,3,opt,name=disappearingMessagesDuration,proto3,oneof"` } -type GroupAttributeBlob_Description struct { - Description string `protobuf:"bytes,4,opt,name=description,proto3,oneof"` +type GroupAttributeBlob_DescriptionText struct { + DescriptionText string `protobuf:"bytes,4,opt,name=descriptionText,proto3,oneof"` } func (*GroupAttributeBlob_Title) isGroupAttributeBlob_Content() {} @@ -1006,13 +807,13 @@ func (*GroupAttributeBlob_Avatar) isGroupAttributeBlob_Content() {} func (*GroupAttributeBlob_DisappearingMessagesDuration) isGroupAttributeBlob_Content() {} -func (*GroupAttributeBlob_Description) isGroupAttributeBlob_Content() {} +func (*GroupAttributeBlob_DescriptionText) isGroupAttributeBlob_Content() {} type GroupInviteLink struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Contents: // - // *GroupInviteLink_V1Contents + // *GroupInviteLink_ContentsV1 Contents isGroupInviteLink_Contents `protobuf_oneof:"contents"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -1020,7 +821,7 @@ type GroupInviteLink struct { func (x *GroupInviteLink) Reset() { *x = GroupInviteLink{} - mi := &file_Groups_proto_msgTypes[12] + mi := &file_Groups_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1032,7 +833,7 @@ func (x *GroupInviteLink) String() string { func (*GroupInviteLink) ProtoMessage() {} func (x *GroupInviteLink) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[12] + mi := &file_Groups_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1045,7 +846,7 @@ func (x *GroupInviteLink) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInviteLink.ProtoReflect.Descriptor instead. func (*GroupInviteLink) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{12} + return file_Groups_proto_rawDescGZIP(), []int{8} } func (x *GroupInviteLink) GetContents() isGroupInviteLink_Contents { @@ -1055,10 +856,10 @@ func (x *GroupInviteLink) GetContents() isGroupInviteLink_Contents { return nil } -func (x *GroupInviteLink) GetV1Contents() *GroupInviteLink_GroupInviteLinkContentsV1 { +func (x *GroupInviteLink) GetContentsV1() *GroupInviteLink_GroupInviteLinkContentsV1 { if x != nil { - if x, ok := x.Contents.(*GroupInviteLink_V1Contents); ok { - return x.V1Contents + if x, ok := x.Contents.(*GroupInviteLink_ContentsV1); ok { + return x.ContentsV1 } } return nil @@ -1068,29 +869,29 @@ type isGroupInviteLink_Contents interface { isGroupInviteLink_Contents() } -type GroupInviteLink_V1Contents struct { - V1Contents *GroupInviteLink_GroupInviteLinkContentsV1 `protobuf:"bytes,1,opt,name=v1Contents,proto3,oneof"` +type GroupInviteLink_ContentsV1 struct { + ContentsV1 *GroupInviteLink_GroupInviteLinkContentsV1 `protobuf:"bytes,1,opt,name=contentsV1,proto3,oneof"` } -func (*GroupInviteLink_V1Contents) isGroupInviteLink_Contents() {} +func (*GroupInviteLink_ContentsV1) isGroupInviteLink_Contents() {} type GroupJoinInfo struct { state protoimpl.MessageState `protogen:"open.v1"` PublicKey []byte `protobuf:"bytes,1,opt,name=publicKey,proto3" json:"publicKey,omitempty"` Title []byte `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Description []byte `protobuf:"bytes,8,opt,name=description,proto3" json:"description,omitempty"` Avatar string `protobuf:"bytes,3,opt,name=avatar,proto3" json:"avatar,omitempty"` MemberCount uint32 `protobuf:"varint,4,opt,name=memberCount,proto3" json:"memberCount,omitempty"` - AddFromInviteLink AccessControl_AccessRequired `protobuf:"varint,5,opt,name=addFromInviteLink,proto3,enum=AccessControl_AccessRequired" json:"addFromInviteLink,omitempty"` - Revision uint32 `protobuf:"varint,6,opt,name=revision,proto3" json:"revision,omitempty"` + AddFromInviteLink AccessControl_AccessRequired `protobuf:"varint,5,opt,name=addFromInviteLink,proto3,enum=signal.AccessControl_AccessRequired" json:"addFromInviteLink,omitempty"` + Version uint32 `protobuf:"varint,6,opt,name=version,proto3" json:"version,omitempty"` PendingAdminApproval bool `protobuf:"varint,7,opt,name=pendingAdminApproval,proto3" json:"pendingAdminApproval,omitempty"` - Description []byte `protobuf:"bytes,8,opt,name=description,proto3" json:"description,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GroupJoinInfo) Reset() { *x = GroupJoinInfo{} - mi := &file_Groups_proto_msgTypes[13] + mi := &file_Groups_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1102,7 +903,7 @@ func (x *GroupJoinInfo) String() string { func (*GroupJoinInfo) ProtoMessage() {} func (x *GroupJoinInfo) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[13] + mi := &file_Groups_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1115,7 +916,7 @@ func (x *GroupJoinInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupJoinInfo.ProtoReflect.Descriptor instead. func (*GroupJoinInfo) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{13} + return file_Groups_proto_rawDescGZIP(), []int{9} } func (x *GroupJoinInfo) GetPublicKey() []byte { @@ -1132,6 +933,13 @@ func (x *GroupJoinInfo) GetTitle() []byte { return nil } +func (x *GroupJoinInfo) GetDescription() []byte { + if x != nil { + return x.Description + } + return nil +} + func (x *GroupJoinInfo) GetAvatar() string { if x != nil { return x.Avatar @@ -1153,9 +961,9 @@ func (x *GroupJoinInfo) GetAddFromInviteLink() AccessControl_AccessRequired { return AccessControl_UNKNOWN } -func (x *GroupJoinInfo) GetRevision() uint32 { +func (x *GroupJoinInfo) GetVersion() uint32 { if x != nil { - return x.Revision + return x.Version } return 0 } @@ -1167,34 +975,236 @@ func (x *GroupJoinInfo) GetPendingAdminApproval() bool { return false } -func (x *GroupJoinInfo) GetDescription() []byte { +type GroupChange struct { + state protoimpl.MessageState `protogen:"open.v1"` + Actions []byte `protobuf:"bytes,1,opt,name=actions,proto3" json:"actions,omitempty"` + ServerSignature []byte `protobuf:"bytes,2,opt,name=serverSignature,proto3" json:"serverSignature,omitempty"` + ChangeEpoch uint32 `protobuf:"varint,3,opt,name=changeEpoch,proto3" json:"changeEpoch,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupChange) Reset() { + *x = GroupChange{} + mi := &file_Groups_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupChange) ProtoMessage() {} + +func (x *GroupChange) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[10] if x != nil { - return x.Description + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupChange.ProtoReflect.Descriptor instead. +func (*GroupChange) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10} +} + +func (x *GroupChange) GetActions() []byte { + if x != nil { + return x.Actions } return nil } -type GroupExternalCredential struct { +func (x *GroupChange) GetServerSignature() []byte { + if x != nil { + return x.ServerSignature + } + return nil +} + +func (x *GroupChange) GetChangeEpoch() uint32 { + if x != nil { + return x.ChangeEpoch + } + return 0 +} + +type ExternalGroupCredential struct { state protoimpl.MessageState `protogen:"open.v1"` Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupExternalCredential) Reset() { - *x = GroupExternalCredential{} +func (x *ExternalGroupCredential) Reset() { + *x = ExternalGroupCredential{} + mi := &file_Groups_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalGroupCredential) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalGroupCredential) ProtoMessage() {} + +func (x *ExternalGroupCredential) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExternalGroupCredential.ProtoReflect.Descriptor instead. +func (*ExternalGroupCredential) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{11} +} + +func (x *ExternalGroupCredential) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type GroupResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` + GroupSendEndorsementsResponse []byte `protobuf:"bytes,2,opt,name=group_send_endorsements_response,json=groupSendEndorsementsResponse,proto3" json:"group_send_endorsements_response,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupResponse) Reset() { + *x = GroupResponse{} + mi := &file_Groups_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupResponse) ProtoMessage() {} + +func (x *GroupResponse) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupResponse.ProtoReflect.Descriptor instead. +func (*GroupResponse) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{12} +} + +func (x *GroupResponse) GetGroup() *Group { + if x != nil { + return x.Group + } + return nil +} + +func (x *GroupResponse) GetGroupSendEndorsementsResponse() []byte { + if x != nil { + return x.GroupSendEndorsementsResponse + } + return nil +} + +type GroupChanges struct { + state protoimpl.MessageState `protogen:"open.v1"` + GroupChanges []*GroupChanges_GroupChangeState `protobuf:"bytes,1,rep,name=groupChanges,proto3" json:"groupChanges,omitempty"` + GroupSendEndorsementsResponse []byte `protobuf:"bytes,2,opt,name=group_send_endorsements_response,json=groupSendEndorsementsResponse,proto3" json:"group_send_endorsements_response,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupChanges) Reset() { + *x = GroupChanges{} + mi := &file_Groups_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupChanges) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupChanges) ProtoMessage() {} + +func (x *GroupChanges) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupChanges.ProtoReflect.Descriptor instead. +func (*GroupChanges) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{13} +} + +func (x *GroupChanges) GetGroupChanges() []*GroupChanges_GroupChangeState { + if x != nil { + return x.GroupChanges + } + return nil +} + +func (x *GroupChanges) GetGroupSendEndorsementsResponse() []byte { + if x != nil { + return x.GroupSendEndorsementsResponse + } + return nil +} + +type GroupChangeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + GroupChange *GroupChange `protobuf:"bytes,1,opt,name=group_change,json=groupChange,proto3" json:"group_change,omitempty"` + GroupSendEndorsementsResponse []byte `protobuf:"bytes,2,opt,name=group_send_endorsements_response,json=groupSendEndorsementsResponse,proto3" json:"group_send_endorsements_response,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupChangeResponse) Reset() { + *x = GroupChangeResponse{} mi := &file_Groups_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupExternalCredential) String() string { +func (x *GroupChangeResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupExternalCredential) ProtoMessage() {} +func (*GroupChangeResponse) ProtoMessage() {} -func (x *GroupExternalCredential) ProtoReflect() protoreflect.Message { +func (x *GroupChangeResponse) ProtoReflect() protoreflect.Message { mi := &file_Groups_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1206,52 +1216,114 @@ func (x *GroupExternalCredential) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GroupExternalCredential.ProtoReflect.Descriptor instead. -func (*GroupExternalCredential) Descriptor() ([]byte, []int) { +// Deprecated: Use GroupChangeResponse.ProtoReflect.Descriptor instead. +func (*GroupChangeResponse) Descriptor() ([]byte, []int) { return file_Groups_proto_rawDescGZIP(), []int{14} } -func (x *GroupExternalCredential) GetToken() string { +func (x *GroupChangeResponse) GetGroupChange() *GroupChange { if x != nil { - return x.Token + return x.GroupChange } - return "" + return nil +} + +func (x *GroupChangeResponse) GetGroupSendEndorsementsResponse() []byte { + if x != nil { + return x.GroupSendEndorsementsResponse + } + return nil +} + +type GroupInviteLink_GroupInviteLinkContentsV1 struct { + state protoimpl.MessageState `protogen:"open.v1"` + GroupMasterKey []byte `protobuf:"bytes,1,opt,name=groupMasterKey,proto3" json:"groupMasterKey,omitempty"` + InviteLinkPassword []byte `protobuf:"bytes,2,opt,name=inviteLinkPassword,proto3" json:"inviteLinkPassword,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupInviteLink_GroupInviteLinkContentsV1) Reset() { + *x = GroupInviteLink_GroupInviteLinkContentsV1{} + mi := &file_Groups_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupInviteLink_GroupInviteLinkContentsV1) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupInviteLink_GroupInviteLinkContentsV1) ProtoMessage() {} + +func (x *GroupInviteLink_GroupInviteLinkContentsV1) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupInviteLink_GroupInviteLinkContentsV1.ProtoReflect.Descriptor instead. +func (*GroupInviteLink_GroupInviteLinkContentsV1) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{8, 0} +} + +func (x *GroupInviteLink_GroupInviteLinkContentsV1) GetGroupMasterKey() []byte { + if x != nil { + return x.GroupMasterKey + } + return nil +} + +func (x *GroupInviteLink_GroupInviteLinkContentsV1) GetInviteLinkPassword() []byte { + if x != nil { + return x.InviteLinkPassword + } + return nil } type GroupChange_Actions struct { - state protoimpl.MessageState `protogen:"open.v1"` - SourceServiceId []byte `protobuf:"bytes,1,opt,name=sourceServiceId,proto3" json:"sourceServiceId,omitempty"` - GroupId []byte `protobuf:"bytes,25,opt,name=groupId,proto3" json:"groupId,omitempty"` // Only set when receiving from server - Revision uint32 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` - AddMembers []*GroupChange_Actions_AddMemberAction `protobuf:"bytes,3,rep,name=addMembers,proto3" json:"addMembers,omitempty"` - DeleteMembers []*GroupChange_Actions_DeleteMemberAction `protobuf:"bytes,4,rep,name=deleteMembers,proto3" json:"deleteMembers,omitempty"` - ModifyMemberRoles []*GroupChange_Actions_ModifyMemberRoleAction `protobuf:"bytes,5,rep,name=modifyMemberRoles,proto3" json:"modifyMemberRoles,omitempty"` - ModifyMemberProfileKeys []*GroupChange_Actions_ModifyMemberProfileKeyAction `protobuf:"bytes,6,rep,name=modifyMemberProfileKeys,proto3" json:"modifyMemberProfileKeys,omitempty"` - AddPendingMembers []*GroupChange_Actions_AddPendingMemberAction `protobuf:"bytes,7,rep,name=addPendingMembers,proto3" json:"addPendingMembers,omitempty"` - DeletePendingMembers []*GroupChange_Actions_DeletePendingMemberAction `protobuf:"bytes,8,rep,name=deletePendingMembers,proto3" json:"deletePendingMembers,omitempty"` - PromotePendingMembers []*GroupChange_Actions_PromotePendingMemberAction `protobuf:"bytes,9,rep,name=promotePendingMembers,proto3" json:"promotePendingMembers,omitempty"` - ModifyTitle *GroupChange_Actions_ModifyTitleAction `protobuf:"bytes,10,opt,name=modifyTitle,proto3" json:"modifyTitle,omitempty"` - ModifyAvatar *GroupChange_Actions_ModifyAvatarAction `protobuf:"bytes,11,opt,name=modifyAvatar,proto3" json:"modifyAvatar,omitempty"` - ModifyDisappearingMessagesTimer *GroupChange_Actions_ModifyDisappearingMessagesTimerAction `protobuf:"bytes,12,opt,name=modifyDisappearingMessagesTimer,proto3" json:"modifyDisappearingMessagesTimer,omitempty"` - ModifyAttributesAccess *GroupChange_Actions_ModifyAttributesAccessControlAction `protobuf:"bytes,13,opt,name=modifyAttributesAccess,proto3" json:"modifyAttributesAccess,omitempty"` - ModifyMemberAccess *GroupChange_Actions_ModifyMembersAccessControlAction `protobuf:"bytes,14,opt,name=modifyMemberAccess,proto3" json:"modifyMemberAccess,omitempty"` - ModifyAddFromInviteLinkAccess *GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction `protobuf:"bytes,15,opt,name=modifyAddFromInviteLinkAccess,proto3" json:"modifyAddFromInviteLinkAccess,omitempty"` - AddRequestingMembers []*GroupChange_Actions_AddRequestingMemberAction `protobuf:"bytes,16,rep,name=addRequestingMembers,proto3" json:"addRequestingMembers,omitempty"` - DeleteRequestingMembers []*GroupChange_Actions_DeleteRequestingMemberAction `protobuf:"bytes,17,rep,name=deleteRequestingMembers,proto3" json:"deleteRequestingMembers,omitempty"` - PromoteRequestingMembers []*GroupChange_Actions_PromoteRequestingMemberAction `protobuf:"bytes,18,rep,name=promoteRequestingMembers,proto3" json:"promoteRequestingMembers,omitempty"` - ModifyInviteLinkPassword *GroupChange_Actions_ModifyInviteLinkPasswordAction `protobuf:"bytes,19,opt,name=modifyInviteLinkPassword,proto3" json:"modifyInviteLinkPassword,omitempty"` - ModifyDescription *GroupChange_Actions_ModifyDescriptionAction `protobuf:"bytes,20,opt,name=modifyDescription,proto3" json:"modifyDescription,omitempty"` - ModifyAnnouncementsOnly *GroupChange_Actions_ModifyAnnouncementsOnlyAction `protobuf:"bytes,21,opt,name=modifyAnnouncementsOnly,proto3" json:"modifyAnnouncementsOnly,omitempty"` - AddBannedMembers []*GroupChange_Actions_AddBannedMemberAction `protobuf:"bytes,22,rep,name=addBannedMembers,proto3" json:"addBannedMembers,omitempty"` - DeleteBannedMembers []*GroupChange_Actions_DeleteBannedMemberAction `protobuf:"bytes,23,rep,name=deleteBannedMembers,proto3" json:"deleteBannedMembers,omitempty"` - PromotePendingPniAciMembers []*GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction `protobuf:"bytes,24,rep,name=promotePendingPniAciMembers,proto3" json:"promotePendingPniAciMembers,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + SourceUserId []byte `protobuf:"bytes,1,opt,name=sourceUserId,proto3" json:"sourceUserId,omitempty"` + // clients should not provide this value; the server will provide it in the response buffer to ensure the signature is binding to a particular group + // if clients set it during a request the server will respond with 400. + GroupId []byte `protobuf:"bytes,25,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + Version uint32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` + AddMembers []*GroupChange_Actions_AddMemberAction `protobuf:"bytes,3,rep,name=addMembers,proto3" json:"addMembers,omitempty"` + DeleteMembers []*GroupChange_Actions_DeleteMemberAction `protobuf:"bytes,4,rep,name=deleteMembers,proto3" json:"deleteMembers,omitempty"` + ModifyMemberRoles []*GroupChange_Actions_ModifyMemberRoleAction `protobuf:"bytes,5,rep,name=modifyMemberRoles,proto3" json:"modifyMemberRoles,omitempty"` + ModifyMemberProfileKeys []*GroupChange_Actions_ModifyMemberProfileKeyAction `protobuf:"bytes,6,rep,name=modifyMemberProfileKeys,proto3" json:"modifyMemberProfileKeys,omitempty"` + AddMembersPendingProfileKey []*GroupChange_Actions_AddMemberPendingProfileKeyAction `protobuf:"bytes,7,rep,name=addMembersPendingProfileKey,proto3" json:"addMembersPendingProfileKey,omitempty"` + DeleteMembersPendingProfileKey []*GroupChange_Actions_DeleteMemberPendingProfileKeyAction `protobuf:"bytes,8,rep,name=deleteMembersPendingProfileKey,proto3" json:"deleteMembersPendingProfileKey,omitempty"` + PromoteMembersPendingProfileKey []*GroupChange_Actions_PromoteMemberPendingProfileKeyAction `protobuf:"bytes,9,rep,name=promoteMembersPendingProfileKey,proto3" json:"promoteMembersPendingProfileKey,omitempty"` + ModifyTitle *GroupChange_Actions_ModifyTitleAction `protobuf:"bytes,10,opt,name=modifyTitle,proto3" json:"modifyTitle,omitempty"` + ModifyAvatar *GroupChange_Actions_ModifyAvatarAction `protobuf:"bytes,11,opt,name=modifyAvatar,proto3" json:"modifyAvatar,omitempty"` + ModifyDisappearingMessageTimer *GroupChange_Actions_ModifyDisappearingMessageTimerAction `protobuf:"bytes,12,opt,name=modifyDisappearingMessageTimer,proto3" json:"modifyDisappearingMessageTimer,omitempty"` + ModifyAttributesAccess *GroupChange_Actions_ModifyAttributesAccessControlAction `protobuf:"bytes,13,opt,name=modifyAttributesAccess,proto3" json:"modifyAttributesAccess,omitempty"` + ModifyMemberAccess *GroupChange_Actions_ModifyMembersAccessControlAction `protobuf:"bytes,14,opt,name=modifyMemberAccess,proto3" json:"modifyMemberAccess,omitempty"` + ModifyAddFromInviteLinkAccess *GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction `protobuf:"bytes,15,opt,name=modifyAddFromInviteLinkAccess,proto3" json:"modifyAddFromInviteLinkAccess,omitempty"` // change epoch = 1 + AddMembersPendingAdminApproval []*GroupChange_Actions_AddMemberPendingAdminApprovalAction `protobuf:"bytes,16,rep,name=addMembersPendingAdminApproval,proto3" json:"addMembersPendingAdminApproval,omitempty"` // change epoch = 1 + DeleteMembersPendingAdminApproval []*GroupChange_Actions_DeleteMemberPendingAdminApprovalAction `protobuf:"bytes,17,rep,name=deleteMembersPendingAdminApproval,proto3" json:"deleteMembersPendingAdminApproval,omitempty"` // change epoch = 1 + PromoteMembersPendingAdminApproval []*GroupChange_Actions_PromoteMemberPendingAdminApprovalAction `protobuf:"bytes,18,rep,name=promoteMembersPendingAdminApproval,proto3" json:"promoteMembersPendingAdminApproval,omitempty"` // change epoch = 1 + ModifyInviteLinkPassword *GroupChange_Actions_ModifyInviteLinkPasswordAction `protobuf:"bytes,19,opt,name=modifyInviteLinkPassword,proto3" json:"modifyInviteLinkPassword,omitempty"` // change epoch = 1 + ModifyDescription *GroupChange_Actions_ModifyDescriptionAction `protobuf:"bytes,20,opt,name=modifyDescription,proto3" json:"modifyDescription,omitempty"` // change epoch = 2 + ModifyAnnouncementsOnly *GroupChange_Actions_ModifyAnnouncementsOnlyAction `protobuf:"bytes,21,opt,name=modify_announcements_only,json=modifyAnnouncementsOnly,proto3" json:"modify_announcements_only,omitempty"` // change epoch = 3 + AddMembersBanned []*GroupChange_Actions_AddMemberBannedAction `protobuf:"bytes,22,rep,name=add_members_banned,json=addMembersBanned,proto3" json:"add_members_banned,omitempty"` // change epoch = 4 + DeleteMembersBanned []*GroupChange_Actions_DeleteMemberBannedAction `protobuf:"bytes,23,rep,name=delete_members_banned,json=deleteMembersBanned,proto3" json:"delete_members_banned,omitempty"` // change epoch = 4 + PromoteMembersPendingPniAciProfileKey []*GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction `protobuf:"bytes,24,rep,name=promote_members_pending_pni_aci_profile_key,json=promoteMembersPendingPniAciProfileKey,proto3" json:"promote_members_pending_pni_aci_profile_key,omitempty"` // change epoch = 5 + ModifyMemberLabels []*GroupChange_Actions_ModifyMemberLabelAction `protobuf:"bytes,26,rep,name=modifyMemberLabels,proto3" json:"modifyMemberLabels,omitempty"` // change epoch = 6; + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GroupChange_Actions) Reset() { *x = GroupChange_Actions{} - mi := &file_Groups_proto_msgTypes[15] + mi := &file_Groups_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1263,7 +1335,7 @@ func (x *GroupChange_Actions) String() string { func (*GroupChange_Actions) ProtoMessage() {} func (x *GroupChange_Actions) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[15] + mi := &file_Groups_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1276,12 +1348,12 @@ func (x *GroupChange_Actions) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupChange_Actions.ProtoReflect.Descriptor instead. func (*GroupChange_Actions) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0} + return file_Groups_proto_rawDescGZIP(), []int{10, 0} } -func (x *GroupChange_Actions) GetSourceServiceId() []byte { +func (x *GroupChange_Actions) GetSourceUserId() []byte { if x != nil { - return x.SourceServiceId + return x.SourceUserId } return nil } @@ -1293,9 +1365,9 @@ func (x *GroupChange_Actions) GetGroupId() []byte { return nil } -func (x *GroupChange_Actions) GetRevision() uint32 { +func (x *GroupChange_Actions) GetVersion() uint32 { if x != nil { - return x.Revision + return x.Version } return 0 } @@ -1328,23 +1400,23 @@ func (x *GroupChange_Actions) GetModifyMemberProfileKeys() []*GroupChange_Action return nil } -func (x *GroupChange_Actions) GetAddPendingMembers() []*GroupChange_Actions_AddPendingMemberAction { +func (x *GroupChange_Actions) GetAddMembersPendingProfileKey() []*GroupChange_Actions_AddMemberPendingProfileKeyAction { if x != nil { - return x.AddPendingMembers + return x.AddMembersPendingProfileKey } return nil } -func (x *GroupChange_Actions) GetDeletePendingMembers() []*GroupChange_Actions_DeletePendingMemberAction { +func (x *GroupChange_Actions) GetDeleteMembersPendingProfileKey() []*GroupChange_Actions_DeleteMemberPendingProfileKeyAction { if x != nil { - return x.DeletePendingMembers + return x.DeleteMembersPendingProfileKey } return nil } -func (x *GroupChange_Actions) GetPromotePendingMembers() []*GroupChange_Actions_PromotePendingMemberAction { +func (x *GroupChange_Actions) GetPromoteMembersPendingProfileKey() []*GroupChange_Actions_PromoteMemberPendingProfileKeyAction { if x != nil { - return x.PromotePendingMembers + return x.PromoteMembersPendingProfileKey } return nil } @@ -1363,9 +1435,9 @@ func (x *GroupChange_Actions) GetModifyAvatar() *GroupChange_Actions_ModifyAvata return nil } -func (x *GroupChange_Actions) GetModifyDisappearingMessagesTimer() *GroupChange_Actions_ModifyDisappearingMessagesTimerAction { +func (x *GroupChange_Actions) GetModifyDisappearingMessageTimer() *GroupChange_Actions_ModifyDisappearingMessageTimerAction { if x != nil { - return x.ModifyDisappearingMessagesTimer + return x.ModifyDisappearingMessageTimer } return nil } @@ -1391,23 +1463,23 @@ func (x *GroupChange_Actions) GetModifyAddFromInviteLinkAccess() *GroupChange_Ac return nil } -func (x *GroupChange_Actions) GetAddRequestingMembers() []*GroupChange_Actions_AddRequestingMemberAction { +func (x *GroupChange_Actions) GetAddMembersPendingAdminApproval() []*GroupChange_Actions_AddMemberPendingAdminApprovalAction { if x != nil { - return x.AddRequestingMembers + return x.AddMembersPendingAdminApproval } return nil } -func (x *GroupChange_Actions) GetDeleteRequestingMembers() []*GroupChange_Actions_DeleteRequestingMemberAction { +func (x *GroupChange_Actions) GetDeleteMembersPendingAdminApproval() []*GroupChange_Actions_DeleteMemberPendingAdminApprovalAction { if x != nil { - return x.DeleteRequestingMembers + return x.DeleteMembersPendingAdminApproval } return nil } -func (x *GroupChange_Actions) GetPromoteRequestingMembers() []*GroupChange_Actions_PromoteRequestingMemberAction { +func (x *GroupChange_Actions) GetPromoteMembersPendingAdminApproval() []*GroupChange_Actions_PromoteMemberPendingAdminApprovalAction { if x != nil { - return x.PromoteRequestingMembers + return x.PromoteMembersPendingAdminApproval } return nil } @@ -1433,23 +1505,30 @@ func (x *GroupChange_Actions) GetModifyAnnouncementsOnly() *GroupChange_Actions_ return nil } -func (x *GroupChange_Actions) GetAddBannedMembers() []*GroupChange_Actions_AddBannedMemberAction { +func (x *GroupChange_Actions) GetAddMembersBanned() []*GroupChange_Actions_AddMemberBannedAction { if x != nil { - return x.AddBannedMembers + return x.AddMembersBanned } return nil } -func (x *GroupChange_Actions) GetDeleteBannedMembers() []*GroupChange_Actions_DeleteBannedMemberAction { +func (x *GroupChange_Actions) GetDeleteMembersBanned() []*GroupChange_Actions_DeleteMemberBannedAction { if x != nil { - return x.DeleteBannedMembers + return x.DeleteMembersBanned } return nil } -func (x *GroupChange_Actions) GetPromotePendingPniAciMembers() []*GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction { +func (x *GroupChange_Actions) GetPromoteMembersPendingPniAciProfileKey() []*GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction { if x != nil { - return x.PromotePendingPniAciMembers + return x.PromoteMembersPendingPniAciProfileKey + } + return nil +} + +func (x *GroupChange_Actions) GetModifyMemberLabels() []*GroupChange_Actions_ModifyMemberLabelAction { + if x != nil { + return x.ModifyMemberLabels } return nil } @@ -1464,7 +1543,7 @@ type GroupChange_Actions_AddMemberAction struct { func (x *GroupChange_Actions_AddMemberAction) Reset() { *x = GroupChange_Actions_AddMemberAction{} - mi := &file_Groups_proto_msgTypes[16] + mi := &file_Groups_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1476,7 +1555,7 @@ func (x *GroupChange_Actions_AddMemberAction) String() string { func (*GroupChange_Actions_AddMemberAction) ProtoMessage() {} func (x *GroupChange_Actions_AddMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[16] + mi := &file_Groups_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1489,7 +1568,7 @@ func (x *GroupChange_Actions_AddMemberAction) ProtoReflect() protoreflect.Messag // Deprecated: Use GroupChange_Actions_AddMemberAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_AddMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 0} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 0} } func (x *GroupChange_Actions_AddMemberAction) GetAdded() *Member { @@ -1515,7 +1594,7 @@ type GroupChange_Actions_DeleteMemberAction struct { func (x *GroupChange_Actions_DeleteMemberAction) Reset() { *x = GroupChange_Actions_DeleteMemberAction{} - mi := &file_Groups_proto_msgTypes[17] + mi := &file_Groups_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1527,7 +1606,7 @@ func (x *GroupChange_Actions_DeleteMemberAction) String() string { func (*GroupChange_Actions_DeleteMemberAction) ProtoMessage() {} func (x *GroupChange_Actions_DeleteMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[17] + mi := &file_Groups_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1540,7 +1619,7 @@ func (x *GroupChange_Actions_DeleteMemberAction) ProtoReflect() protoreflect.Mes // Deprecated: Use GroupChange_Actions_DeleteMemberAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_DeleteMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 1} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 1} } func (x *GroupChange_Actions_DeleteMemberAction) GetDeletedUserId() []byte { @@ -1553,14 +1632,14 @@ func (x *GroupChange_Actions_DeleteMemberAction) GetDeletedUserId() []byte { type GroupChange_Actions_ModifyMemberRoleAction struct { state protoimpl.MessageState `protogen:"open.v1"` UserId []byte `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` - Role Member_Role `protobuf:"varint,2,opt,name=role,proto3,enum=Member_Role" json:"role,omitempty"` + Role Member_Role `protobuf:"varint,2,opt,name=role,proto3,enum=signal.Member_Role" json:"role,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GroupChange_Actions_ModifyMemberRoleAction) Reset() { *x = GroupChange_Actions_ModifyMemberRoleAction{} - mi := &file_Groups_proto_msgTypes[18] + mi := &file_Groups_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1572,7 +1651,7 @@ func (x *GroupChange_Actions_ModifyMemberRoleAction) String() string { func (*GroupChange_Actions_ModifyMemberRoleAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyMemberRoleAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[18] + mi := &file_Groups_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1585,7 +1664,7 @@ func (x *GroupChange_Actions_ModifyMemberRoleAction) ProtoReflect() protoreflect // Deprecated: Use GroupChange_Actions_ModifyMemberRoleAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyMemberRoleAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 2} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 2} } func (x *GroupChange_Actions_ModifyMemberRoleAction) GetUserId() []byte { @@ -1602,18 +1681,78 @@ func (x *GroupChange_Actions_ModifyMemberRoleAction) GetRole() Member_Role { return Member_UNKNOWN } +type GroupChange_Actions_ModifyMemberLabelAction struct { + state protoimpl.MessageState `protogen:"open.v1"` + UserId []byte `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` + LabelEmoji []byte `protobuf:"bytes,2,opt,name=labelEmoji,proto3" json:"labelEmoji,omitempty"` // decrypts to a UTF-8 string + LabelString []byte `protobuf:"bytes,3,opt,name=labelString,proto3" json:"labelString,omitempty"` // decrypts to a UTF-8 string + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupChange_Actions_ModifyMemberLabelAction) Reset() { + *x = GroupChange_Actions_ModifyMemberLabelAction{} + mi := &file_Groups_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupChange_Actions_ModifyMemberLabelAction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupChange_Actions_ModifyMemberLabelAction) ProtoMessage() {} + +func (x *GroupChange_Actions_ModifyMemberLabelAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupChange_Actions_ModifyMemberLabelAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_ModifyMemberLabelAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 3} +} + +func (x *GroupChange_Actions_ModifyMemberLabelAction) GetUserId() []byte { + if x != nil { + return x.UserId + } + return nil +} + +func (x *GroupChange_Actions_ModifyMemberLabelAction) GetLabelEmoji() []byte { + if x != nil { + return x.LabelEmoji + } + return nil +} + +func (x *GroupChange_Actions_ModifyMemberLabelAction) GetLabelString() []byte { + if x != nil { + return x.LabelString + } + return nil +} + type GroupChange_Actions_ModifyMemberProfileKeyAction struct { state protoimpl.MessageState `protogen:"open.v1"` - Presentation []byte `protobuf:"bytes,1,opt,name=presentation,proto3" json:"presentation,omitempty"` // Only set when sending to server - UserId []byte `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Only set when receiving from server - ProfileKey []byte `protobuf:"bytes,3,opt,name=profile_key,json=profileKey,proto3" json:"profile_key,omitempty"` // Only set when receiving from server + Presentation []byte `protobuf:"bytes,1,opt,name=presentation,proto3" json:"presentation,omitempty"` + UserId []byte `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + ProfileKey []byte `protobuf:"bytes,3,opt,name=profile_key,json=profileKey,proto3" json:"profile_key,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GroupChange_Actions_ModifyMemberProfileKeyAction) Reset() { *x = GroupChange_Actions_ModifyMemberProfileKeyAction{} - mi := &file_Groups_proto_msgTypes[19] + mi := &file_Groups_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1625,7 +1764,7 @@ func (x *GroupChange_Actions_ModifyMemberProfileKeyAction) String() string { func (*GroupChange_Actions_ModifyMemberProfileKeyAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyMemberProfileKeyAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[19] + mi := &file_Groups_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1638,7 +1777,7 @@ func (x *GroupChange_Actions_ModifyMemberProfileKeyAction) ProtoReflect() protor // Deprecated: Use GroupChange_Actions_ModifyMemberProfileKeyAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyMemberProfileKeyAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 3} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 4} } func (x *GroupChange_Actions_ModifyMemberProfileKeyAction) GetPresentation() []byte { @@ -1662,28 +1801,28 @@ func (x *GroupChange_Actions_ModifyMemberProfileKeyAction) GetProfileKey() []byt return nil } -type GroupChange_Actions_AddPendingMemberAction struct { - state protoimpl.MessageState `protogen:"open.v1"` - Added *PendingMember `protobuf:"bytes,1,opt,name=added,proto3" json:"added,omitempty"` +type GroupChange_Actions_AddMemberPendingProfileKeyAction struct { + state protoimpl.MessageState `protogen:"open.v1"` + Added *MemberPendingProfileKey `protobuf:"bytes,1,opt,name=added,proto3" json:"added,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_AddPendingMemberAction) Reset() { - *x = GroupChange_Actions_AddPendingMemberAction{} - mi := &file_Groups_proto_msgTypes[20] +func (x *GroupChange_Actions_AddMemberPendingProfileKeyAction) Reset() { + *x = GroupChange_Actions_AddMemberPendingProfileKeyAction{} + mi := &file_Groups_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_AddPendingMemberAction) String() string { +func (x *GroupChange_Actions_AddMemberPendingProfileKeyAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_AddPendingMemberAction) ProtoMessage() {} +func (*GroupChange_Actions_AddMemberPendingProfileKeyAction) ProtoMessage() {} -func (x *GroupChange_Actions_AddPendingMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[20] +func (x *GroupChange_Actions_AddMemberPendingProfileKeyAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1694,40 +1833,40 @@ func (x *GroupChange_Actions_AddPendingMemberAction) ProtoReflect() protoreflect return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_AddPendingMemberAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_AddPendingMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 4} +// Deprecated: Use GroupChange_Actions_AddMemberPendingProfileKeyAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_AddMemberPendingProfileKeyAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 5} } -func (x *GroupChange_Actions_AddPendingMemberAction) GetAdded() *PendingMember { +func (x *GroupChange_Actions_AddMemberPendingProfileKeyAction) GetAdded() *MemberPendingProfileKey { if x != nil { return x.Added } return nil } -type GroupChange_Actions_DeletePendingMemberAction struct { +type GroupChange_Actions_DeleteMemberPendingProfileKeyAction struct { state protoimpl.MessageState `protogen:"open.v1"` DeletedUserId []byte `protobuf:"bytes,1,opt,name=deletedUserId,proto3" json:"deletedUserId,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_DeletePendingMemberAction) Reset() { - *x = GroupChange_Actions_DeletePendingMemberAction{} - mi := &file_Groups_proto_msgTypes[21] +func (x *GroupChange_Actions_DeleteMemberPendingProfileKeyAction) Reset() { + *x = GroupChange_Actions_DeleteMemberPendingProfileKeyAction{} + mi := &file_Groups_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_DeletePendingMemberAction) String() string { +func (x *GroupChange_Actions_DeleteMemberPendingProfileKeyAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_DeletePendingMemberAction) ProtoMessage() {} +func (*GroupChange_Actions_DeleteMemberPendingProfileKeyAction) ProtoMessage() {} -func (x *GroupChange_Actions_DeletePendingMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[21] +func (x *GroupChange_Actions_DeleteMemberPendingProfileKeyAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1738,42 +1877,42 @@ func (x *GroupChange_Actions_DeletePendingMemberAction) ProtoReflect() protorefl return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_DeletePendingMemberAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_DeletePendingMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 5} +// Deprecated: Use GroupChange_Actions_DeleteMemberPendingProfileKeyAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_DeleteMemberPendingProfileKeyAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 6} } -func (x *GroupChange_Actions_DeletePendingMemberAction) GetDeletedUserId() []byte { +func (x *GroupChange_Actions_DeleteMemberPendingProfileKeyAction) GetDeletedUserId() []byte { if x != nil { return x.DeletedUserId } return nil } -type GroupChange_Actions_PromotePendingMemberAction struct { +type GroupChange_Actions_PromoteMemberPendingProfileKeyAction struct { state protoimpl.MessageState `protogen:"open.v1"` - Presentation []byte `protobuf:"bytes,1,opt,name=presentation,proto3" json:"presentation,omitempty"` // Only set when sending to server - UserId []byte `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // Only set when receiving from server - ProfileKey []byte `protobuf:"bytes,3,opt,name=profile_key,json=profileKey,proto3" json:"profile_key,omitempty"` // Only set when receiving from server + Presentation []byte `protobuf:"bytes,1,opt,name=presentation,proto3" json:"presentation,omitempty"` + UserId []byte `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + ProfileKey []byte `protobuf:"bytes,3,opt,name=profile_key,json=profileKey,proto3" json:"profile_key,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_PromotePendingMemberAction) Reset() { - *x = GroupChange_Actions_PromotePendingMemberAction{} - mi := &file_Groups_proto_msgTypes[22] +func (x *GroupChange_Actions_PromoteMemberPendingProfileKeyAction) Reset() { + *x = GroupChange_Actions_PromoteMemberPendingProfileKeyAction{} + mi := &file_Groups_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_PromotePendingMemberAction) String() string { +func (x *GroupChange_Actions_PromoteMemberPendingProfileKeyAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_PromotePendingMemberAction) ProtoMessage() {} +func (*GroupChange_Actions_PromoteMemberPendingProfileKeyAction) ProtoMessage() {} -func (x *GroupChange_Actions_PromotePendingMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[22] +func (x *GroupChange_Actions_PromoteMemberPendingProfileKeyAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1784,57 +1923,57 @@ func (x *GroupChange_Actions_PromotePendingMemberAction) ProtoReflect() protoref return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_PromotePendingMemberAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_PromotePendingMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 6} +// Deprecated: Use GroupChange_Actions_PromoteMemberPendingProfileKeyAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_PromoteMemberPendingProfileKeyAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 7} } -func (x *GroupChange_Actions_PromotePendingMemberAction) GetPresentation() []byte { +func (x *GroupChange_Actions_PromoteMemberPendingProfileKeyAction) GetPresentation() []byte { if x != nil { return x.Presentation } return nil } -func (x *GroupChange_Actions_PromotePendingMemberAction) GetUserId() []byte { +func (x *GroupChange_Actions_PromoteMemberPendingProfileKeyAction) GetUserId() []byte { if x != nil { return x.UserId } return nil } -func (x *GroupChange_Actions_PromotePendingMemberAction) GetProfileKey() []byte { +func (x *GroupChange_Actions_PromoteMemberPendingProfileKeyAction) GetProfileKey() []byte { if x != nil { return x.ProfileKey } return nil } -type GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction struct { +type GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction struct { state protoimpl.MessageState `protogen:"open.v1"` - Presentation []byte `protobuf:"bytes,1,opt,name=presentation,proto3" json:"presentation,omitempty"` // Only set when sending to server - UserId []byte `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` // Only set when receiving from server - Pni []byte `protobuf:"bytes,3,opt,name=pni,proto3" json:"pni,omitempty"` // Only set when receiving from server - ProfileKey []byte `protobuf:"bytes,4,opt,name=profileKey,proto3" json:"profileKey,omitempty"` // Only set when receiving from server + Presentation []byte `protobuf:"bytes,1,opt,name=presentation,proto3" json:"presentation,omitempty"` + UserId []byte `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Pni []byte `protobuf:"bytes,3,opt,name=pni,proto3" json:"pni,omitempty"` + ProfileKey []byte `protobuf:"bytes,4,opt,name=profile_key,json=profileKey,proto3" json:"profile_key,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) Reset() { - *x = GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction{} - mi := &file_Groups_proto_msgTypes[23] +func (x *GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) Reset() { + *x = GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction{} + mi := &file_Groups_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) String() string { +func (x *GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) ProtoMessage() {} +func (*GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) ProtoMessage() {} -func (x *GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[23] +func (x *GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1845,61 +1984,61 @@ func (x *GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) ProtoRe return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 7} +// Deprecated: Use GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 8} } -func (x *GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) GetPresentation() []byte { +func (x *GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) GetPresentation() []byte { if x != nil { return x.Presentation } return nil } -func (x *GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) GetUserId() []byte { +func (x *GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) GetUserId() []byte { if x != nil { return x.UserId } return nil } -func (x *GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) GetPni() []byte { +func (x *GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) GetPni() []byte { if x != nil { return x.Pni } return nil } -func (x *GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction) GetProfileKey() []byte { +func (x *GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction) GetProfileKey() []byte { if x != nil { return x.ProfileKey } return nil } -type GroupChange_Actions_AddRequestingMemberAction struct { - state protoimpl.MessageState `protogen:"open.v1"` - Added *RequestingMember `protobuf:"bytes,1,opt,name=added,proto3" json:"added,omitempty"` +type GroupChange_Actions_AddMemberPendingAdminApprovalAction struct { + state protoimpl.MessageState `protogen:"open.v1"` + Added *MemberPendingAdminApproval `protobuf:"bytes,1,opt,name=added,proto3" json:"added,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_AddRequestingMemberAction) Reset() { - *x = GroupChange_Actions_AddRequestingMemberAction{} - mi := &file_Groups_proto_msgTypes[24] +func (x *GroupChange_Actions_AddMemberPendingAdminApprovalAction) Reset() { + *x = GroupChange_Actions_AddMemberPendingAdminApprovalAction{} + mi := &file_Groups_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_AddRequestingMemberAction) String() string { +func (x *GroupChange_Actions_AddMemberPendingAdminApprovalAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_AddRequestingMemberAction) ProtoMessage() {} +func (*GroupChange_Actions_AddMemberPendingAdminApprovalAction) ProtoMessage() {} -func (x *GroupChange_Actions_AddRequestingMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[24] +func (x *GroupChange_Actions_AddMemberPendingAdminApprovalAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1910,40 +2049,40 @@ func (x *GroupChange_Actions_AddRequestingMemberAction) ProtoReflect() protorefl return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_AddRequestingMemberAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_AddRequestingMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 8} +// Deprecated: Use GroupChange_Actions_AddMemberPendingAdminApprovalAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_AddMemberPendingAdminApprovalAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 9} } -func (x *GroupChange_Actions_AddRequestingMemberAction) GetAdded() *RequestingMember { +func (x *GroupChange_Actions_AddMemberPendingAdminApprovalAction) GetAdded() *MemberPendingAdminApproval { if x != nil { return x.Added } return nil } -type GroupChange_Actions_DeleteRequestingMemberAction struct { +type GroupChange_Actions_DeleteMemberPendingAdminApprovalAction struct { state protoimpl.MessageState `protogen:"open.v1"` DeletedUserId []byte `protobuf:"bytes,1,opt,name=deletedUserId,proto3" json:"deletedUserId,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_DeleteRequestingMemberAction) Reset() { - *x = GroupChange_Actions_DeleteRequestingMemberAction{} - mi := &file_Groups_proto_msgTypes[25] +func (x *GroupChange_Actions_DeleteMemberPendingAdminApprovalAction) Reset() { + *x = GroupChange_Actions_DeleteMemberPendingAdminApprovalAction{} + mi := &file_Groups_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_DeleteRequestingMemberAction) String() string { +func (x *GroupChange_Actions_DeleteMemberPendingAdminApprovalAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_DeleteRequestingMemberAction) ProtoMessage() {} +func (*GroupChange_Actions_DeleteMemberPendingAdminApprovalAction) ProtoMessage() {} -func (x *GroupChange_Actions_DeleteRequestingMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[25] +func (x *GroupChange_Actions_DeleteMemberPendingAdminApprovalAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1954,41 +2093,41 @@ func (x *GroupChange_Actions_DeleteRequestingMemberAction) ProtoReflect() protor return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_DeleteRequestingMemberAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_DeleteRequestingMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 9} +// Deprecated: Use GroupChange_Actions_DeleteMemberPendingAdminApprovalAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_DeleteMemberPendingAdminApprovalAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 10} } -func (x *GroupChange_Actions_DeleteRequestingMemberAction) GetDeletedUserId() []byte { +func (x *GroupChange_Actions_DeleteMemberPendingAdminApprovalAction) GetDeletedUserId() []byte { if x != nil { return x.DeletedUserId } return nil } -type GroupChange_Actions_PromoteRequestingMemberAction struct { +type GroupChange_Actions_PromoteMemberPendingAdminApprovalAction struct { state protoimpl.MessageState `protogen:"open.v1"` UserId []byte `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` - Role Member_Role `protobuf:"varint,2,opt,name=role,proto3,enum=Member_Role" json:"role,omitempty"` + Role Member_Role `protobuf:"varint,2,opt,name=role,proto3,enum=signal.Member_Role" json:"role,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_PromoteRequestingMemberAction) Reset() { - *x = GroupChange_Actions_PromoteRequestingMemberAction{} - mi := &file_Groups_proto_msgTypes[26] +func (x *GroupChange_Actions_PromoteMemberPendingAdminApprovalAction) Reset() { + *x = GroupChange_Actions_PromoteMemberPendingAdminApprovalAction{} + mi := &file_Groups_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_PromoteRequestingMemberAction) String() string { +func (x *GroupChange_Actions_PromoteMemberPendingAdminApprovalAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_PromoteRequestingMemberAction) ProtoMessage() {} +func (*GroupChange_Actions_PromoteMemberPendingAdminApprovalAction) ProtoMessage() {} -func (x *GroupChange_Actions_PromoteRequestingMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[26] +func (x *GroupChange_Actions_PromoteMemberPendingAdminApprovalAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1999,47 +2138,47 @@ func (x *GroupChange_Actions_PromoteRequestingMemberAction) ProtoReflect() proto return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_PromoteRequestingMemberAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_PromoteRequestingMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 10} +// Deprecated: Use GroupChange_Actions_PromoteMemberPendingAdminApprovalAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_PromoteMemberPendingAdminApprovalAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 11} } -func (x *GroupChange_Actions_PromoteRequestingMemberAction) GetUserId() []byte { +func (x *GroupChange_Actions_PromoteMemberPendingAdminApprovalAction) GetUserId() []byte { if x != nil { return x.UserId } return nil } -func (x *GroupChange_Actions_PromoteRequestingMemberAction) GetRole() Member_Role { +func (x *GroupChange_Actions_PromoteMemberPendingAdminApprovalAction) GetRole() Member_Role { if x != nil { return x.Role } return Member_UNKNOWN } -type GroupChange_Actions_AddBannedMemberAction struct { +type GroupChange_Actions_AddMemberBannedAction struct { state protoimpl.MessageState `protogen:"open.v1"` - Added *BannedMember `protobuf:"bytes,1,opt,name=added,proto3" json:"added,omitempty"` + Added *MemberBanned `protobuf:"bytes,1,opt,name=added,proto3" json:"added,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_AddBannedMemberAction) Reset() { - *x = GroupChange_Actions_AddBannedMemberAction{} - mi := &file_Groups_proto_msgTypes[27] +func (x *GroupChange_Actions_AddMemberBannedAction) Reset() { + *x = GroupChange_Actions_AddMemberBannedAction{} + mi := &file_Groups_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_AddBannedMemberAction) String() string { +func (x *GroupChange_Actions_AddMemberBannedAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_AddBannedMemberAction) ProtoMessage() {} +func (*GroupChange_Actions_AddMemberBannedAction) ProtoMessage() {} -func (x *GroupChange_Actions_AddBannedMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[27] +func (x *GroupChange_Actions_AddMemberBannedAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2050,40 +2189,40 @@ func (x *GroupChange_Actions_AddBannedMemberAction) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_AddBannedMemberAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_AddBannedMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 11} +// Deprecated: Use GroupChange_Actions_AddMemberBannedAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_AddMemberBannedAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 12} } -func (x *GroupChange_Actions_AddBannedMemberAction) GetAdded() *BannedMember { +func (x *GroupChange_Actions_AddMemberBannedAction) GetAdded() *MemberBanned { if x != nil { return x.Added } return nil } -type GroupChange_Actions_DeleteBannedMemberAction struct { +type GroupChange_Actions_DeleteMemberBannedAction struct { state protoimpl.MessageState `protogen:"open.v1"` DeletedUserId []byte `protobuf:"bytes,1,opt,name=deletedUserId,proto3" json:"deletedUserId,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_DeleteBannedMemberAction) Reset() { - *x = GroupChange_Actions_DeleteBannedMemberAction{} - mi := &file_Groups_proto_msgTypes[28] +func (x *GroupChange_Actions_DeleteMemberBannedAction) Reset() { + *x = GroupChange_Actions_DeleteMemberBannedAction{} + mi := &file_Groups_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_DeleteBannedMemberAction) String() string { +func (x *GroupChange_Actions_DeleteMemberBannedAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_DeleteBannedMemberAction) ProtoMessage() {} +func (*GroupChange_Actions_DeleteMemberBannedAction) ProtoMessage() {} -func (x *GroupChange_Actions_DeleteBannedMemberAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[28] +func (x *GroupChange_Actions_DeleteMemberBannedAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2094,12 +2233,12 @@ func (x *GroupChange_Actions_DeleteBannedMemberAction) ProtoReflect() protorefle return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_DeleteBannedMemberAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_DeleteBannedMemberAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 12} +// Deprecated: Use GroupChange_Actions_DeleteMemberBannedAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_DeleteMemberBannedAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 13} } -func (x *GroupChange_Actions_DeleteBannedMemberAction) GetDeletedUserId() []byte { +func (x *GroupChange_Actions_DeleteMemberBannedAction) GetDeletedUserId() []byte { if x != nil { return x.DeletedUserId } @@ -2115,7 +2254,7 @@ type GroupChange_Actions_ModifyTitleAction struct { func (x *GroupChange_Actions_ModifyTitleAction) Reset() { *x = GroupChange_Actions_ModifyTitleAction{} - mi := &file_Groups_proto_msgTypes[29] + mi := &file_Groups_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2127,7 +2266,7 @@ func (x *GroupChange_Actions_ModifyTitleAction) String() string { func (*GroupChange_Actions_ModifyTitleAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyTitleAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[29] + mi := &file_Groups_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2140,7 +2279,7 @@ func (x *GroupChange_Actions_ModifyTitleAction) ProtoReflect() protoreflect.Mess // Deprecated: Use GroupChange_Actions_ModifyTitleAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyTitleAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 13} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 14} } func (x *GroupChange_Actions_ModifyTitleAction) GetTitle() []byte { @@ -2159,7 +2298,7 @@ type GroupChange_Actions_ModifyDescriptionAction struct { func (x *GroupChange_Actions_ModifyDescriptionAction) Reset() { *x = GroupChange_Actions_ModifyDescriptionAction{} - mi := &file_Groups_proto_msgTypes[30] + mi := &file_Groups_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2171,7 +2310,7 @@ func (x *GroupChange_Actions_ModifyDescriptionAction) String() string { func (*GroupChange_Actions_ModifyDescriptionAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyDescriptionAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[30] + mi := &file_Groups_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2184,7 +2323,7 @@ func (x *GroupChange_Actions_ModifyDescriptionAction) ProtoReflect() protoreflec // Deprecated: Use GroupChange_Actions_ModifyDescriptionAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyDescriptionAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 14} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 15} } func (x *GroupChange_Actions_ModifyDescriptionAction) GetDescription() []byte { @@ -2203,7 +2342,7 @@ type GroupChange_Actions_ModifyAvatarAction struct { func (x *GroupChange_Actions_ModifyAvatarAction) Reset() { *x = GroupChange_Actions_ModifyAvatarAction{} - mi := &file_Groups_proto_msgTypes[31] + mi := &file_Groups_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2215,7 +2354,7 @@ func (x *GroupChange_Actions_ModifyAvatarAction) String() string { func (*GroupChange_Actions_ModifyAvatarAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyAvatarAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[31] + mi := &file_Groups_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2228,7 +2367,7 @@ func (x *GroupChange_Actions_ModifyAvatarAction) ProtoReflect() protoreflect.Mes // Deprecated: Use GroupChange_Actions_ModifyAvatarAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyAvatarAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 15} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 16} } func (x *GroupChange_Actions_ModifyAvatarAction) GetAvatar() string { @@ -2238,28 +2377,28 @@ func (x *GroupChange_Actions_ModifyAvatarAction) GetAvatar() string { return "" } -type GroupChange_Actions_ModifyDisappearingMessagesTimerAction struct { +type GroupChange_Actions_ModifyDisappearingMessageTimerAction struct { state protoimpl.MessageState `protogen:"open.v1"` Timer []byte `protobuf:"bytes,1,opt,name=timer,proto3" json:"timer,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GroupChange_Actions_ModifyDisappearingMessagesTimerAction) Reset() { - *x = GroupChange_Actions_ModifyDisappearingMessagesTimerAction{} - mi := &file_Groups_proto_msgTypes[32] +func (x *GroupChange_Actions_ModifyDisappearingMessageTimerAction) Reset() { + *x = GroupChange_Actions_ModifyDisappearingMessageTimerAction{} + mi := &file_Groups_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GroupChange_Actions_ModifyDisappearingMessagesTimerAction) String() string { +func (x *GroupChange_Actions_ModifyDisappearingMessageTimerAction) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GroupChange_Actions_ModifyDisappearingMessagesTimerAction) ProtoMessage() {} +func (*GroupChange_Actions_ModifyDisappearingMessageTimerAction) ProtoMessage() {} -func (x *GroupChange_Actions_ModifyDisappearingMessagesTimerAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[32] +func (x *GroupChange_Actions_ModifyDisappearingMessageTimerAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2270,12 +2409,12 @@ func (x *GroupChange_Actions_ModifyDisappearingMessagesTimerAction) ProtoReflect return mi.MessageOf(x) } -// Deprecated: Use GroupChange_Actions_ModifyDisappearingMessagesTimerAction.ProtoReflect.Descriptor instead. -func (*GroupChange_Actions_ModifyDisappearingMessagesTimerAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 16} +// Deprecated: Use GroupChange_Actions_ModifyDisappearingMessageTimerAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_ModifyDisappearingMessageTimerAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 17} } -func (x *GroupChange_Actions_ModifyDisappearingMessagesTimerAction) GetTimer() []byte { +func (x *GroupChange_Actions_ModifyDisappearingMessageTimerAction) GetTimer() []byte { if x != nil { return x.Timer } @@ -2284,14 +2423,14 @@ func (x *GroupChange_Actions_ModifyDisappearingMessagesTimerAction) GetTimer() [ type GroupChange_Actions_ModifyAttributesAccessControlAction struct { state protoimpl.MessageState `protogen:"open.v1"` - AttributesAccess AccessControl_AccessRequired `protobuf:"varint,1,opt,name=attributesAccess,proto3,enum=AccessControl_AccessRequired" json:"attributesAccess,omitempty"` + AttributesAccess AccessControl_AccessRequired `protobuf:"varint,1,opt,name=attributesAccess,proto3,enum=signal.AccessControl_AccessRequired" json:"attributesAccess,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GroupChange_Actions_ModifyAttributesAccessControlAction) Reset() { *x = GroupChange_Actions_ModifyAttributesAccessControlAction{} - mi := &file_Groups_proto_msgTypes[33] + mi := &file_Groups_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2303,7 +2442,7 @@ func (x *GroupChange_Actions_ModifyAttributesAccessControlAction) String() strin func (*GroupChange_Actions_ModifyAttributesAccessControlAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyAttributesAccessControlAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[33] + mi := &file_Groups_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2316,7 +2455,7 @@ func (x *GroupChange_Actions_ModifyAttributesAccessControlAction) ProtoReflect() // Deprecated: Use GroupChange_Actions_ModifyAttributesAccessControlAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyAttributesAccessControlAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 17} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 18} } func (x *GroupChange_Actions_ModifyAttributesAccessControlAction) GetAttributesAccess() AccessControl_AccessRequired { @@ -2328,14 +2467,14 @@ func (x *GroupChange_Actions_ModifyAttributesAccessControlAction) GetAttributesA type GroupChange_Actions_ModifyMembersAccessControlAction struct { state protoimpl.MessageState `protogen:"open.v1"` - MembersAccess AccessControl_AccessRequired `protobuf:"varint,1,opt,name=membersAccess,proto3,enum=AccessControl_AccessRequired" json:"membersAccess,omitempty"` + MembersAccess AccessControl_AccessRequired `protobuf:"varint,1,opt,name=membersAccess,proto3,enum=signal.AccessControl_AccessRequired" json:"membersAccess,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GroupChange_Actions_ModifyMembersAccessControlAction) Reset() { *x = GroupChange_Actions_ModifyMembersAccessControlAction{} - mi := &file_Groups_proto_msgTypes[34] + mi := &file_Groups_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2347,7 +2486,7 @@ func (x *GroupChange_Actions_ModifyMembersAccessControlAction) String() string { func (*GroupChange_Actions_ModifyMembersAccessControlAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyMembersAccessControlAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[34] + mi := &file_Groups_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2360,7 +2499,7 @@ func (x *GroupChange_Actions_ModifyMembersAccessControlAction) ProtoReflect() pr // Deprecated: Use GroupChange_Actions_ModifyMembersAccessControlAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyMembersAccessControlAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 18} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 19} } func (x *GroupChange_Actions_ModifyMembersAccessControlAction) GetMembersAccess() AccessControl_AccessRequired { @@ -2372,14 +2511,14 @@ func (x *GroupChange_Actions_ModifyMembersAccessControlAction) GetMembersAccess( type GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction struct { state protoimpl.MessageState `protogen:"open.v1"` - AddFromInviteLinkAccess AccessControl_AccessRequired `protobuf:"varint,1,opt,name=addFromInviteLinkAccess,proto3,enum=AccessControl_AccessRequired" json:"addFromInviteLinkAccess,omitempty"` + AddFromInviteLinkAccess AccessControl_AccessRequired `protobuf:"varint,1,opt,name=addFromInviteLinkAccess,proto3,enum=signal.AccessControl_AccessRequired" json:"addFromInviteLinkAccess,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction) Reset() { *x = GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction{} - mi := &file_Groups_proto_msgTypes[35] + mi := &file_Groups_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2391,7 +2530,7 @@ func (x *GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction) String( func (*GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[35] + mi := &file_Groups_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2404,7 +2543,7 @@ func (x *GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction) ProtoRe // Deprecated: Use GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 19} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 20} } func (x *GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction) GetAddFromInviteLinkAccess() AccessControl_AccessRequired { @@ -2423,7 +2562,7 @@ type GroupChange_Actions_ModifyInviteLinkPasswordAction struct { func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) Reset() { *x = GroupChange_Actions_ModifyInviteLinkPasswordAction{} - mi := &file_Groups_proto_msgTypes[36] + mi := &file_Groups_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2435,7 +2574,7 @@ func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) String() string { func (*GroupChange_Actions_ModifyInviteLinkPasswordAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[36] + mi := &file_Groups_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2448,7 +2587,7 @@ func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) ProtoReflect() prot // Deprecated: Use GroupChange_Actions_ModifyInviteLinkPasswordAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyInviteLinkPasswordAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 20} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 21} } func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) GetInviteLinkPassword() []byte { @@ -2460,14 +2599,14 @@ func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) GetInviteLinkPasswo type GroupChange_Actions_ModifyAnnouncementsOnlyAction struct { state protoimpl.MessageState `protogen:"open.v1"` - AnnouncementsOnly bool `protobuf:"varint,1,opt,name=announcementsOnly,proto3" json:"announcementsOnly,omitempty"` + AnnouncementsOnly bool `protobuf:"varint,1,opt,name=announcements_only,json=announcementsOnly,proto3" json:"announcements_only,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) Reset() { *x = GroupChange_Actions_ModifyAnnouncementsOnlyAction{} - mi := &file_Groups_proto_msgTypes[37] + mi := &file_Groups_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2479,7 +2618,7 @@ func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) String() string { func (*GroupChange_Actions_ModifyAnnouncementsOnlyAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[37] + mi := &file_Groups_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2492,7 +2631,7 @@ func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) ProtoReflect() proto // Deprecated: Use GroupChange_Actions_ModifyAnnouncementsOnlyAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyAnnouncementsOnlyAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{7, 0, 21} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 22} } func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) GetAnnouncementsOnly() bool { @@ -2512,7 +2651,7 @@ type GroupChanges_GroupChangeState struct { func (x *GroupChanges_GroupChangeState) Reset() { *x = GroupChanges_GroupChangeState{} - mi := &file_Groups_proto_msgTypes[38] + mi := &file_Groups_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2524,7 +2663,7 @@ func (x *GroupChanges_GroupChangeState) String() string { func (*GroupChanges_GroupChangeState) ProtoMessage() {} func (x *GroupChanges_GroupChangeState) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[38] + mi := &file_Groups_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2537,7 +2676,7 @@ func (x *GroupChanges_GroupChangeState) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupChanges_GroupChangeState.ProtoReflect.Descriptor instead. func (*GroupChanges_GroupChangeState) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{9, 0} + return file_Groups_proto_rawDescGZIP(), []int{13, 0} } func (x *GroupChanges_GroupChangeState) GetGroupChange() *GroupChange { @@ -2554,63 +2693,11 @@ func (x *GroupChanges_GroupChangeState) GetGroupState() *Group { return nil } -type GroupInviteLink_GroupInviteLinkContentsV1 struct { - state protoimpl.MessageState `protogen:"open.v1"` - GroupMasterKey []byte `protobuf:"bytes,1,opt,name=groupMasterKey,proto3" json:"groupMasterKey,omitempty"` - InviteLinkPassword []byte `protobuf:"bytes,2,opt,name=inviteLinkPassword,proto3" json:"inviteLinkPassword,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GroupInviteLink_GroupInviteLinkContentsV1) Reset() { - *x = GroupInviteLink_GroupInviteLinkContentsV1{} - mi := &file_Groups_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *GroupInviteLink_GroupInviteLinkContentsV1) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GroupInviteLink_GroupInviteLinkContentsV1) ProtoMessage() {} - -func (x *GroupInviteLink_GroupInviteLinkContentsV1) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[39] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GroupInviteLink_GroupInviteLinkContentsV1.ProtoReflect.Descriptor instead. -func (*GroupInviteLink_GroupInviteLinkContentsV1) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{12, 0} -} - -func (x *GroupInviteLink_GroupInviteLinkContentsV1) GetGroupMasterKey() []byte { - if x != nil { - return x.GroupMasterKey - } - return nil -} - -func (x *GroupInviteLink_GroupInviteLinkContentsV1) GetInviteLinkPassword() []byte { - if x != nil { - return x.InviteLinkPassword - } - return nil -} - var File_Groups_proto protoreflect.FileDescriptor const file_Groups_proto_rawDesc = "" + "\n" + - "\fGroups.proto\"\xc4\x01\n" + + "\fGroups.proto\x12\x06signal\"\xc4\x01\n" + "\x16AvatarUploadAttributes\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x1e\n" + "\n" + @@ -2620,193 +2707,203 @@ const file_Groups_proto_rawDesc = "" + "\talgorithm\x18\x04 \x01(\tR\talgorithm\x12\x12\n" + "\x04date\x18\x05 \x01(\tR\x04date\x12\x16\n" + "\x06policy\x18\x06 \x01(\tR\x06policy\x12\x1c\n" + - "\tsignature\x18\a \x01(\tR\tsignature\"\xe7\x01\n" + + "\tsignature\x18\a \x01(\tR\tsignature\"\xae\x02\n" + "\x06Member\x12\x16\n" + - "\x06userId\x18\x01 \x01(\fR\x06userId\x12 \n" + - "\x04role\x18\x02 \x01(\x0e2\f.Member.RoleR\x04role\x12\x1e\n" + + "\x06userId\x18\x01 \x01(\fR\x06userId\x12'\n" + + "\x04role\x18\x02 \x01(\x0e2\x13.signal.Member.RoleR\x04role\x12\x1e\n" + "\n" + "profileKey\x18\x03 \x01(\fR\n" + "profileKey\x12\"\n" + - "\fpresentation\x18\x04 \x01(\fR\fpresentation\x12*\n" + - "\x10joinedAtRevision\x18\x05 \x01(\rR\x10joinedAtRevision\"3\n" + + "\fpresentation\x18\x04 \x01(\fR\fpresentation\x12(\n" + + "\x0fjoinedAtVersion\x18\x05 \x01(\rR\x0fjoinedAtVersion\x12\x1e\n" + + "\n" + + "labelEmoji\x18\x06 \x01(\fR\n" + + "labelEmoji\x12 \n" + + "\vlabelString\x18\a \x01(\fR\vlabelString\"3\n" + "\x04Role\x12\v\n" + "\aUNKNOWN\x10\x00\x12\v\n" + "\aDEFAULT\x10\x01\x12\x11\n" + - "\rADMINISTRATOR\x10\x02\"t\n" + - "\rPendingMember\x12\x1f\n" + - "\x06member\x18\x01 \x01(\v2\a.MemberR\x06member\x12$\n" + + "\rADMINISTRATOR\x10\x02\"\x85\x01\n" + + "\x17MemberPendingProfileKey\x12&\n" + + "\x06member\x18\x01 \x01(\v2\x0e.signal.MemberR\x06member\x12$\n" + "\raddedByUserId\x18\x02 \x01(\fR\raddedByUserId\x12\x1c\n" + - "\ttimestamp\x18\x03 \x01(\x04R\ttimestamp\"\x8c\x01\n" + - "\x10RequestingMember\x12\x16\n" + + "\ttimestamp\x18\x03 \x01(\x04R\ttimestamp\"\x96\x01\n" + + "\x1aMemberPendingAdminApproval\x12\x16\n" + "\x06userId\x18\x01 \x01(\fR\x06userId\x12\x1e\n" + "\n" + "profileKey\x18\x02 \x01(\fR\n" + "profileKey\x12\"\n" + "\fpresentation\x18\x03 \x01(\fR\fpresentation\x12\x1c\n" + "\ttimestamp\x18\x04 \x01(\x04R\ttimestamp\"D\n" + - "\fBannedMember\x12\x16\n" + + "\fMemberBanned\x12\x16\n" + "\x06userId\x18\x01 \x01(\fR\x06userId\x12\x1c\n" + - "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\"\xae\x02\n" + - "\rAccessControl\x12=\n" + + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\"\xc3\x02\n" + + "\rAccessControl\x12D\n" + "\n" + - "attributes\x18\x01 \x01(\x0e2\x1d.AccessControl.AccessRequiredR\n" + - "attributes\x127\n" + - "\amembers\x18\x02 \x01(\x0e2\x1d.AccessControl.AccessRequiredR\amembers\x12K\n" + - "\x11addFromInviteLink\x18\x03 \x01(\x0e2\x1d.AccessControl.AccessRequiredR\x11addFromInviteLink\"X\n" + + "attributes\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\n" + + "attributes\x12>\n" + + "\amembers\x18\x02 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\amembers\x12R\n" + + "\x11addFromInviteLink\x18\x03 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x11addFromInviteLink\"X\n" + "\x0eAccessRequired\x12\v\n" + "\aUNKNOWN\x10\x00\x12\a\n" + "\x03ANY\x10\x01\x12\n" + "\n" + "\x06MEMBER\x10\x02\x12\x11\n" + "\rADMINISTRATOR\x10\x03\x12\x11\n" + - "\rUNSATISFIABLE\x10\x04\"\xb4\x04\n" + + "\rUNSATISFIABLE\x10\x04\"\x99\x05\n" + "\x05Group\x12\x1c\n" + "\tpublicKey\x18\x01 \x01(\fR\tpublicKey\x12\x14\n" + - "\x05title\x18\x02 \x01(\fR\x05title\x12\x16\n" + - "\x06avatar\x18\x03 \x01(\tR\x06avatar\x12<\n" + - "\x19disappearingMessagesTimer\x18\x04 \x01(\fR\x19disappearingMessagesTimer\x124\n" + - "\raccessControl\x18\x05 \x01(\v2\x0e.AccessControlR\raccessControl\x12\x1a\n" + - "\brevision\x18\x06 \x01(\rR\brevision\x12!\n" + - "\amembers\x18\a \x03(\v2\a.MemberR\amembers\x126\n" + - "\x0ependingMembers\x18\b \x03(\v2\x0e.PendingMemberR\x0ependingMembers\x12?\n" + - "\x11requestingMembers\x18\t \x03(\v2\x11.RequestingMemberR\x11requestingMembers\x12.\n" + + "\x05title\x18\x02 \x01(\fR\x05title\x12 \n" + + "\vdescription\x18\v \x01(\fR\vdescription\x12\x1c\n" + + "\tavatarUrl\x18\x03 \x01(\tR\tavatarUrl\x12<\n" + + "\x19disappearingMessagesTimer\x18\x04 \x01(\fR\x19disappearingMessagesTimer\x12;\n" + + "\raccessControl\x18\x05 \x01(\v2\x15.signal.AccessControlR\raccessControl\x12\x18\n" + + "\aversion\x18\x06 \x01(\rR\aversion\x12(\n" + + "\amembers\x18\a \x03(\v2\x0e.signal.MemberR\amembers\x12[\n" + + "\x18membersPendingProfileKey\x18\b \x03(\v2\x1f.signal.MemberPendingProfileKeyR\x18membersPendingProfileKey\x12d\n" + + "\x1bmembersPendingAdminApproval\x18\t \x03(\v2\".signal.MemberPendingAdminApprovalR\x1bmembersPendingAdminApproval\x12.\n" + "\x12inviteLinkPassword\x18\n" + - " \x01(\fR\x12inviteLinkPassword\x12 \n" + - "\vdescription\x18\v \x01(\fR\vdescription\x12,\n" + - "\x11announcementsOnly\x18\f \x01(\bR\x11announcementsOnly\x123\n" + - "\rbannedMembers\x18\r \x03(\v2\r.BannedMemberR\rbannedMembers\"\xe6!\n" + + " \x01(\fR\x12inviteLinkPassword\x12-\n" + + "\x12announcements_only\x18\f \x01(\bR\x11announcementsOnly\x12;\n" + + "\x0emembers_banned\x18\r \x03(\v2\x14.signal.MemberBannedR\rmembersBanned\"\xc3\x01\n" + + "\x12GroupAttributeBlob\x12\x16\n" + + "\x05title\x18\x01 \x01(\tH\x00R\x05title\x12\x18\n" + + "\x06avatar\x18\x02 \x01(\fH\x00R\x06avatar\x12D\n" + + "\x1cdisappearingMessagesDuration\x18\x03 \x01(\rH\x00R\x1cdisappearingMessagesDuration\x12*\n" + + "\x0fdescriptionText\x18\x04 \x01(\tH\x00R\x0fdescriptionTextB\t\n" + + "\acontent\"\xe7\x01\n" + + "\x0fGroupInviteLink\x12S\n" + + "\n" + + "contentsV1\x18\x01 \x01(\v21.signal.GroupInviteLink.GroupInviteLinkContentsV1H\x00R\n" + + "contentsV1\x1as\n" + + "\x19GroupInviteLinkContentsV1\x12&\n" + + "\x0egroupMasterKey\x18\x01 \x01(\fR\x0egroupMasterKey\x12.\n" + + "\x12inviteLinkPassword\x18\x02 \x01(\fR\x12inviteLinkPasswordB\n" + + "\n" + + "\bcontents\"\xc1\x02\n" + + "\rGroupJoinInfo\x12\x1c\n" + + "\tpublicKey\x18\x01 \x01(\fR\tpublicKey\x12\x14\n" + + "\x05title\x18\x02 \x01(\fR\x05title\x12 \n" + + "\vdescription\x18\b \x01(\fR\vdescription\x12\x16\n" + + "\x06avatar\x18\x03 \x01(\tR\x06avatar\x12 \n" + + "\vmemberCount\x18\x04 \x01(\rR\vmemberCount\x12R\n" + + "\x11addFromInviteLink\x18\x05 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x11addFromInviteLink\x12\x18\n" + + "\aversion\x18\x06 \x01(\rR\aversion\x122\n" + + "\x14pendingAdminApproval\x18\a \x01(\bR\x14pendingAdminApproval\"\xbb'\n" + "\vGroupChange\x12\x18\n" + "\aactions\x18\x01 \x01(\fR\aactions\x12(\n" + "\x0fserverSignature\x18\x02 \x01(\fR\x0fserverSignature\x12 \n" + - "\vchangeEpoch\x18\x03 \x01(\rR\vchangeEpoch\x1a\xf0 \n" + - "\aActions\x12(\n" + - "\x0fsourceServiceId\x18\x01 \x01(\fR\x0fsourceServiceId\x12\x18\n" + - "\agroupId\x18\x19 \x01(\fR\agroupId\x12\x1a\n" + - "\brevision\x18\x02 \x01(\rR\brevision\x12D\n" + + "\vchangeEpoch\x18\x03 \x01(\rR\vchangeEpoch\x1a\xc5&\n" + + "\aActions\x12\"\n" + + "\fsourceUserId\x18\x01 \x01(\fR\fsourceUserId\x12\x19\n" + + "\bgroup_id\x18\x19 \x01(\fR\agroupId\x12\x18\n" + + "\aversion\x18\x02 \x01(\rR\aversion\x12K\n" + "\n" + - "addMembers\x18\x03 \x03(\v2$.GroupChange.Actions.AddMemberActionR\n" + - "addMembers\x12M\n" + - "\rdeleteMembers\x18\x04 \x03(\v2'.GroupChange.Actions.DeleteMemberActionR\rdeleteMembers\x12Y\n" + - "\x11modifyMemberRoles\x18\x05 \x03(\v2+.GroupChange.Actions.ModifyMemberRoleActionR\x11modifyMemberRoles\x12k\n" + - "\x17modifyMemberProfileKeys\x18\x06 \x03(\v21.GroupChange.Actions.ModifyMemberProfileKeyActionR\x17modifyMemberProfileKeys\x12Y\n" + - "\x11addPendingMembers\x18\a \x03(\v2+.GroupChange.Actions.AddPendingMemberActionR\x11addPendingMembers\x12b\n" + - "\x14deletePendingMembers\x18\b \x03(\v2..GroupChange.Actions.DeletePendingMemberActionR\x14deletePendingMembers\x12e\n" + - "\x15promotePendingMembers\x18\t \x03(\v2/.GroupChange.Actions.PromotePendingMemberActionR\x15promotePendingMembers\x12H\n" + + "addMembers\x18\x03 \x03(\v2+.signal.GroupChange.Actions.AddMemberActionR\n" + + "addMembers\x12T\n" + + "\rdeleteMembers\x18\x04 \x03(\v2..signal.GroupChange.Actions.DeleteMemberActionR\rdeleteMembers\x12`\n" + + "\x11modifyMemberRoles\x18\x05 \x03(\v22.signal.GroupChange.Actions.ModifyMemberRoleActionR\x11modifyMemberRoles\x12r\n" + + "\x17modifyMemberProfileKeys\x18\x06 \x03(\v28.signal.GroupChange.Actions.ModifyMemberProfileKeyActionR\x17modifyMemberProfileKeys\x12~\n" + + "\x1baddMembersPendingProfileKey\x18\a \x03(\v2<.signal.GroupChange.Actions.AddMemberPendingProfileKeyActionR\x1baddMembersPendingProfileKey\x12\x87\x01\n" + + "\x1edeleteMembersPendingProfileKey\x18\b \x03(\v2?.signal.GroupChange.Actions.DeleteMemberPendingProfileKeyActionR\x1edeleteMembersPendingProfileKey\x12\x8a\x01\n" + + "\x1fpromoteMembersPendingProfileKey\x18\t \x03(\v2@.signal.GroupChange.Actions.PromoteMemberPendingProfileKeyActionR\x1fpromoteMembersPendingProfileKey\x12O\n" + "\vmodifyTitle\x18\n" + - " \x01(\v2&.GroupChange.Actions.ModifyTitleActionR\vmodifyTitle\x12K\n" + - "\fmodifyAvatar\x18\v \x01(\v2'.GroupChange.Actions.ModifyAvatarActionR\fmodifyAvatar\x12\x84\x01\n" + - "\x1fmodifyDisappearingMessagesTimer\x18\f \x01(\v2:.GroupChange.Actions.ModifyDisappearingMessagesTimerActionR\x1fmodifyDisappearingMessagesTimer\x12p\n" + - "\x16modifyAttributesAccess\x18\r \x01(\v28.GroupChange.Actions.ModifyAttributesAccessControlActionR\x16modifyAttributesAccess\x12e\n" + - "\x12modifyMemberAccess\x18\x0e \x01(\v25.GroupChange.Actions.ModifyMembersAccessControlActionR\x12modifyMemberAccess\x12\x85\x01\n" + - "\x1dmodifyAddFromInviteLinkAccess\x18\x0f \x01(\v2?.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlActionR\x1dmodifyAddFromInviteLinkAccess\x12b\n" + - "\x14addRequestingMembers\x18\x10 \x03(\v2..GroupChange.Actions.AddRequestingMemberActionR\x14addRequestingMembers\x12k\n" + - "\x17deleteRequestingMembers\x18\x11 \x03(\v21.GroupChange.Actions.DeleteRequestingMemberActionR\x17deleteRequestingMembers\x12n\n" + - "\x18promoteRequestingMembers\x18\x12 \x03(\v22.GroupChange.Actions.PromoteRequestingMemberActionR\x18promoteRequestingMembers\x12o\n" + - "\x18modifyInviteLinkPassword\x18\x13 \x01(\v23.GroupChange.Actions.ModifyInviteLinkPasswordActionR\x18modifyInviteLinkPassword\x12Z\n" + - "\x11modifyDescription\x18\x14 \x01(\v2,.GroupChange.Actions.ModifyDescriptionActionR\x11modifyDescription\x12l\n" + - "\x17modifyAnnouncementsOnly\x18\x15 \x01(\v22.GroupChange.Actions.ModifyAnnouncementsOnlyActionR\x17modifyAnnouncementsOnly\x12V\n" + - "\x10addBannedMembers\x18\x16 \x03(\v2*.GroupChange.Actions.AddBannedMemberActionR\x10addBannedMembers\x12_\n" + - "\x13deleteBannedMembers\x18\x17 \x03(\v2-.GroupChange.Actions.DeleteBannedMemberActionR\x13deleteBannedMembers\x12\x81\x01\n" + - "\x1bpromotePendingPniAciMembers\x18\x18 \x03(\v2?.GroupChange.Actions.PromotePendingPniAciMemberProfileKeyActionR\x1bpromotePendingPniAciMembers\x1a`\n" + - "\x0fAddMemberAction\x12\x1d\n" + - "\x05added\x18\x01 \x01(\v2\a.MemberR\x05added\x12.\n" + + " \x01(\v2-.signal.GroupChange.Actions.ModifyTitleActionR\vmodifyTitle\x12R\n" + + "\fmodifyAvatar\x18\v \x01(\v2..signal.GroupChange.Actions.ModifyAvatarActionR\fmodifyAvatar\x12\x88\x01\n" + + "\x1emodifyDisappearingMessageTimer\x18\f \x01(\v2@.signal.GroupChange.Actions.ModifyDisappearingMessageTimerActionR\x1emodifyDisappearingMessageTimer\x12w\n" + + "\x16modifyAttributesAccess\x18\r \x01(\v2?.signal.GroupChange.Actions.ModifyAttributesAccessControlActionR\x16modifyAttributesAccess\x12l\n" + + "\x12modifyMemberAccess\x18\x0e \x01(\v2<.signal.GroupChange.Actions.ModifyMembersAccessControlActionR\x12modifyMemberAccess\x12\x8c\x01\n" + + "\x1dmodifyAddFromInviteLinkAccess\x18\x0f \x01(\v2F.signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlActionR\x1dmodifyAddFromInviteLinkAccess\x12\x87\x01\n" + + "\x1eaddMembersPendingAdminApproval\x18\x10 \x03(\v2?.signal.GroupChange.Actions.AddMemberPendingAdminApprovalActionR\x1eaddMembersPendingAdminApproval\x12\x90\x01\n" + + "!deleteMembersPendingAdminApproval\x18\x11 \x03(\v2B.signal.GroupChange.Actions.DeleteMemberPendingAdminApprovalActionR!deleteMembersPendingAdminApproval\x12\x93\x01\n" + + "\"promoteMembersPendingAdminApproval\x18\x12 \x03(\v2C.signal.GroupChange.Actions.PromoteMemberPendingAdminApprovalActionR\"promoteMembersPendingAdminApproval\x12v\n" + + "\x18modifyInviteLinkPassword\x18\x13 \x01(\v2:.signal.GroupChange.Actions.ModifyInviteLinkPasswordActionR\x18modifyInviteLinkPassword\x12a\n" + + "\x11modifyDescription\x18\x14 \x01(\v23.signal.GroupChange.Actions.ModifyDescriptionActionR\x11modifyDescription\x12u\n" + + "\x19modify_announcements_only\x18\x15 \x01(\v29.signal.GroupChange.Actions.ModifyAnnouncementsOnlyActionR\x17modifyAnnouncementsOnly\x12_\n" + + "\x12add_members_banned\x18\x16 \x03(\v21.signal.GroupChange.Actions.AddMemberBannedActionR\x10addMembersBanned\x12h\n" + + "\x15delete_members_banned\x18\x17 \x03(\v24.signal.GroupChange.Actions.DeleteMemberBannedActionR\x13deleteMembersBanned\x12\xa2\x01\n" + + "+promote_members_pending_pni_aci_profile_key\x18\x18 \x03(\v2F.signal.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyActionR%promoteMembersPendingPniAciProfileKey\x12c\n" + + "\x12modifyMemberLabels\x18\x1a \x03(\v23.signal.GroupChange.Actions.ModifyMemberLabelActionR\x12modifyMemberLabels\x1ag\n" + + "\x0fAddMemberAction\x12$\n" + + "\x05added\x18\x01 \x01(\v2\x0e.signal.MemberR\x05added\x12.\n" + "\x12joinFromInviteLink\x18\x02 \x01(\bR\x12joinFromInviteLink\x1a:\n" + "\x12DeleteMemberAction\x12$\n" + - "\rdeletedUserId\x18\x01 \x01(\fR\rdeletedUserId\x1aR\n" + + "\rdeletedUserId\x18\x01 \x01(\fR\rdeletedUserId\x1aY\n" + "\x16ModifyMemberRoleAction\x12\x16\n" + - "\x06userId\x18\x01 \x01(\fR\x06userId\x12 \n" + - "\x04role\x18\x02 \x01(\x0e2\f.Member.RoleR\x04role\x1a|\n" + + "\x06userId\x18\x01 \x01(\fR\x06userId\x12'\n" + + "\x04role\x18\x02 \x01(\x0e2\x13.signal.Member.RoleR\x04role\x1as\n" + + "\x17ModifyMemberLabelAction\x12\x16\n" + + "\x06userId\x18\x01 \x01(\fR\x06userId\x12\x1e\n" + + "\n" + + "labelEmoji\x18\x02 \x01(\fR\n" + + "labelEmoji\x12 \n" + + "\vlabelString\x18\x03 \x01(\fR\vlabelString\x1a|\n" + "\x1cModifyMemberProfileKeyAction\x12\"\n" + "\fpresentation\x18\x01 \x01(\fR\fpresentation\x12\x17\n" + "\auser_id\x18\x02 \x01(\fR\x06userId\x12\x1f\n" + "\vprofile_key\x18\x03 \x01(\fR\n" + - "profileKey\x1a>\n" + - "\x16AddPendingMemberAction\x12$\n" + - "\x05added\x18\x01 \x01(\v2\x0e.PendingMemberR\x05added\x1aA\n" + - "\x19DeletePendingMemberAction\x12$\n" + - "\rdeletedUserId\x18\x01 \x01(\fR\rdeletedUserId\x1az\n" + - "\x1aPromotePendingMemberAction\x12\"\n" + + "profileKey\x1aY\n" + + " AddMemberPendingProfileKeyAction\x125\n" + + "\x05added\x18\x01 \x01(\v2\x1f.signal.MemberPendingProfileKeyR\x05added\x1aK\n" + + "#DeleteMemberPendingProfileKeyAction\x12$\n" + + "\rdeletedUserId\x18\x01 \x01(\fR\rdeletedUserId\x1a\x84\x01\n" + + "$PromoteMemberPendingProfileKeyAction\x12\"\n" + "\fpresentation\x18\x01 \x01(\fR\fpresentation\x12\x17\n" + "\auser_id\x18\x02 \x01(\fR\x06userId\x12\x1f\n" + "\vprofile_key\x18\x03 \x01(\fR\n" + - "profileKey\x1a\x9a\x01\n" + - "*PromotePendingPniAciMemberProfileKeyAction\x12\"\n" + - "\fpresentation\x18\x01 \x01(\fR\fpresentation\x12\x16\n" + - "\x06userId\x18\x02 \x01(\fR\x06userId\x12\x10\n" + - "\x03pni\x18\x03 \x01(\fR\x03pni\x12\x1e\n" + - "\n" + - "profileKey\x18\x04 \x01(\fR\n" + - "profileKey\x1aD\n" + - "\x19AddRequestingMemberAction\x12'\n" + - "\x05added\x18\x01 \x01(\v2\x11.RequestingMemberR\x05added\x1aD\n" + - "\x1cDeleteRequestingMemberAction\x12$\n" + - "\rdeletedUserId\x18\x01 \x01(\fR\rdeletedUserId\x1aY\n" + - "\x1dPromoteRequestingMemberAction\x12\x16\n" + - "\x06userId\x18\x01 \x01(\fR\x06userId\x12 \n" + - "\x04role\x18\x02 \x01(\x0e2\f.Member.RoleR\x04role\x1a<\n" + - "\x15AddBannedMemberAction\x12#\n" + - "\x05added\x18\x01 \x01(\v2\r.BannedMemberR\x05added\x1a@\n" + - "\x18DeleteBannedMemberAction\x12$\n" + + "profileKey\x1a\x9c\x01\n" + + "*PromoteMemberPendingPniAciProfileKeyAction\x12\"\n" + + "\fpresentation\x18\x01 \x01(\fR\fpresentation\x12\x17\n" + + "\auser_id\x18\x02 \x01(\fR\x06userId\x12\x10\n" + + "\x03pni\x18\x03 \x01(\fR\x03pni\x12\x1f\n" + + "\vprofile_key\x18\x04 \x01(\fR\n" + + "profileKey\x1a_\n" + + "#AddMemberPendingAdminApprovalAction\x128\n" + + "\x05added\x18\x01 \x01(\v2\".signal.MemberPendingAdminApprovalR\x05added\x1aN\n" + + "&DeleteMemberPendingAdminApprovalAction\x12$\n" + + "\rdeletedUserId\x18\x01 \x01(\fR\rdeletedUserId\x1aj\n" + + "'PromoteMemberPendingAdminApprovalAction\x12\x16\n" + + "\x06userId\x18\x01 \x01(\fR\x06userId\x12'\n" + + "\x04role\x18\x02 \x01(\x0e2\x13.signal.Member.RoleR\x04role\x1aC\n" + + "\x15AddMemberBannedAction\x12*\n" + + "\x05added\x18\x01 \x01(\v2\x14.signal.MemberBannedR\x05added\x1a@\n" + + "\x18DeleteMemberBannedAction\x12$\n" + "\rdeletedUserId\x18\x01 \x01(\fR\rdeletedUserId\x1a)\n" + "\x11ModifyTitleAction\x12\x14\n" + "\x05title\x18\x01 \x01(\fR\x05title\x1a;\n" + "\x17ModifyDescriptionAction\x12 \n" + "\vdescription\x18\x01 \x01(\fR\vdescription\x1a,\n" + "\x12ModifyAvatarAction\x12\x16\n" + - "\x06avatar\x18\x01 \x01(\tR\x06avatar\x1a=\n" + - "%ModifyDisappearingMessagesTimerAction\x12\x14\n" + - "\x05timer\x18\x01 \x01(\fR\x05timer\x1ap\n" + - "#ModifyAttributesAccessControlAction\x12I\n" + - "\x10attributesAccess\x18\x01 \x01(\x0e2\x1d.AccessControl.AccessRequiredR\x10attributesAccess\x1ag\n" + - " ModifyMembersAccessControlAction\x12C\n" + - "\rmembersAccess\x18\x01 \x01(\x0e2\x1d.AccessControl.AccessRequiredR\rmembersAccess\x1a\x85\x01\n" + - "*ModifyAddFromInviteLinkAccessControlAction\x12W\n" + - "\x17addFromInviteLinkAccess\x18\x01 \x01(\x0e2\x1d.AccessControl.AccessRequiredR\x17addFromInviteLinkAccess\x1aP\n" + + "\x06avatar\x18\x01 \x01(\tR\x06avatar\x1a<\n" + + "$ModifyDisappearingMessageTimerAction\x12\x14\n" + + "\x05timer\x18\x01 \x01(\fR\x05timer\x1aw\n" + + "#ModifyAttributesAccessControlAction\x12P\n" + + "\x10attributesAccess\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x10attributesAccess\x1an\n" + + " ModifyMembersAccessControlAction\x12J\n" + + "\rmembersAccess\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\rmembersAccess\x1a\x8c\x01\n" + + "*ModifyAddFromInviteLinkAccessControlAction\x12^\n" + + "\x17addFromInviteLinkAccess\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x17addFromInviteLinkAccess\x1aP\n" + "\x1eModifyInviteLinkPasswordAction\x12.\n" + - "\x12inviteLinkPassword\x18\x01 \x01(\fR\x12inviteLinkPassword\x1aM\n" + - "\x1dModifyAnnouncementsOnlyAction\x12,\n" + - "\x11announcementsOnly\x18\x01 \x01(\bR\x11announcementsOnly\"s\n" + - "\rGroupResponse\x12\x1c\n" + - "\x05group\x18\x01 \x01(\v2\x06.GroupR\x05group\x12D\n" + - "\x1dgroupSendEndorsementsResponse\x18\x02 \x01(\fR\x1dgroupSendEndorsementsResponse\"\x84\x02\n" + - "\fGroupChanges\x12B\n" + - "\fgroupChanges\x18\x01 \x03(\v2\x1e.GroupChanges.GroupChangeStateR\fgroupChanges\x12D\n" + - "\x1dgroupSendEndorsementsResponse\x18\x02 \x01(\fR\x1dgroupSendEndorsementsResponse\x1aj\n" + - "\x10GroupChangeState\x12.\n" + - "\vgroupChange\x18\x01 \x01(\v2\f.GroupChangeR\vgroupChange\x12&\n" + + "\x12inviteLinkPassword\x18\x01 \x01(\fR\x12inviteLinkPassword\x1aN\n" + + "\x1dModifyAnnouncementsOnlyAction\x12-\n" + + "\x12announcements_only\x18\x01 \x01(\bR\x11announcementsOnly\"/\n" + + "\x17ExternalGroupCredential\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\"}\n" + + "\rGroupResponse\x12#\n" + + "\x05group\x18\x01 \x01(\v2\r.signal.GroupR\x05group\x12G\n" + + " group_send_endorsements_response\x18\x02 \x01(\fR\x1dgroupSendEndorsementsResponse\"\x9c\x02\n" + + "\fGroupChanges\x12I\n" + + "\fgroupChanges\x18\x01 \x03(\v2%.signal.GroupChanges.GroupChangeStateR\fgroupChanges\x12G\n" + + " group_send_endorsements_response\x18\x02 \x01(\fR\x1dgroupSendEndorsementsResponse\x1ax\n" + + "\x10GroupChangeState\x125\n" + + "\vgroupChange\x18\x01 \x01(\v2\x13.signal.GroupChangeR\vgroupChange\x12-\n" + "\n" + - "groupState\x18\x02 \x01(\v2\x06.GroupR\n" + - "groupState\"\x8b\x01\n" + - "\x13GroupChangeResponse\x12.\n" + - "\vgroupChange\x18\x01 \x01(\v2\f.GroupChangeR\vgroupChange\x12D\n" + - "\x1dgroupSendEndorsementsResponse\x18\x02 \x01(\fR\x1dgroupSendEndorsementsResponse\"\xbb\x01\n" + - "\x12GroupAttributeBlob\x12\x16\n" + - "\x05title\x18\x01 \x01(\tH\x00R\x05title\x12\x18\n" + - "\x06avatar\x18\x02 \x01(\fH\x00R\x06avatar\x12D\n" + - "\x1cdisappearingMessagesDuration\x18\x03 \x01(\rH\x00R\x1cdisappearingMessagesDuration\x12\"\n" + - "\vdescription\x18\x04 \x01(\tH\x00R\vdescriptionB\t\n" + - "\acontent\"\xe0\x01\n" + - "\x0fGroupInviteLink\x12L\n" + - "\n" + - "v1Contents\x18\x01 \x01(\v2*.GroupInviteLink.GroupInviteLinkContentsV1H\x00R\n" + - "v1Contents\x1as\n" + - "\x19GroupInviteLinkContentsV1\x12&\n" + - "\x0egroupMasterKey\x18\x01 \x01(\fR\x0egroupMasterKey\x12.\n" + - "\x12inviteLinkPassword\x18\x02 \x01(\fR\x12inviteLinkPasswordB\n" + - "\n" + - "\bcontents\"\xbc\x02\n" + - "\rGroupJoinInfo\x12\x1c\n" + - "\tpublicKey\x18\x01 \x01(\fR\tpublicKey\x12\x14\n" + - "\x05title\x18\x02 \x01(\fR\x05title\x12\x16\n" + - "\x06avatar\x18\x03 \x01(\tR\x06avatar\x12 \n" + - "\vmemberCount\x18\x04 \x01(\rR\vmemberCount\x12K\n" + - "\x11addFromInviteLink\x18\x05 \x01(\x0e2\x1d.AccessControl.AccessRequiredR\x11addFromInviteLink\x12\x1a\n" + - "\brevision\x18\x06 \x01(\rR\brevision\x122\n" + - "\x14pendingAdminApproval\x18\a \x01(\bR\x14pendingAdminApproval\x12 \n" + - "\vdescription\x18\b \x01(\fR\vdescription\"/\n" + - "\x17GroupExternalCredential\x12\x14\n" + - "\x05token\x18\x01 \x01(\tR\x05tokenB+\n" + - "'org.signal.storageservice.protos.groupsP\x01b\x06proto3" + "groupState\x18\x02 \x01(\v2\r.signal.GroupR\n" + + "groupState\"\x96\x01\n" + + "\x13GroupChangeResponse\x126\n" + + "\fgroup_change\x18\x01 \x01(\v2\x13.signal.GroupChangeR\vgroupChange\x12G\n" + + " group_send_endorsements_response\x18\x02 \x01(\fR\x1dgroupSendEndorsementsResponseB@\n" + + "/org.signal.storageservice.storage.protos.groupsB\vGroupProtosP\x01b\x06proto3" var ( file_Groups_proto_rawDescOnce sync.Once @@ -2821,105 +2918,107 @@ func file_Groups_proto_rawDescGZIP() []byte { } var file_Groups_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_Groups_proto_msgTypes = make([]protoimpl.MessageInfo, 40) +var file_Groups_proto_msgTypes = make([]protoimpl.MessageInfo, 41) var file_Groups_proto_goTypes = []any{ - (Member_Role)(0), // 0: Member.Role - (AccessControl_AccessRequired)(0), // 1: AccessControl.AccessRequired - (*AvatarUploadAttributes)(nil), // 2: AvatarUploadAttributes - (*Member)(nil), // 3: Member - (*PendingMember)(nil), // 4: PendingMember - (*RequestingMember)(nil), // 5: RequestingMember - (*BannedMember)(nil), // 6: BannedMember - (*AccessControl)(nil), // 7: AccessControl - (*Group)(nil), // 8: Group - (*GroupChange)(nil), // 9: GroupChange - (*GroupResponse)(nil), // 10: GroupResponse - (*GroupChanges)(nil), // 11: GroupChanges - (*GroupChangeResponse)(nil), // 12: GroupChangeResponse - (*GroupAttributeBlob)(nil), // 13: GroupAttributeBlob - (*GroupInviteLink)(nil), // 14: GroupInviteLink - (*GroupJoinInfo)(nil), // 15: GroupJoinInfo - (*GroupExternalCredential)(nil), // 16: GroupExternalCredential - (*GroupChange_Actions)(nil), // 17: GroupChange.Actions - (*GroupChange_Actions_AddMemberAction)(nil), // 18: GroupChange.Actions.AddMemberAction - (*GroupChange_Actions_DeleteMemberAction)(nil), // 19: GroupChange.Actions.DeleteMemberAction - (*GroupChange_Actions_ModifyMemberRoleAction)(nil), // 20: GroupChange.Actions.ModifyMemberRoleAction - (*GroupChange_Actions_ModifyMemberProfileKeyAction)(nil), // 21: GroupChange.Actions.ModifyMemberProfileKeyAction - (*GroupChange_Actions_AddPendingMemberAction)(nil), // 22: GroupChange.Actions.AddPendingMemberAction - (*GroupChange_Actions_DeletePendingMemberAction)(nil), // 23: GroupChange.Actions.DeletePendingMemberAction - (*GroupChange_Actions_PromotePendingMemberAction)(nil), // 24: GroupChange.Actions.PromotePendingMemberAction - (*GroupChange_Actions_PromotePendingPniAciMemberProfileKeyAction)(nil), // 25: GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction - (*GroupChange_Actions_AddRequestingMemberAction)(nil), // 26: GroupChange.Actions.AddRequestingMemberAction - (*GroupChange_Actions_DeleteRequestingMemberAction)(nil), // 27: GroupChange.Actions.DeleteRequestingMemberAction - (*GroupChange_Actions_PromoteRequestingMemberAction)(nil), // 28: GroupChange.Actions.PromoteRequestingMemberAction - (*GroupChange_Actions_AddBannedMemberAction)(nil), // 29: GroupChange.Actions.AddBannedMemberAction - (*GroupChange_Actions_DeleteBannedMemberAction)(nil), // 30: GroupChange.Actions.DeleteBannedMemberAction - (*GroupChange_Actions_ModifyTitleAction)(nil), // 31: GroupChange.Actions.ModifyTitleAction - (*GroupChange_Actions_ModifyDescriptionAction)(nil), // 32: GroupChange.Actions.ModifyDescriptionAction - (*GroupChange_Actions_ModifyAvatarAction)(nil), // 33: GroupChange.Actions.ModifyAvatarAction - (*GroupChange_Actions_ModifyDisappearingMessagesTimerAction)(nil), // 34: GroupChange.Actions.ModifyDisappearingMessagesTimerAction - (*GroupChange_Actions_ModifyAttributesAccessControlAction)(nil), // 35: GroupChange.Actions.ModifyAttributesAccessControlAction - (*GroupChange_Actions_ModifyMembersAccessControlAction)(nil), // 36: GroupChange.Actions.ModifyMembersAccessControlAction - (*GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction)(nil), // 37: GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction - (*GroupChange_Actions_ModifyInviteLinkPasswordAction)(nil), // 38: GroupChange.Actions.ModifyInviteLinkPasswordAction - (*GroupChange_Actions_ModifyAnnouncementsOnlyAction)(nil), // 39: GroupChange.Actions.ModifyAnnouncementsOnlyAction - (*GroupChanges_GroupChangeState)(nil), // 40: GroupChanges.GroupChangeState - (*GroupInviteLink_GroupInviteLinkContentsV1)(nil), // 41: GroupInviteLink.GroupInviteLinkContentsV1 + (Member_Role)(0), // 0: signal.Member.Role + (AccessControl_AccessRequired)(0), // 1: signal.AccessControl.AccessRequired + (*AvatarUploadAttributes)(nil), // 2: signal.AvatarUploadAttributes + (*Member)(nil), // 3: signal.Member + (*MemberPendingProfileKey)(nil), // 4: signal.MemberPendingProfileKey + (*MemberPendingAdminApproval)(nil), // 5: signal.MemberPendingAdminApproval + (*MemberBanned)(nil), // 6: signal.MemberBanned + (*AccessControl)(nil), // 7: signal.AccessControl + (*Group)(nil), // 8: signal.Group + (*GroupAttributeBlob)(nil), // 9: signal.GroupAttributeBlob + (*GroupInviteLink)(nil), // 10: signal.GroupInviteLink + (*GroupJoinInfo)(nil), // 11: signal.GroupJoinInfo + (*GroupChange)(nil), // 12: signal.GroupChange + (*ExternalGroupCredential)(nil), // 13: signal.ExternalGroupCredential + (*GroupResponse)(nil), // 14: signal.GroupResponse + (*GroupChanges)(nil), // 15: signal.GroupChanges + (*GroupChangeResponse)(nil), // 16: signal.GroupChangeResponse + (*GroupInviteLink_GroupInviteLinkContentsV1)(nil), // 17: signal.GroupInviteLink.GroupInviteLinkContentsV1 + (*GroupChange_Actions)(nil), // 18: signal.GroupChange.Actions + (*GroupChange_Actions_AddMemberAction)(nil), // 19: signal.GroupChange.Actions.AddMemberAction + (*GroupChange_Actions_DeleteMemberAction)(nil), // 20: signal.GroupChange.Actions.DeleteMemberAction + (*GroupChange_Actions_ModifyMemberRoleAction)(nil), // 21: signal.GroupChange.Actions.ModifyMemberRoleAction + (*GroupChange_Actions_ModifyMemberLabelAction)(nil), // 22: signal.GroupChange.Actions.ModifyMemberLabelAction + (*GroupChange_Actions_ModifyMemberProfileKeyAction)(nil), // 23: signal.GroupChange.Actions.ModifyMemberProfileKeyAction + (*GroupChange_Actions_AddMemberPendingProfileKeyAction)(nil), // 24: signal.GroupChange.Actions.AddMemberPendingProfileKeyAction + (*GroupChange_Actions_DeleteMemberPendingProfileKeyAction)(nil), // 25: signal.GroupChange.Actions.DeleteMemberPendingProfileKeyAction + (*GroupChange_Actions_PromoteMemberPendingProfileKeyAction)(nil), // 26: signal.GroupChange.Actions.PromoteMemberPendingProfileKeyAction + (*GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction)(nil), // 27: signal.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction + (*GroupChange_Actions_AddMemberPendingAdminApprovalAction)(nil), // 28: signal.GroupChange.Actions.AddMemberPendingAdminApprovalAction + (*GroupChange_Actions_DeleteMemberPendingAdminApprovalAction)(nil), // 29: signal.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction + (*GroupChange_Actions_PromoteMemberPendingAdminApprovalAction)(nil), // 30: signal.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction + (*GroupChange_Actions_AddMemberBannedAction)(nil), // 31: signal.GroupChange.Actions.AddMemberBannedAction + (*GroupChange_Actions_DeleteMemberBannedAction)(nil), // 32: signal.GroupChange.Actions.DeleteMemberBannedAction + (*GroupChange_Actions_ModifyTitleAction)(nil), // 33: signal.GroupChange.Actions.ModifyTitleAction + (*GroupChange_Actions_ModifyDescriptionAction)(nil), // 34: signal.GroupChange.Actions.ModifyDescriptionAction + (*GroupChange_Actions_ModifyAvatarAction)(nil), // 35: signal.GroupChange.Actions.ModifyAvatarAction + (*GroupChange_Actions_ModifyDisappearingMessageTimerAction)(nil), // 36: signal.GroupChange.Actions.ModifyDisappearingMessageTimerAction + (*GroupChange_Actions_ModifyAttributesAccessControlAction)(nil), // 37: signal.GroupChange.Actions.ModifyAttributesAccessControlAction + (*GroupChange_Actions_ModifyMembersAccessControlAction)(nil), // 38: signal.GroupChange.Actions.ModifyMembersAccessControlAction + (*GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction)(nil), // 39: signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction + (*GroupChange_Actions_ModifyInviteLinkPasswordAction)(nil), // 40: signal.GroupChange.Actions.ModifyInviteLinkPasswordAction + (*GroupChange_Actions_ModifyAnnouncementsOnlyAction)(nil), // 41: signal.GroupChange.Actions.ModifyAnnouncementsOnlyAction + (*GroupChanges_GroupChangeState)(nil), // 42: signal.GroupChanges.GroupChangeState } var file_Groups_proto_depIdxs = []int32{ - 0, // 0: Member.role:type_name -> Member.Role - 3, // 1: PendingMember.member:type_name -> Member - 1, // 2: AccessControl.attributes:type_name -> AccessControl.AccessRequired - 1, // 3: AccessControl.members:type_name -> AccessControl.AccessRequired - 1, // 4: AccessControl.addFromInviteLink:type_name -> AccessControl.AccessRequired - 7, // 5: Group.accessControl:type_name -> AccessControl - 3, // 6: Group.members:type_name -> Member - 4, // 7: Group.pendingMembers:type_name -> PendingMember - 5, // 8: Group.requestingMembers:type_name -> RequestingMember - 6, // 9: Group.bannedMembers:type_name -> BannedMember - 8, // 10: GroupResponse.group:type_name -> Group - 40, // 11: GroupChanges.groupChanges:type_name -> GroupChanges.GroupChangeState - 9, // 12: GroupChangeResponse.groupChange:type_name -> GroupChange - 41, // 13: GroupInviteLink.v1Contents:type_name -> GroupInviteLink.GroupInviteLinkContentsV1 - 1, // 14: GroupJoinInfo.addFromInviteLink:type_name -> AccessControl.AccessRequired - 18, // 15: GroupChange.Actions.addMembers:type_name -> GroupChange.Actions.AddMemberAction - 19, // 16: GroupChange.Actions.deleteMembers:type_name -> GroupChange.Actions.DeleteMemberAction - 20, // 17: GroupChange.Actions.modifyMemberRoles:type_name -> GroupChange.Actions.ModifyMemberRoleAction - 21, // 18: GroupChange.Actions.modifyMemberProfileKeys:type_name -> GroupChange.Actions.ModifyMemberProfileKeyAction - 22, // 19: GroupChange.Actions.addPendingMembers:type_name -> GroupChange.Actions.AddPendingMemberAction - 23, // 20: GroupChange.Actions.deletePendingMembers:type_name -> GroupChange.Actions.DeletePendingMemberAction - 24, // 21: GroupChange.Actions.promotePendingMembers:type_name -> GroupChange.Actions.PromotePendingMemberAction - 31, // 22: GroupChange.Actions.modifyTitle:type_name -> GroupChange.Actions.ModifyTitleAction - 33, // 23: GroupChange.Actions.modifyAvatar:type_name -> GroupChange.Actions.ModifyAvatarAction - 34, // 24: GroupChange.Actions.modifyDisappearingMessagesTimer:type_name -> GroupChange.Actions.ModifyDisappearingMessagesTimerAction - 35, // 25: GroupChange.Actions.modifyAttributesAccess:type_name -> GroupChange.Actions.ModifyAttributesAccessControlAction - 36, // 26: GroupChange.Actions.modifyMemberAccess:type_name -> GroupChange.Actions.ModifyMembersAccessControlAction - 37, // 27: GroupChange.Actions.modifyAddFromInviteLinkAccess:type_name -> GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction - 26, // 28: GroupChange.Actions.addRequestingMembers:type_name -> GroupChange.Actions.AddRequestingMemberAction - 27, // 29: GroupChange.Actions.deleteRequestingMembers:type_name -> GroupChange.Actions.DeleteRequestingMemberAction - 28, // 30: GroupChange.Actions.promoteRequestingMembers:type_name -> GroupChange.Actions.PromoteRequestingMemberAction - 38, // 31: GroupChange.Actions.modifyInviteLinkPassword:type_name -> GroupChange.Actions.ModifyInviteLinkPasswordAction - 32, // 32: GroupChange.Actions.modifyDescription:type_name -> GroupChange.Actions.ModifyDescriptionAction - 39, // 33: GroupChange.Actions.modifyAnnouncementsOnly:type_name -> GroupChange.Actions.ModifyAnnouncementsOnlyAction - 29, // 34: GroupChange.Actions.addBannedMembers:type_name -> GroupChange.Actions.AddBannedMemberAction - 30, // 35: GroupChange.Actions.deleteBannedMembers:type_name -> GroupChange.Actions.DeleteBannedMemberAction - 25, // 36: GroupChange.Actions.promotePendingPniAciMembers:type_name -> GroupChange.Actions.PromotePendingPniAciMemberProfileKeyAction - 3, // 37: GroupChange.Actions.AddMemberAction.added:type_name -> Member - 0, // 38: GroupChange.Actions.ModifyMemberRoleAction.role:type_name -> Member.Role - 4, // 39: GroupChange.Actions.AddPendingMemberAction.added:type_name -> PendingMember - 5, // 40: GroupChange.Actions.AddRequestingMemberAction.added:type_name -> RequestingMember - 0, // 41: GroupChange.Actions.PromoteRequestingMemberAction.role:type_name -> Member.Role - 6, // 42: GroupChange.Actions.AddBannedMemberAction.added:type_name -> BannedMember - 1, // 43: GroupChange.Actions.ModifyAttributesAccessControlAction.attributesAccess:type_name -> AccessControl.AccessRequired - 1, // 44: GroupChange.Actions.ModifyMembersAccessControlAction.membersAccess:type_name -> AccessControl.AccessRequired - 1, // 45: GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.addFromInviteLinkAccess:type_name -> AccessControl.AccessRequired - 9, // 46: GroupChanges.GroupChangeState.groupChange:type_name -> GroupChange - 8, // 47: GroupChanges.GroupChangeState.groupState:type_name -> Group - 48, // [48:48] is the sub-list for method output_type - 48, // [48:48] is the sub-list for method input_type - 48, // [48:48] is the sub-list for extension type_name - 48, // [48:48] is the sub-list for extension extendee - 0, // [0:48] is the sub-list for field type_name + 0, // 0: signal.Member.role:type_name -> signal.Member.Role + 3, // 1: signal.MemberPendingProfileKey.member:type_name -> signal.Member + 1, // 2: signal.AccessControl.attributes:type_name -> signal.AccessControl.AccessRequired + 1, // 3: signal.AccessControl.members:type_name -> signal.AccessControl.AccessRequired + 1, // 4: signal.AccessControl.addFromInviteLink:type_name -> signal.AccessControl.AccessRequired + 7, // 5: signal.Group.accessControl:type_name -> signal.AccessControl + 3, // 6: signal.Group.members:type_name -> signal.Member + 4, // 7: signal.Group.membersPendingProfileKey:type_name -> signal.MemberPendingProfileKey + 5, // 8: signal.Group.membersPendingAdminApproval:type_name -> signal.MemberPendingAdminApproval + 6, // 9: signal.Group.members_banned:type_name -> signal.MemberBanned + 17, // 10: signal.GroupInviteLink.contentsV1:type_name -> signal.GroupInviteLink.GroupInviteLinkContentsV1 + 1, // 11: signal.GroupJoinInfo.addFromInviteLink:type_name -> signal.AccessControl.AccessRequired + 8, // 12: signal.GroupResponse.group:type_name -> signal.Group + 42, // 13: signal.GroupChanges.groupChanges:type_name -> signal.GroupChanges.GroupChangeState + 12, // 14: signal.GroupChangeResponse.group_change:type_name -> signal.GroupChange + 19, // 15: signal.GroupChange.Actions.addMembers:type_name -> signal.GroupChange.Actions.AddMemberAction + 20, // 16: signal.GroupChange.Actions.deleteMembers:type_name -> signal.GroupChange.Actions.DeleteMemberAction + 21, // 17: signal.GroupChange.Actions.modifyMemberRoles:type_name -> signal.GroupChange.Actions.ModifyMemberRoleAction + 23, // 18: signal.GroupChange.Actions.modifyMemberProfileKeys:type_name -> signal.GroupChange.Actions.ModifyMemberProfileKeyAction + 24, // 19: signal.GroupChange.Actions.addMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.AddMemberPendingProfileKeyAction + 25, // 20: signal.GroupChange.Actions.deleteMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.DeleteMemberPendingProfileKeyAction + 26, // 21: signal.GroupChange.Actions.promoteMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.PromoteMemberPendingProfileKeyAction + 33, // 22: signal.GroupChange.Actions.modifyTitle:type_name -> signal.GroupChange.Actions.ModifyTitleAction + 35, // 23: signal.GroupChange.Actions.modifyAvatar:type_name -> signal.GroupChange.Actions.ModifyAvatarAction + 36, // 24: signal.GroupChange.Actions.modifyDisappearingMessageTimer:type_name -> signal.GroupChange.Actions.ModifyDisappearingMessageTimerAction + 37, // 25: signal.GroupChange.Actions.modifyAttributesAccess:type_name -> signal.GroupChange.Actions.ModifyAttributesAccessControlAction + 38, // 26: signal.GroupChange.Actions.modifyMemberAccess:type_name -> signal.GroupChange.Actions.ModifyMembersAccessControlAction + 39, // 27: signal.GroupChange.Actions.modifyAddFromInviteLinkAccess:type_name -> signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction + 28, // 28: signal.GroupChange.Actions.addMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.AddMemberPendingAdminApprovalAction + 29, // 29: signal.GroupChange.Actions.deleteMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction + 30, // 30: signal.GroupChange.Actions.promoteMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction + 40, // 31: signal.GroupChange.Actions.modifyInviteLinkPassword:type_name -> signal.GroupChange.Actions.ModifyInviteLinkPasswordAction + 34, // 32: signal.GroupChange.Actions.modifyDescription:type_name -> signal.GroupChange.Actions.ModifyDescriptionAction + 41, // 33: signal.GroupChange.Actions.modify_announcements_only:type_name -> signal.GroupChange.Actions.ModifyAnnouncementsOnlyAction + 31, // 34: signal.GroupChange.Actions.add_members_banned:type_name -> signal.GroupChange.Actions.AddMemberBannedAction + 32, // 35: signal.GroupChange.Actions.delete_members_banned:type_name -> signal.GroupChange.Actions.DeleteMemberBannedAction + 27, // 36: signal.GroupChange.Actions.promote_members_pending_pni_aci_profile_key:type_name -> signal.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction + 22, // 37: signal.GroupChange.Actions.modifyMemberLabels:type_name -> signal.GroupChange.Actions.ModifyMemberLabelAction + 3, // 38: signal.GroupChange.Actions.AddMemberAction.added:type_name -> signal.Member + 0, // 39: signal.GroupChange.Actions.ModifyMemberRoleAction.role:type_name -> signal.Member.Role + 4, // 40: signal.GroupChange.Actions.AddMemberPendingProfileKeyAction.added:type_name -> signal.MemberPendingProfileKey + 5, // 41: signal.GroupChange.Actions.AddMemberPendingAdminApprovalAction.added:type_name -> signal.MemberPendingAdminApproval + 0, // 42: signal.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.role:type_name -> signal.Member.Role + 6, // 43: signal.GroupChange.Actions.AddMemberBannedAction.added:type_name -> signal.MemberBanned + 1, // 44: signal.GroupChange.Actions.ModifyAttributesAccessControlAction.attributesAccess:type_name -> signal.AccessControl.AccessRequired + 1, // 45: signal.GroupChange.Actions.ModifyMembersAccessControlAction.membersAccess:type_name -> signal.AccessControl.AccessRequired + 1, // 46: signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.addFromInviteLinkAccess:type_name -> signal.AccessControl.AccessRequired + 12, // 47: signal.GroupChanges.GroupChangeState.groupChange:type_name -> signal.GroupChange + 8, // 48: signal.GroupChanges.GroupChangeState.groupState:type_name -> signal.Group + 49, // [49:49] is the sub-list for method output_type + 49, // [49:49] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name } func init() { file_Groups_proto_init() } @@ -2927,14 +3026,14 @@ func file_Groups_proto_init() { if File_Groups_proto != nil { return } - file_Groups_proto_msgTypes[11].OneofWrappers = []any{ + file_Groups_proto_msgTypes[7].OneofWrappers = []any{ (*GroupAttributeBlob_Title)(nil), (*GroupAttributeBlob_Avatar)(nil), (*GroupAttributeBlob_DisappearingMessagesDuration)(nil), - (*GroupAttributeBlob_Description)(nil), + (*GroupAttributeBlob_DescriptionText)(nil), } - file_Groups_proto_msgTypes[12].OneofWrappers = []any{ - (*GroupInviteLink_V1Contents)(nil), + file_Groups_proto_msgTypes[8].OneofWrappers = []any{ + (*GroupInviteLink_ContentsV1)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -2942,7 +3041,7 @@ func file_Groups_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_Groups_proto_rawDesc), len(file_Groups_proto_rawDesc)), NumEnums: 2, - NumMessages: 40, + NumMessages: 41, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/signalmeow/protobuf/Groups.proto b/pkg/signalmeow/protobuf/Groups.proto index e202eb2..448846a 100644 --- a/pkg/signalmeow/protobuf/Groups.proto +++ b/pkg/signalmeow/protobuf/Groups.proto @@ -1,92 +1,137 @@ -/** - * Copyright (C) 2019 Open Whisper Systems - * - * Licensed according to the LICENSE file in this repository. +/* + * Copyright 2020 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only */ + syntax = "proto3"; -option java_package = "org.signal.storageservice.protos.groups"; +package signal; + +option java_package = "org.signal.storageservice.storage.protos.groups"; +option java_outer_classname = "GroupProtos"; option java_multiple_files = true; message AvatarUploadAttributes { - string key = 1; + string key = 1; string credential = 2; - string acl = 3; - string algorithm = 4; - string date = 5; - string policy = 6; - string signature = 7; + string acl = 3; + string algorithm = 4; + string date = 5; + string policy = 6; + string signature = 7; } +// Stored data + message Member { enum Role { - UNKNOWN = 0; - DEFAULT = 1; + UNKNOWN = 0; + DEFAULT = 1; ADMINISTRATOR = 2; } - bytes userId = 1; - Role role = 2; - bytes profileKey = 3; - bytes presentation = 4; // Only set when sending to server - uint32 joinedAtRevision = 5; + bytes userId = 1; + Role role = 2; + bytes profileKey = 3; + bytes presentation = 4; + uint32 joinedAtVersion = 5; + bytes labelEmoji = 6; // decrypts to a UTF-8 string + bytes labelString = 7; // decrypts to a UTF-8 string } -message PendingMember { - Member member = 1; - bytes addedByUserId = 2; - uint64 timestamp = 3; +message MemberPendingProfileKey { + Member member = 1; + bytes addedByUserId = 2; + uint64 timestamp = 3; // ms since epoch } -message RequestingMember { - bytes userId = 1; - bytes profileKey = 2; - bytes presentation = 3; // Only set when sending to server - uint64 timestamp = 4; +message MemberPendingAdminApproval { + bytes userId = 1; + bytes profileKey = 2; + bytes presentation = 3; + uint64 timestamp = 4; // ms since epoch } -message BannedMember { - bytes userId = 1; - uint64 timestamp = 2; +message MemberBanned { + bytes userId = 1; + uint64 timestamp = 2; // ms since epoch } message AccessControl { enum AccessRequired { - UNKNOWN = 0; - ANY = 1; - MEMBER = 2; + UNKNOWN = 0; + ANY = 1; + MEMBER = 2; ADMINISTRATOR = 3; UNSATISFIABLE = 4; } - AccessRequired attributes = 1; - AccessRequired members = 2; + AccessRequired attributes = 1; + AccessRequired members = 2; AccessRequired addFromInviteLink = 3; } message Group { - bytes publicKey = 1; - bytes title = 2; - string avatar = 3; - bytes disappearingMessagesTimer = 4; - AccessControl accessControl = 5; - uint32 revision = 6; - repeated Member members = 7; - repeated PendingMember pendingMembers = 8; - repeated RequestingMember requestingMembers = 9; - bytes inviteLinkPassword = 10; - bytes description = 11; - bool announcementsOnly = 12; - repeated BannedMember bannedMembers = 13; + bytes publicKey = 1; + bytes title = 2; + bytes description = 11; + // The URL for this group's avatar. The content at this URL can be + // decrypted/deserialized into a `GroupAttributeBlob`. + string avatarUrl = 3; + bytes 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; + // next: 14 } +message GroupAttributeBlob { + oneof content { + string title = 1; + bytes avatar = 2; + uint32 disappearingMessagesDuration = 3; + string descriptionText = 4; + } +} + +message GroupInviteLink { + message GroupInviteLinkContentsV1 { + bytes groupMasterKey = 1; + bytes inviteLinkPassword = 2; + } + + oneof contents { + GroupInviteLinkContentsV1 contentsV1 = 1; + } +} + +message GroupJoinInfo { + bytes publicKey = 1; + bytes title = 2; + bytes description = 8; + string avatar = 3; + uint32 memberCount = 4; + AccessControl.AccessRequired addFromInviteLink = 5; + uint32 version = 6; + bool pendingAdminApproval = 7; + // bool pendingAdminApprovalFull = 9; + // next: 10 +} + +// Deltas + message GroupChange { message Actions { message AddMemberAction { - Member added = 1; - bool joinFromInviteLink = 2; + Member added = 1; + bool joinFromInviteLink = 2; } message DeleteMemberAction { @@ -94,55 +139,61 @@ message GroupChange { } message ModifyMemberRoleAction { - bytes userId = 1; - Member.Role role = 2; + bytes userId = 1; + Member.Role role = 2; + } + + message ModifyMemberLabelAction { + bytes userId = 1; + bytes labelEmoji = 2; // decrypts to a UTF-8 string + bytes labelString = 3; // decrypts to a UTF-8 string } message ModifyMemberProfileKeyAction { - bytes presentation = 1; // Only set when sending to server - bytes user_id = 2; // Only set when receiving from server - bytes profile_key = 3; // Only set when receiving from server + bytes presentation = 1; + bytes user_id = 2; + bytes profile_key = 3; } - message AddPendingMemberAction { - PendingMember added = 1; + message AddMemberPendingProfileKeyAction { + MemberPendingProfileKey added = 1; } - message DeletePendingMemberAction { + message DeleteMemberPendingProfileKeyAction { bytes deletedUserId = 1; } - message PromotePendingMemberAction { - bytes presentation = 1; // Only set when sending to server - bytes user_id = 2; // Only set when receiving from server - bytes profile_key = 3; // Only set when receiving from server + message PromoteMemberPendingProfileKeyAction { + bytes presentation = 1; + bytes user_id = 2; + bytes profile_key = 3; } - message PromotePendingPniAciMemberProfileKeyAction { - bytes presentation = 1; // Only set when sending to server - bytes userId = 2; // Only set when receiving from server - bytes pni = 3; // Only set when receiving from server - bytes profileKey = 4; // Only set when receiving from server + message PromoteMemberPendingPniAciProfileKeyAction { + bytes presentation = 1; + bytes user_id = 2; + bytes pni = 3; + bytes profile_key = 4; } - message AddRequestingMemberAction { - RequestingMember added = 1; + message AddMemberPendingAdminApprovalAction { + MemberPendingAdminApproval added = 1; } - message DeleteRequestingMemberAction { + message DeleteMemberPendingAdminApprovalAction { bytes deletedUserId = 1; } - message PromoteRequestingMemberAction { - bytes userId = 1; - Member.Role role = 2; + message PromoteMemberPendingAdminApprovalAction { + bytes userId = 1; + Member.Role role = 2; } - message AddBannedMemberAction { - BannedMember added = 1; + message AddMemberBannedAction { + MemberBanned added = 1; } - message DeleteBannedMemberAction { + message DeleteMemberBannedAction { bytes deletedUserId = 1; } @@ -158,7 +209,7 @@ message GroupChange { string avatar = 1; } - message ModifyDisappearingMessagesTimerAction { + message ModifyDisappearingMessageTimerAction { bytes timer = 1; } @@ -179,92 +230,70 @@ message GroupChange { } message ModifyAnnouncementsOnlyAction { - bool announcementsOnly = 1; + bool announcements_only = 1; } - bytes sourceServiceId = 1; - bytes groupId = 25; // Only set when receiving from server - uint32 revision = 2; - repeated AddMemberAction addMembers = 3; - repeated DeleteMemberAction deleteMembers = 4; - repeated ModifyMemberRoleAction modifyMemberRoles = 5; - repeated ModifyMemberProfileKeyAction modifyMemberProfileKeys = 6; - repeated AddPendingMemberAction addPendingMembers = 7; - repeated DeletePendingMemberAction deletePendingMembers = 8; - repeated PromotePendingMemberAction promotePendingMembers = 9; - ModifyTitleAction modifyTitle = 10; - ModifyAvatarAction modifyAvatar = 11; - ModifyDisappearingMessagesTimerAction modifyDisappearingMessagesTimer = 12; - ModifyAttributesAccessControlAction modifyAttributesAccess = 13; - ModifyMembersAccessControlAction modifyMemberAccess = 14; - ModifyAddFromInviteLinkAccessControlAction modifyAddFromInviteLinkAccess = 15; - repeated AddRequestingMemberAction addRequestingMembers = 16; - repeated DeleteRequestingMemberAction deleteRequestingMembers = 17; - repeated PromoteRequestingMemberAction promoteRequestingMembers = 18; - ModifyInviteLinkPasswordAction modifyInviteLinkPassword = 19; - ModifyDescriptionAction modifyDescription = 20; - ModifyAnnouncementsOnlyAction modifyAnnouncementsOnly = 21; - repeated AddBannedMemberAction addBannedMembers = 22; - repeated DeleteBannedMemberAction deleteBannedMembers = 23; - repeated PromotePendingPniAciMemberProfileKeyAction promotePendingPniAciMembers = 24; + bytes sourceUserId = 1; + // clients should not provide this value; the server will provide it in the response buffer to ensure the signature is binding to a particular group + // if clients set it during a request the server will respond with 400. + bytes group_id = 25; + uint32 version = 2; + + repeated AddMemberAction addMembers = 3; + repeated DeleteMemberAction deleteMembers = 4; + repeated ModifyMemberRoleAction modifyMemberRoles = 5; + repeated ModifyMemberProfileKeyAction modifyMemberProfileKeys = 6; + repeated AddMemberPendingProfileKeyAction addMembersPendingProfileKey = 7; + repeated DeleteMemberPendingProfileKeyAction deleteMembersPendingProfileKey = 8; + repeated PromoteMemberPendingProfileKeyAction promoteMembersPendingProfileKey = 9; + ModifyTitleAction modifyTitle = 10; + ModifyAvatarAction modifyAvatar = 11; + ModifyDisappearingMessageTimerAction modifyDisappearingMessageTimer = 12; + ModifyAttributesAccessControlAction modifyAttributesAccess = 13; + ModifyMembersAccessControlAction modifyMemberAccess = 14; + ModifyAddFromInviteLinkAccessControlAction modifyAddFromInviteLinkAccess = 15; // change epoch = 1 + repeated AddMemberPendingAdminApprovalAction addMembersPendingAdminApproval = 16; // change epoch = 1 + repeated DeleteMemberPendingAdminApprovalAction deleteMembersPendingAdminApproval = 17; // change epoch = 1 + repeated PromoteMemberPendingAdminApprovalAction promoteMembersPendingAdminApproval = 18; // change epoch = 1 + ModifyInviteLinkPasswordAction modifyInviteLinkPassword = 19; // change epoch = 1 + ModifyDescriptionAction modifyDescription = 20; // change epoch = 2 + ModifyAnnouncementsOnlyAction modify_announcements_only = 21; // change epoch = 3 + repeated AddMemberBannedAction add_members_banned = 22; // change epoch = 4 + repeated DeleteMemberBannedAction delete_members_banned = 23; // change epoch = 4 + repeated PromoteMemberPendingPniAciProfileKeyAction promote_members_pending_pni_aci_profile_key = 24; // change epoch = 5 + repeated ModifyMemberLabelAction modifyMemberLabels = 26; // change epoch = 6; + // next: 27 } - bytes actions = 1; - bytes serverSignature = 2; - uint32 changeEpoch = 3; + bytes actions = 1; + bytes serverSignature = 2; + uint32 changeEpoch = 3; } +// External credentials + +message ExternalGroupCredential { + string token = 1; +} + +// API responses + message GroupResponse { - Group group = 1; - bytes groupSendEndorsementsResponse = 2; + Group group = 1; + bytes group_send_endorsements_response = 2; } message GroupChanges { message GroupChangeState { GroupChange groupChange = 1; - Group groupState = 2; + Group groupState = 2; } - repeated GroupChangeState groupChanges = 1; - bytes groupSendEndorsementsResponse = 2; + repeated GroupChangeState groupChanges = 1; + bytes group_send_endorsements_response = 2; } message GroupChangeResponse { - GroupChange groupChange = 1; - bytes groupSendEndorsementsResponse = 2; -} - -message GroupAttributeBlob { - oneof content { - string title = 1; - bytes avatar = 2; - uint32 disappearingMessagesDuration = 3; - string description = 4; - } -} - -message GroupInviteLink { - message GroupInviteLinkContentsV1 { - bytes groupMasterKey = 1; - bytes inviteLinkPassword = 2; - } - - oneof contents { - GroupInviteLinkContentsV1 v1Contents = 1; - } -} - -message GroupJoinInfo { - bytes publicKey = 1; - bytes title = 2; - string avatar = 3; - uint32 memberCount = 4; - AccessControl.AccessRequired addFromInviteLink = 5; - uint32 revision = 6; - bool pendingAdminApproval = 7; - bytes description = 8; -} - -message GroupExternalCredential { - string token = 1; + GroupChange group_change = 1; + bytes group_send_endorsements_response = 2; } diff --git a/pkg/signalmeow/protobuf/Provisioning.pb.go b/pkg/signalmeow/protobuf/Provisioning.pb.go index d2f0a4d..0231512 100644 --- a/pkg/signalmeow/protobuf/Provisioning.pb.go +++ b/pkg/signalmeow/protobuf/Provisioning.pb.go @@ -4,8 +4,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: Provisioning.proto package signalpb diff --git a/pkg/signalmeow/protobuf/SignalService.pb.go b/pkg/signalmeow/protobuf/SignalService.pb.go index ae5bd18..5866dbb 100644 --- a/pkg/signalmeow/protobuf/SignalService.pb.go +++ b/pkg/signalmeow/protobuf/SignalService.pb.go @@ -4,8 +4,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: SignalService.proto package signalpb @@ -347,7 +347,7 @@ const ( DataMessage_MENTIONS DataMessage_ProtocolVersion = 6 DataMessage_PAYMENTS DataMessage_ProtocolVersion = 7 DataMessage_POLLS DataMessage_ProtocolVersion = 8 - DataMessage_CURRENT DataMessage_ProtocolVersion = 7 + DataMessage_CURRENT DataMessage_ProtocolVersion = 8 ) // Enum value maps for DataMessage_ProtocolVersion. @@ -362,7 +362,7 @@ var ( 6: "MENTIONS", 7: "PAYMENTS", 8: "POLLS", - // Duplicate value: 7: "CURRENT", + // Duplicate value: 8: "CURRENT", } DataMessage_ProtocolVersion_value = map[string]int32{ "INITIAL": 0, @@ -374,7 +374,7 @@ var ( "MENTIONS": 6, "PAYMENTS": 7, "POLLS": 8, - "CURRENT": 7, + "CURRENT": 8, } ) @@ -1750,22 +1750,26 @@ func (BodyRange_Style) EnumDescriptor() ([]byte, []int) { } type Envelope struct { - state protoimpl.MessageState `protogen:"open.v1"` - Type *Envelope_Type `protobuf:"varint,1,opt,name=type,enum=signalservice.Envelope_Type" json:"type,omitempty"` - SourceServiceId *string `protobuf:"bytes,11,opt,name=sourceServiceId" json:"sourceServiceId,omitempty"` - SourceDevice *uint32 `protobuf:"varint,7,opt,name=sourceDevice" json:"sourceDevice,omitempty"` - DestinationServiceId *string `protobuf:"bytes,13,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` - Timestamp *uint64 `protobuf:"varint,5,opt,name=timestamp" json:"timestamp,omitempty"` - Content []byte `protobuf:"bytes,8,opt,name=content" json:"content,omitempty"` // Contains an encrypted Content - ServerGuid *string `protobuf:"bytes,9,opt,name=serverGuid" json:"serverGuid,omitempty"` - ServerTimestamp *uint64 `protobuf:"varint,10,opt,name=serverTimestamp" json:"serverTimestamp,omitempty"` - Ephemeral *bool `protobuf:"varint,12,opt,name=ephemeral" json:"ephemeral,omitempty"` // indicates that the message should not be persisted if the recipient is offline - Urgent *bool `protobuf:"varint,14,opt,name=urgent,def=1" json:"urgent,omitempty"` // 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 - UpdatedPni *string `protobuf:"bytes,15,opt,name=updatedPni" json:"updatedPni,omitempty"` // for number-change synchronization messages, provides the new server-assigned phone number identifier associated with the changed number - Story *bool `protobuf:"varint,16,opt,name=story" json:"story,omitempty"` // indicates that the content is a story. - ReportSpamToken []byte `protobuf:"bytes,17,opt,name=report_spam_token,json=reportSpamToken" json:"report_spam_token,omitempty"` // token sent when reporting spam - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type *Envelope_Type `protobuf:"varint,1,opt,name=type,enum=signalservice.Envelope_Type" json:"type,omitempty"` + SourceServiceId *string `protobuf:"bytes,11,opt,name=sourceServiceId" json:"sourceServiceId,omitempty"` + SourceDevice *uint32 `protobuf:"varint,7,opt,name=sourceDevice" json:"sourceDevice,omitempty"` + DestinationServiceId *string `protobuf:"bytes,13,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` + Timestamp *uint64 `protobuf:"varint,5,opt,name=timestamp" json:"timestamp,omitempty"` + Content []byte `protobuf:"bytes,8,opt,name=content" json:"content,omitempty"` // Contains an encrypted Content + ServerGuid *string `protobuf:"bytes,9,opt,name=serverGuid" json:"serverGuid,omitempty"` + ServerTimestamp *uint64 `protobuf:"varint,10,opt,name=serverTimestamp" json:"serverTimestamp,omitempty"` + Ephemeral *bool `protobuf:"varint,12,opt,name=ephemeral" json:"ephemeral,omitempty"` // indicates that the message should not be persisted if the recipient is offline + Urgent *bool `protobuf:"varint,14,opt,name=urgent,def=1" json:"urgent,omitempty"` // 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 + UpdatedPni *string `protobuf:"bytes,15,opt,name=updatedPni" json:"updatedPni,omitempty"` // for number-change synchronization messages, provides the new server-assigned phone number identifier associated with the changed number + Story *bool `protobuf:"varint,16,opt,name=story" json:"story,omitempty"` // indicates that the content is a story. + ReportSpamToken []byte `protobuf:"bytes,17,opt,name=report_spam_token,json=reportSpamToken" json:"report_spam_token,omitempty"` // token sent when reporting spam + SourceServiceIdBinary []byte `protobuf:"bytes,19,opt,name=sourceServiceIdBinary" json:"sourceServiceIdBinary,omitempty"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + DestinationServiceIdBinary []byte `protobuf:"bytes,20,opt,name=destinationServiceIdBinary" json:"destinationServiceIdBinary,omitempty"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + ServerGuidBinary []byte `protobuf:"bytes,21,opt,name=serverGuidBinary" json:"serverGuidBinary,omitempty"` // 16-byte UUID + UpdatedPniBinary []byte `protobuf:"bytes,22,opt,name=updatedPniBinary" json:"updatedPniBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for Envelope fields. @@ -1894,6 +1898,34 @@ func (x *Envelope) GetReportSpamToken() []byte { return nil } +func (x *Envelope) GetSourceServiceIdBinary() []byte { + if x != nil { + return x.SourceServiceIdBinary + } + return nil +} + +func (x *Envelope) GetDestinationServiceIdBinary() []byte { + if x != nil { + return x.DestinationServiceIdBinary + } + return nil +} + +func (x *Envelope) GetServerGuidBinary() []byte { + if x != nil { + return x.ServerGuidBinary + } + return nil +} + +func (x *Envelope) GetUpdatedPniBinary() []byte { + if x != nil { + return x.UpdatedPniBinary + } + return nil +} + type Content struct { state protoimpl.MessageState `protogen:"open.v1"` DataMessage *DataMessage `protobuf:"bytes,1,opt,name=dataMessage" json:"dataMessage,omitempty"` @@ -2135,7 +2167,9 @@ type DataMessage struct { GiftBadge *DataMessage_GiftBadge `protobuf:"bytes,22,opt,name=giftBadge" json:"giftBadge,omitempty"` PollCreate *DataMessage_PollCreate `protobuf:"bytes,24,opt,name=pollCreate" json:"pollCreate,omitempty"` PollTerminate *DataMessage_PollTerminate `protobuf:"bytes,25,opt,name=pollTerminate" json:"pollTerminate,omitempty"` - PollVote *DataMessage_PollVote `protobuf:"bytes,26,opt,name=pollVote" json:"pollVote,omitempty"` // NEXT ID: 27 + PollVote *DataMessage_PollVote `protobuf:"bytes,26,opt,name=pollVote" json:"pollVote,omitempty"` + PinMessage *DataMessage_PinMessage `protobuf:"bytes,27,opt,name=pinMessage" json:"pinMessage,omitempty"` + UnpinMessage *DataMessage_UnpinMessage `protobuf:"bytes,28,opt,name=unpinMessage" json:"unpinMessage,omitempty"` // NEXT ID: 29 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2338,6 +2372,20 @@ func (x *DataMessage) GetPollVote() *DataMessage_PollVote { return nil } +func (x *DataMessage) GetPinMessage() *DataMessage_PinMessage { + if x != nil { + return x.PinMessage + } + return nil +} + +func (x *DataMessage) GetUnpinMessage() *DataMessage_UnpinMessage { + if x != nil { + return x.UnpinMessage + } + return nil +} + type NullMessage struct { state protoimpl.MessageState `protogen:"open.v1"` Padding []byte `protobuf:"bytes,1,opt,name=padding" json:"padding,omitempty"` @@ -2807,13 +2855,14 @@ func (*TextAttachment_Gradient_) isTextAttachment_Background() {} func (*TextAttachment_Color) isTextAttachment_Background() {} type Verified struct { - state protoimpl.MessageState `protogen:"open.v1"` - DestinationAci *string `protobuf:"bytes,5,opt,name=destinationAci" json:"destinationAci,omitempty"` - IdentityKey []byte `protobuf:"bytes,2,opt,name=identityKey" json:"identityKey,omitempty"` - State *Verified_State `protobuf:"varint,3,opt,name=state,enum=signalservice.Verified_State" json:"state,omitempty"` - NullMessage []byte `protobuf:"bytes,4,opt,name=nullMessage" json:"nullMessage,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + DestinationAci *string `protobuf:"bytes,5,opt,name=destinationAci" json:"destinationAci,omitempty"` + IdentityKey []byte `protobuf:"bytes,2,opt,name=identityKey" json:"identityKey,omitempty"` + State *Verified_State `protobuf:"varint,3,opt,name=state,enum=signalservice.Verified_State" json:"state,omitempty"` + NullMessage []byte `protobuf:"bytes,4,opt,name=nullMessage" json:"nullMessage,omitempty"` + DestinationAciBinary []byte `protobuf:"bytes,6,opt,name=destinationAciBinary" json:"destinationAciBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Verified) Reset() { @@ -2874,6 +2923,13 @@ func (x *Verified) GetNullMessage() []byte { return nil } +func (x *Verified) GetDestinationAciBinary() []byte { + if x != nil { + return x.DestinationAciBinary + } + return nil +} + type SyncMessage struct { state protoimpl.MessageState `protogen:"open.v1"` Sent *SyncMessage_Sent `protobuf:"bytes,1,opt,name=sent" json:"sent,omitempty"` @@ -3370,6 +3426,7 @@ type ContactDetails struct { state protoimpl.MessageState `protogen:"open.v1"` Number *string `protobuf:"bytes,1,opt,name=number" json:"number,omitempty"` Aci *string `protobuf:"bytes,9,opt,name=aci" json:"aci,omitempty"` + AciBinary []byte `protobuf:"bytes,13,opt,name=aciBinary" json:"aciBinary,omitempty"` // 16-byte UUID Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` Avatar *ContactDetails_Avatar `protobuf:"bytes,3,opt,name=avatar" json:"avatar,omitempty"` ExpireTimer *uint32 `protobuf:"varint,8,opt,name=expireTimer" json:"expireTimer,omitempty"` @@ -3423,6 +3480,13 @@ func (x *ContactDetails) GetAci() string { return "" } +func (x *ContactDetails) GetAciBinary() []byte { + if x != nil { + return x.AciBinary + } + return nil +} + func (x *ContactDetails) GetName() string { if x != nil && x.Name != nil { return *x.Name @@ -3697,6 +3761,7 @@ type BodyRange struct { // // *BodyRange_MentionAci // *BodyRange_Style_ + // *BodyRange_MentionAciBinary AssociatedValue isBodyRange_AssociatedValue `protobuf_oneof:"associatedValue"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -3771,6 +3836,15 @@ func (x *BodyRange) GetStyle() BodyRange_Style { return BodyRange_NONE } +func (x *BodyRange) GetMentionAciBinary() []byte { + if x != nil { + if x, ok := x.AssociatedValue.(*BodyRange_MentionAciBinary); ok { + return x.MentionAciBinary + } + } + return nil +} + type isBodyRange_AssociatedValue interface { isBodyRange_AssociatedValue() } @@ -3783,16 +3857,23 @@ type BodyRange_Style_ struct { Style BodyRange_Style `protobuf:"varint,4,opt,name=style,enum=signalservice.BodyRange_Style,oneof"` } +type BodyRange_MentionAciBinary struct { + MentionAciBinary []byte `protobuf:"bytes,5,opt,name=mentionAciBinary,oneof"` // 16-byte UUID +} + func (*BodyRange_MentionAci) isBodyRange_AssociatedValue() {} func (*BodyRange_Style_) isBodyRange_AssociatedValue() {} +func (*BodyRange_MentionAciBinary) isBodyRange_AssociatedValue() {} + type AddressableMessage struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Author: // // *AddressableMessage_AuthorServiceId // *AddressableMessage_AuthorE164 + // *AddressableMessage_AuthorServiceIdBinary Author isAddressableMessage_Author `protobuf_oneof:"author"` SentTimestamp *uint64 `protobuf:"varint,3,opt,name=sentTimestamp" json:"sentTimestamp,omitempty"` unknownFields protoimpl.UnknownFields @@ -3854,6 +3935,15 @@ func (x *AddressableMessage) GetAuthorE164() string { return "" } +func (x *AddressableMessage) GetAuthorServiceIdBinary() []byte { + if x != nil { + if x, ok := x.Author.(*AddressableMessage_AuthorServiceIdBinary); ok { + return x.AuthorServiceIdBinary + } + } + return nil +} + func (x *AddressableMessage) GetSentTimestamp() uint64 { if x != nil && x.SentTimestamp != nil { return *x.SentTimestamp @@ -3873,10 +3963,16 @@ type AddressableMessage_AuthorE164 struct { AuthorE164 string `protobuf:"bytes,2,opt,name=authorE164,oneof"` } +type AddressableMessage_AuthorServiceIdBinary struct { + AuthorServiceIdBinary []byte `protobuf:"bytes,4,opt,name=authorServiceIdBinary,oneof"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) +} + func (*AddressableMessage_AuthorServiceId) isAddressableMessage_Author() {} func (*AddressableMessage_AuthorE164) isAddressableMessage_Author() {} +func (*AddressableMessage_AuthorServiceIdBinary) isAddressableMessage_Author() {} + type ConversationIdentifier struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Identifier: @@ -3884,6 +3980,7 @@ type ConversationIdentifier struct { // *ConversationIdentifier_ThreadServiceId // *ConversationIdentifier_ThreadGroupId // *ConversationIdentifier_ThreadE164 + // *ConversationIdentifier_ThreadServiceIdBinary Identifier isConversationIdentifier_Identifier `protobuf_oneof:"identifier"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -3953,6 +4050,15 @@ func (x *ConversationIdentifier) GetThreadE164() string { return "" } +func (x *ConversationIdentifier) GetThreadServiceIdBinary() []byte { + if x != nil { + if x, ok := x.Identifier.(*ConversationIdentifier_ThreadServiceIdBinary); ok { + return x.ThreadServiceIdBinary + } + } + return nil +} + type isConversationIdentifier_Identifier interface { isConversationIdentifier_Identifier() } @@ -3969,12 +4075,18 @@ type ConversationIdentifier_ThreadE164 struct { ThreadE164 string `protobuf:"bytes,3,opt,name=threadE164,oneof"` } +type ConversationIdentifier_ThreadServiceIdBinary struct { + ThreadServiceIdBinary []byte `protobuf:"bytes,4,opt,name=threadServiceIdBinary,oneof"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) +} + func (*ConversationIdentifier_ThreadServiceId) isConversationIdentifier_Identifier() {} func (*ConversationIdentifier_ThreadGroupId) isConversationIdentifier_Identifier() {} func (*ConversationIdentifier_ThreadE164) isConversationIdentifier_Identifier() {} +func (*ConversationIdentifier_ThreadServiceIdBinary) isConversationIdentifier_Identifier() {} + type CallMessage_Offer struct { state protoimpl.MessageState `protogen:"open.v1"` Id *uint64 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` @@ -4378,15 +4490,16 @@ func (*DataMessage_Payment_Notification_) isDataMessage_Payment_Item() {} func (*DataMessage_Payment_Activation_) isDataMessage_Payment_Item() {} type DataMessage_Quote struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id *uint64 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` - AuthorAci *string `protobuf:"bytes,5,opt,name=authorAci" json:"authorAci,omitempty"` - Text *string `protobuf:"bytes,3,opt,name=text" json:"text,omitempty"` - Attachments []*DataMessage_Quote_QuotedAttachment `protobuf:"bytes,4,rep,name=attachments" json:"attachments,omitempty"` - BodyRanges []*BodyRange `protobuf:"bytes,6,rep,name=bodyRanges" json:"bodyRanges,omitempty"` - Type *DataMessage_Quote_Type `protobuf:"varint,7,opt,name=type,enum=signalservice.DataMessage_Quote_Type" json:"type,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id *uint64 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` + AuthorAci *string `protobuf:"bytes,5,opt,name=authorAci" json:"authorAci,omitempty"` + Text *string `protobuf:"bytes,3,opt,name=text" json:"text,omitempty"` + Attachments []*DataMessage_Quote_QuotedAttachment `protobuf:"bytes,4,rep,name=attachments" json:"attachments,omitempty"` + BodyRanges []*BodyRange `protobuf:"bytes,6,rep,name=bodyRanges" json:"bodyRanges,omitempty"` + Type *DataMessage_Quote_Type `protobuf:"varint,7,opt,name=type,enum=signalservice.DataMessage_Quote_Type" json:"type,omitempty"` + AuthorAciBinary []byte `protobuf:"bytes,8,opt,name=authorAciBinary" json:"authorAciBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DataMessage_Quote) Reset() { @@ -4461,6 +4574,13 @@ func (x *DataMessage_Quote) GetType() DataMessage_Quote_Type { return DataMessage_Quote_NORMAL } +func (x *DataMessage_Quote) GetAuthorAciBinary() []byte { + if x != nil { + return x.AuthorAciBinary + } + return nil +} + type DataMessage_Contact struct { state protoimpl.MessageState `protogen:"open.v1"` Name *DataMessage_Contact_Name `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` @@ -4622,13 +4742,14 @@ func (x *DataMessage_Sticker) GetEmoji() string { } type DataMessage_Reaction struct { - state protoimpl.MessageState `protogen:"open.v1"` - Emoji *string `protobuf:"bytes,1,opt,name=emoji" json:"emoji,omitempty"` - Remove *bool `protobuf:"varint,2,opt,name=remove" json:"remove,omitempty"` - TargetAuthorAci *string `protobuf:"bytes,4,opt,name=targetAuthorAci" json:"targetAuthorAci,omitempty"` - TargetSentTimestamp *uint64 `protobuf:"varint,5,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Emoji *string `protobuf:"bytes,1,opt,name=emoji" json:"emoji,omitempty"` + Remove *bool `protobuf:"varint,2,opt,name=remove" json:"remove,omitempty"` + TargetAuthorAci *string `protobuf:"bytes,4,opt,name=targetAuthorAci" json:"targetAuthorAci,omitempty"` + TargetSentTimestamp *uint64 `protobuf:"varint,5,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` + TargetAuthorAciBinary []byte `protobuf:"bytes,6,opt,name=targetAuthorAciBinary" json:"targetAuthorAciBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DataMessage_Reaction) Reset() { @@ -4689,6 +4810,13 @@ func (x *DataMessage_Reaction) GetTargetSentTimestamp() uint64 { return 0 } +func (x *DataMessage_Reaction) GetTargetAuthorAciBinary() []byte { + if x != nil { + return x.TargetAuthorAciBinary + } + return nil +} + type DataMessage_Delete struct { state protoimpl.MessageState `protogen:"open.v1"` TargetSentTimestamp *uint64 `protobuf:"varint,1,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` @@ -4778,11 +4906,12 @@ func (x *DataMessage_GroupCallUpdate) GetEraId() string { } type DataMessage_StoryContext struct { - state protoimpl.MessageState `protogen:"open.v1"` - AuthorAci *string `protobuf:"bytes,1,opt,name=authorAci" json:"authorAci,omitempty"` - SentTimestamp *uint64 `protobuf:"varint,2,opt,name=sentTimestamp" json:"sentTimestamp,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + AuthorAci *string `protobuf:"bytes,1,opt,name=authorAci" json:"authorAci,omitempty"` + SentTimestamp *uint64 `protobuf:"varint,2,opt,name=sentTimestamp" json:"sentTimestamp,omitempty"` + AuthorAciBinary []byte `protobuf:"bytes,3,opt,name=authorAciBinary" json:"authorAciBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DataMessage_StoryContext) Reset() { @@ -4829,6 +4958,13 @@ func (x *DataMessage_StoryContext) GetSentTimestamp() uint64 { return 0 } +func (x *DataMessage_StoryContext) GetAuthorAciBinary() []byte { + if x != nil { + return x.AuthorAciBinary + } + return nil +} + type DataMessage_GiftBadge struct { state protoimpl.MessageState `protogen:"open.v1"` ReceiptCredentialPresentation []byte `protobuf:"bytes,1,opt,name=receiptCredentialPresentation" json:"receiptCredentialPresentation,omitempty"` @@ -5045,6 +5181,156 @@ func (x *DataMessage_PollVote) GetVoteCount() uint32 { return 0 } +type DataMessage_PinMessage struct { + state protoimpl.MessageState `protogen:"open.v1"` + TargetAuthorAciBinary []byte `protobuf:"bytes,1,opt,name=targetAuthorAciBinary" json:"targetAuthorAciBinary,omitempty"` // 16-byte UUID + TargetSentTimestamp *uint64 `protobuf:"varint,2,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` + // Types that are valid to be assigned to PinDuration: + // + // *DataMessage_PinMessage_PinDurationSeconds + // *DataMessage_PinMessage_PinDurationForever + PinDuration isDataMessage_PinMessage_PinDuration `protobuf_oneof:"pinDuration"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DataMessage_PinMessage) Reset() { + *x = DataMessage_PinMessage{} + mi := &file_SignalService_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DataMessage_PinMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataMessage_PinMessage) ProtoMessage() {} + +func (x *DataMessage_PinMessage) ProtoReflect() protoreflect.Message { + mi := &file_SignalService_proto_msgTypes[40] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataMessage_PinMessage.ProtoReflect.Descriptor instead. +func (*DataMessage_PinMessage) Descriptor() ([]byte, []int) { + return file_SignalService_proto_rawDescGZIP(), []int{3, 12} +} + +func (x *DataMessage_PinMessage) GetTargetAuthorAciBinary() []byte { + if x != nil { + return x.TargetAuthorAciBinary + } + return nil +} + +func (x *DataMessage_PinMessage) GetTargetSentTimestamp() uint64 { + if x != nil && x.TargetSentTimestamp != nil { + return *x.TargetSentTimestamp + } + return 0 +} + +func (x *DataMessage_PinMessage) GetPinDuration() isDataMessage_PinMessage_PinDuration { + if x != nil { + return x.PinDuration + } + return nil +} + +func (x *DataMessage_PinMessage) GetPinDurationSeconds() uint32 { + if x != nil { + if x, ok := x.PinDuration.(*DataMessage_PinMessage_PinDurationSeconds); ok { + return x.PinDurationSeconds + } + } + return 0 +} + +func (x *DataMessage_PinMessage) GetPinDurationForever() bool { + if x != nil { + if x, ok := x.PinDuration.(*DataMessage_PinMessage_PinDurationForever); ok { + return x.PinDurationForever + } + } + return false +} + +type isDataMessage_PinMessage_PinDuration interface { + isDataMessage_PinMessage_PinDuration() +} + +type DataMessage_PinMessage_PinDurationSeconds struct { + PinDurationSeconds uint32 `protobuf:"varint,3,opt,name=pinDurationSeconds,oneof"` +} + +type DataMessage_PinMessage_PinDurationForever struct { + PinDurationForever bool `protobuf:"varint,4,opt,name=pinDurationForever,oneof"` +} + +func (*DataMessage_PinMessage_PinDurationSeconds) isDataMessage_PinMessage_PinDuration() {} + +func (*DataMessage_PinMessage_PinDurationForever) isDataMessage_PinMessage_PinDuration() {} + +type DataMessage_UnpinMessage struct { + state protoimpl.MessageState `protogen:"open.v1"` + TargetAuthorAciBinary []byte `protobuf:"bytes,1,opt,name=targetAuthorAciBinary" json:"targetAuthorAciBinary,omitempty"` // 16-byte UUID + TargetSentTimestamp *uint64 `protobuf:"varint,2,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DataMessage_UnpinMessage) Reset() { + *x = DataMessage_UnpinMessage{} + mi := &file_SignalService_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DataMessage_UnpinMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataMessage_UnpinMessage) ProtoMessage() {} + +func (x *DataMessage_UnpinMessage) ProtoReflect() protoreflect.Message { + mi := &file_SignalService_proto_msgTypes[41] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataMessage_UnpinMessage.ProtoReflect.Descriptor instead. +func (*DataMessage_UnpinMessage) Descriptor() ([]byte, []int) { + return file_SignalService_proto_rawDescGZIP(), []int{3, 13} +} + +func (x *DataMessage_UnpinMessage) GetTargetAuthorAciBinary() []byte { + if x != nil { + return x.TargetAuthorAciBinary + } + return nil +} + +func (x *DataMessage_UnpinMessage) GetTargetSentTimestamp() uint64 { + if x != nil && x.TargetSentTimestamp != nil { + return *x.TargetSentTimestamp + } + return 0 +} + type DataMessage_Payment_Amount struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Amount: @@ -5057,7 +5343,7 @@ type DataMessage_Payment_Amount struct { func (x *DataMessage_Payment_Amount) Reset() { *x = DataMessage_Payment_Amount{} - mi := &file_SignalService_proto_msgTypes[40] + mi := &file_SignalService_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5069,7 +5355,7 @@ func (x *DataMessage_Payment_Amount) String() string { func (*DataMessage_Payment_Amount) ProtoMessage() {} func (x *DataMessage_Payment_Amount) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[40] + mi := &file_SignalService_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5125,7 +5411,7 @@ type DataMessage_Payment_Notification struct { func (x *DataMessage_Payment_Notification) Reset() { *x = DataMessage_Payment_Notification{} - mi := &file_SignalService_proto_msgTypes[41] + mi := &file_SignalService_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5137,7 +5423,7 @@ func (x *DataMessage_Payment_Notification) String() string { func (*DataMessage_Payment_Notification) ProtoMessage() {} func (x *DataMessage_Payment_Notification) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[41] + mi := &file_SignalService_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5196,7 +5482,7 @@ type DataMessage_Payment_Activation struct { func (x *DataMessage_Payment_Activation) Reset() { *x = DataMessage_Payment_Activation{} - mi := &file_SignalService_proto_msgTypes[42] + mi := &file_SignalService_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5208,7 +5494,7 @@ func (x *DataMessage_Payment_Activation) String() string { func (*DataMessage_Payment_Activation) ProtoMessage() {} func (x *DataMessage_Payment_Activation) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[42] + mi := &file_SignalService_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5240,7 +5526,7 @@ type DataMessage_Payment_Amount_MobileCoin struct { func (x *DataMessage_Payment_Amount_MobileCoin) Reset() { *x = DataMessage_Payment_Amount_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[43] + mi := &file_SignalService_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5252,7 +5538,7 @@ func (x *DataMessage_Payment_Amount_MobileCoin) String() string { func (*DataMessage_Payment_Amount_MobileCoin) ProtoMessage() {} func (x *DataMessage_Payment_Amount_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[43] + mi := &file_SignalService_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5284,7 +5570,7 @@ type DataMessage_Payment_Notification_MobileCoin struct { func (x *DataMessage_Payment_Notification_MobileCoin) Reset() { *x = DataMessage_Payment_Notification_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[44] + mi := &file_SignalService_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5296,7 +5582,7 @@ func (x *DataMessage_Payment_Notification_MobileCoin) String() string { func (*DataMessage_Payment_Notification_MobileCoin) ProtoMessage() {} func (x *DataMessage_Payment_Notification_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[44] + mi := &file_SignalService_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5330,7 +5616,7 @@ type DataMessage_Quote_QuotedAttachment struct { func (x *DataMessage_Quote_QuotedAttachment) Reset() { *x = DataMessage_Quote_QuotedAttachment{} - mi := &file_SignalService_proto_msgTypes[45] + mi := &file_SignalService_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5342,7 +5628,7 @@ func (x *DataMessage_Quote_QuotedAttachment) String() string { func (*DataMessage_Quote_QuotedAttachment) ProtoMessage() {} func (x *DataMessage_Quote_QuotedAttachment) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[45] + mi := &file_SignalService_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5393,7 +5679,7 @@ type DataMessage_Contact_Name struct { func (x *DataMessage_Contact_Name) Reset() { *x = DataMessage_Contact_Name{} - mi := &file_SignalService_proto_msgTypes[46] + mi := &file_SignalService_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5405,7 +5691,7 @@ func (x *DataMessage_Contact_Name) String() string { func (*DataMessage_Contact_Name) ProtoMessage() {} func (x *DataMessage_Contact_Name) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[46] + mi := &file_SignalService_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5474,7 +5760,7 @@ type DataMessage_Contact_Phone struct { func (x *DataMessage_Contact_Phone) Reset() { *x = DataMessage_Contact_Phone{} - mi := &file_SignalService_proto_msgTypes[47] + mi := &file_SignalService_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5486,7 +5772,7 @@ func (x *DataMessage_Contact_Phone) String() string { func (*DataMessage_Contact_Phone) ProtoMessage() {} func (x *DataMessage_Contact_Phone) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[47] + mi := &file_SignalService_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5534,7 +5820,7 @@ type DataMessage_Contact_Email struct { func (x *DataMessage_Contact_Email) Reset() { *x = DataMessage_Contact_Email{} - mi := &file_SignalService_proto_msgTypes[48] + mi := &file_SignalService_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5546,7 +5832,7 @@ func (x *DataMessage_Contact_Email) String() string { func (*DataMessage_Contact_Email) ProtoMessage() {} func (x *DataMessage_Contact_Email) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[48] + mi := &file_SignalService_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5600,7 +5886,7 @@ type DataMessage_Contact_PostalAddress struct { func (x *DataMessage_Contact_PostalAddress) Reset() { *x = DataMessage_Contact_PostalAddress{} - mi := &file_SignalService_proto_msgTypes[49] + mi := &file_SignalService_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5612,7 +5898,7 @@ func (x *DataMessage_Contact_PostalAddress) String() string { func (*DataMessage_Contact_PostalAddress) ProtoMessage() {} func (x *DataMessage_Contact_PostalAddress) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[49] + mi := &file_SignalService_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5701,7 +5987,7 @@ type DataMessage_Contact_Avatar struct { func (x *DataMessage_Contact_Avatar) Reset() { *x = DataMessage_Contact_Avatar{} - mi := &file_SignalService_proto_msgTypes[50] + mi := &file_SignalService_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5713,7 +5999,7 @@ func (x *DataMessage_Contact_Avatar) String() string { func (*DataMessage_Contact_Avatar) ProtoMessage() {} func (x *DataMessage_Contact_Avatar) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[50] + mi := &file_SignalService_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5756,7 +6042,7 @@ type TextAttachment_Gradient struct { func (x *TextAttachment_Gradient) Reset() { *x = TextAttachment_Gradient{} - mi := &file_SignalService_proto_msgTypes[51] + mi := &file_SignalService_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5768,7 +6054,7 @@ func (x *TextAttachment_Gradient) String() string { func (*TextAttachment_Gradient) ProtoMessage() {} func (x *TextAttachment_Gradient) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[51] + mi := &file_SignalService_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5820,19 +6106,20 @@ func (x *TextAttachment_Gradient) GetPositions() []float32 { } type SyncMessage_Sent struct { - state protoimpl.MessageState `protogen:"open.v1"` - DestinationE164 *string `protobuf:"bytes,1,opt,name=destinationE164" json:"destinationE164,omitempty"` - DestinationServiceId *string `protobuf:"bytes,7,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` - Timestamp *uint64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` - Message *DataMessage `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` - ExpirationStartTimestamp *uint64 `protobuf:"varint,4,opt,name=expirationStartTimestamp" json:"expirationStartTimestamp,omitempty"` - UnidentifiedStatus []*SyncMessage_Sent_UnidentifiedDeliveryStatus `protobuf:"bytes,5,rep,name=unidentifiedStatus" json:"unidentifiedStatus,omitempty"` - IsRecipientUpdate *bool `protobuf:"varint,6,opt,name=isRecipientUpdate,def=0" json:"isRecipientUpdate,omitempty"` - StoryMessage *StoryMessage `protobuf:"bytes,8,opt,name=storyMessage" json:"storyMessage,omitempty"` - StoryMessageRecipients []*SyncMessage_Sent_StoryMessageRecipient `protobuf:"bytes,9,rep,name=storyMessageRecipients" json:"storyMessageRecipients,omitempty"` - EditMessage *EditMessage `protobuf:"bytes,10,opt,name=editMessage" json:"editMessage,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + DestinationE164 *string `protobuf:"bytes,1,opt,name=destinationE164" json:"destinationE164,omitempty"` + DestinationServiceId *string `protobuf:"bytes,7,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` + Timestamp *uint64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` + Message *DataMessage `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + ExpirationStartTimestamp *uint64 `protobuf:"varint,4,opt,name=expirationStartTimestamp" json:"expirationStartTimestamp,omitempty"` + UnidentifiedStatus []*SyncMessage_Sent_UnidentifiedDeliveryStatus `protobuf:"bytes,5,rep,name=unidentifiedStatus" json:"unidentifiedStatus,omitempty"` + IsRecipientUpdate *bool `protobuf:"varint,6,opt,name=isRecipientUpdate,def=0" json:"isRecipientUpdate,omitempty"` + StoryMessage *StoryMessage `protobuf:"bytes,8,opt,name=storyMessage" json:"storyMessage,omitempty"` + StoryMessageRecipients []*SyncMessage_Sent_StoryMessageRecipient `protobuf:"bytes,9,rep,name=storyMessageRecipients" json:"storyMessageRecipients,omitempty"` + EditMessage *EditMessage `protobuf:"bytes,10,opt,name=editMessage" json:"editMessage,omitempty"` + DestinationServiceIdBinary []byte `protobuf:"bytes,12,opt,name=destinationServiceIdBinary" json:"destinationServiceIdBinary,omitempty"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for SyncMessage_Sent fields. @@ -5842,7 +6129,7 @@ const ( func (x *SyncMessage_Sent) Reset() { *x = SyncMessage_Sent{} - mi := &file_SignalService_proto_msgTypes[52] + mi := &file_SignalService_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5854,7 +6141,7 @@ func (x *SyncMessage_Sent) String() string { func (*SyncMessage_Sent) ProtoMessage() {} func (x *SyncMessage_Sent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[52] + mi := &file_SignalService_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5940,6 +6227,13 @@ func (x *SyncMessage_Sent) GetEditMessage() *EditMessage { return nil } +func (x *SyncMessage_Sent) GetDestinationServiceIdBinary() []byte { + if x != nil { + return x.DestinationServiceIdBinary + } + return nil +} + type SyncMessage_Contacts struct { state protoimpl.MessageState `protogen:"open.v1"` Blob *AttachmentPointer `protobuf:"bytes,1,opt,name=blob" json:"blob,omitempty"` @@ -5955,7 +6249,7 @@ const ( func (x *SyncMessage_Contacts) Reset() { *x = SyncMessage_Contacts{} - mi := &file_SignalService_proto_msgTypes[53] + mi := &file_SignalService_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5967,7 +6261,7 @@ func (x *SyncMessage_Contacts) String() string { func (*SyncMessage_Contacts) ProtoMessage() {} func (x *SyncMessage_Contacts) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[53] + mi := &file_SignalService_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6002,13 +6296,14 @@ type SyncMessage_Blocked struct { Numbers []string `protobuf:"bytes,1,rep,name=numbers" json:"numbers,omitempty"` Acis []string `protobuf:"bytes,3,rep,name=acis" json:"acis,omitempty"` GroupIds [][]byte `protobuf:"bytes,2,rep,name=groupIds" json:"groupIds,omitempty"` + AcisBinary [][]byte `protobuf:"bytes,4,rep,name=acisBinary" json:"acisBinary,omitempty"` // 16-byte UUID unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *SyncMessage_Blocked) Reset() { *x = SyncMessage_Blocked{} - mi := &file_SignalService_proto_msgTypes[54] + mi := &file_SignalService_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6020,7 +6315,7 @@ func (x *SyncMessage_Blocked) String() string { func (*SyncMessage_Blocked) ProtoMessage() {} func (x *SyncMessage_Blocked) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[54] + mi := &file_SignalService_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6057,6 +6352,13 @@ func (x *SyncMessage_Blocked) GetGroupIds() [][]byte { return nil } +func (x *SyncMessage_Blocked) GetAcisBinary() [][]byte { + if x != nil { + return x.AcisBinary + } + return nil +} + type SyncMessage_Request struct { state protoimpl.MessageState `protogen:"open.v1"` Type *SyncMessage_Request_Type `protobuf:"varint,1,opt,name=type,enum=signalservice.SyncMessage_Request_Type" json:"type,omitempty"` @@ -6066,7 +6368,7 @@ type SyncMessage_Request struct { func (x *SyncMessage_Request) Reset() { *x = SyncMessage_Request{} - mi := &file_SignalService_proto_msgTypes[55] + mi := &file_SignalService_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6078,7 +6380,7 @@ func (x *SyncMessage_Request) String() string { func (*SyncMessage_Request) ProtoMessage() {} func (x *SyncMessage_Request) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[55] + mi := &file_SignalService_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6102,16 +6404,17 @@ func (x *SyncMessage_Request) GetType() SyncMessage_Request_Type { } type SyncMessage_Read struct { - state protoimpl.MessageState `protogen:"open.v1"` - SenderAci *string `protobuf:"bytes,3,opt,name=senderAci" json:"senderAci,omitempty"` - Timestamp *uint64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + SenderAci *string `protobuf:"bytes,3,opt,name=senderAci" json:"senderAci,omitempty"` + Timestamp *uint64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` + SenderAciBinary []byte `protobuf:"bytes,4,opt,name=senderAciBinary" json:"senderAciBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SyncMessage_Read) Reset() { *x = SyncMessage_Read{} - mi := &file_SignalService_proto_msgTypes[56] + mi := &file_SignalService_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6123,7 +6426,7 @@ func (x *SyncMessage_Read) String() string { func (*SyncMessage_Read) ProtoMessage() {} func (x *SyncMessage_Read) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[56] + mi := &file_SignalService_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6153,17 +6456,25 @@ func (x *SyncMessage_Read) GetTimestamp() uint64 { return 0 } +func (x *SyncMessage_Read) GetSenderAciBinary() []byte { + if x != nil { + return x.SenderAciBinary + } + return nil +} + type SyncMessage_Viewed struct { - state protoimpl.MessageState `protogen:"open.v1"` - SenderAci *string `protobuf:"bytes,3,opt,name=senderAci" json:"senderAci,omitempty"` - Timestamp *uint64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + SenderAci *string `protobuf:"bytes,3,opt,name=senderAci" json:"senderAci,omitempty"` + Timestamp *uint64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` + SenderAciBinary []byte `protobuf:"bytes,4,opt,name=senderAciBinary" json:"senderAciBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SyncMessage_Viewed) Reset() { *x = SyncMessage_Viewed{} - mi := &file_SignalService_proto_msgTypes[57] + mi := &file_SignalService_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6175,7 +6486,7 @@ func (x *SyncMessage_Viewed) String() string { func (*SyncMessage_Viewed) ProtoMessage() {} func (x *SyncMessage_Viewed) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[57] + mi := &file_SignalService_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6205,6 +6516,13 @@ func (x *SyncMessage_Viewed) GetTimestamp() uint64 { return 0 } +func (x *SyncMessage_Viewed) GetSenderAciBinary() []byte { + if x != nil { + return x.SenderAciBinary + } + return nil +} + type SyncMessage_Configuration struct { state protoimpl.MessageState `protogen:"open.v1"` ReadReceipts *bool `protobuf:"varint,1,opt,name=readReceipts" json:"readReceipts,omitempty"` @@ -6218,7 +6536,7 @@ type SyncMessage_Configuration struct { func (x *SyncMessage_Configuration) Reset() { *x = SyncMessage_Configuration{} - mi := &file_SignalService_proto_msgTypes[58] + mi := &file_SignalService_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6230,7 +6548,7 @@ func (x *SyncMessage_Configuration) String() string { func (*SyncMessage_Configuration) ProtoMessage() {} func (x *SyncMessage_Configuration) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[58] + mi := &file_SignalService_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6292,7 +6610,7 @@ type SyncMessage_StickerPackOperation struct { func (x *SyncMessage_StickerPackOperation) Reset() { *x = SyncMessage_StickerPackOperation{} - mi := &file_SignalService_proto_msgTypes[59] + mi := &file_SignalService_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6304,7 +6622,7 @@ func (x *SyncMessage_StickerPackOperation) String() string { func (*SyncMessage_StickerPackOperation) ProtoMessage() {} func (x *SyncMessage_StickerPackOperation) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[59] + mi := &file_SignalService_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6342,16 +6660,17 @@ func (x *SyncMessage_StickerPackOperation) GetType() SyncMessage_StickerPackOper } type SyncMessage_ViewOnceOpen struct { - state protoimpl.MessageState `protogen:"open.v1"` - SenderAci *string `protobuf:"bytes,3,opt,name=senderAci" json:"senderAci,omitempty"` - Timestamp *uint64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + SenderAci *string `protobuf:"bytes,3,opt,name=senderAci" json:"senderAci,omitempty"` + Timestamp *uint64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` + SenderAciBinary []byte `protobuf:"bytes,4,opt,name=senderAciBinary" json:"senderAciBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SyncMessage_ViewOnceOpen) Reset() { *x = SyncMessage_ViewOnceOpen{} - mi := &file_SignalService_proto_msgTypes[60] + mi := &file_SignalService_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6363,7 +6682,7 @@ func (x *SyncMessage_ViewOnceOpen) String() string { func (*SyncMessage_ViewOnceOpen) ProtoMessage() {} func (x *SyncMessage_ViewOnceOpen) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[60] + mi := &file_SignalService_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6393,6 +6712,13 @@ func (x *SyncMessage_ViewOnceOpen) GetTimestamp() uint64 { return 0 } +func (x *SyncMessage_ViewOnceOpen) GetSenderAciBinary() []byte { + if x != nil { + return x.SenderAciBinary + } + return nil +} + type SyncMessage_FetchLatest struct { state protoimpl.MessageState `protogen:"open.v1"` Type *SyncMessage_FetchLatest_Type `protobuf:"varint,1,opt,name=type,enum=signalservice.SyncMessage_FetchLatest_Type" json:"type,omitempty"` @@ -6402,7 +6728,7 @@ type SyncMessage_FetchLatest struct { func (x *SyncMessage_FetchLatest) Reset() { *x = SyncMessage_FetchLatest{} - mi := &file_SignalService_proto_msgTypes[61] + mi := &file_SignalService_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6414,7 +6740,7 @@ func (x *SyncMessage_FetchLatest) String() string { func (*SyncMessage_FetchLatest) ProtoMessage() {} func (x *SyncMessage_FetchLatest) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[61] + mi := &file_SignalService_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6448,7 +6774,7 @@ type SyncMessage_Keys struct { func (x *SyncMessage_Keys) Reset() { *x = SyncMessage_Keys{} - mi := &file_SignalService_proto_msgTypes[62] + mi := &file_SignalService_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6460,7 +6786,7 @@ func (x *SyncMessage_Keys) String() string { func (*SyncMessage_Keys) ProtoMessage() {} func (x *SyncMessage_Keys) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[62] + mi := &file_SignalService_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6507,7 +6833,7 @@ type SyncMessage_PniIdentity struct { func (x *SyncMessage_PniIdentity) Reset() { *x = SyncMessage_PniIdentity{} - mi := &file_SignalService_proto_msgTypes[63] + mi := &file_SignalService_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6519,7 +6845,7 @@ func (x *SyncMessage_PniIdentity) String() string { func (*SyncMessage_PniIdentity) ProtoMessage() {} func (x *SyncMessage_PniIdentity) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[63] + mi := &file_SignalService_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6550,17 +6876,18 @@ func (x *SyncMessage_PniIdentity) GetPrivateKey() []byte { } type SyncMessage_MessageRequestResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ThreadAci *string `protobuf:"bytes,2,opt,name=threadAci" json:"threadAci,omitempty"` - GroupId []byte `protobuf:"bytes,3,opt,name=groupId" json:"groupId,omitempty"` - Type *SyncMessage_MessageRequestResponse_Type `protobuf:"varint,4,opt,name=type,enum=signalservice.SyncMessage_MessageRequestResponse_Type" json:"type,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ThreadAci *string `protobuf:"bytes,2,opt,name=threadAci" json:"threadAci,omitempty"` + GroupId []byte `protobuf:"bytes,3,opt,name=groupId" json:"groupId,omitempty"` + Type *SyncMessage_MessageRequestResponse_Type `protobuf:"varint,4,opt,name=type,enum=signalservice.SyncMessage_MessageRequestResponse_Type" json:"type,omitempty"` + ThreadAciBinary []byte `protobuf:"bytes,5,opt,name=threadAciBinary" json:"threadAciBinary,omitempty"` // 16-byte UUID + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SyncMessage_MessageRequestResponse) Reset() { *x = SyncMessage_MessageRequestResponse{} - mi := &file_SignalService_proto_msgTypes[64] + mi := &file_SignalService_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6572,7 +6899,7 @@ func (x *SyncMessage_MessageRequestResponse) String() string { func (*SyncMessage_MessageRequestResponse) ProtoMessage() {} func (x *SyncMessage_MessageRequestResponse) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[64] + mi := &file_SignalService_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6609,6 +6936,13 @@ func (x *SyncMessage_MessageRequestResponse) GetType() SyncMessage_MessageReques return SyncMessage_MessageRequestResponse_UNKNOWN } +func (x *SyncMessage_MessageRequestResponse) GetThreadAciBinary() []byte { + if x != nil { + return x.ThreadAciBinary + } + return nil +} + type SyncMessage_OutgoingPayment struct { state protoimpl.MessageState `protogen:"open.v1"` RecipientServiceId *string `protobuf:"bytes,1,opt,name=recipientServiceId" json:"recipientServiceId,omitempty"` @@ -6623,7 +6957,7 @@ type SyncMessage_OutgoingPayment struct { func (x *SyncMessage_OutgoingPayment) Reset() { *x = SyncMessage_OutgoingPayment{} - mi := &file_SignalService_proto_msgTypes[65] + mi := &file_SignalService_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6635,7 +6969,7 @@ func (x *SyncMessage_OutgoingPayment) String() string { func (*SyncMessage_OutgoingPayment) ProtoMessage() {} func (x *SyncMessage_OutgoingPayment) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[65] + mi := &file_SignalService_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6705,7 +7039,7 @@ type SyncMessage_PniChangeNumber struct { func (x *SyncMessage_PniChangeNumber) Reset() { *x = SyncMessage_PniChangeNumber{} - mi := &file_SignalService_proto_msgTypes[66] + mi := &file_SignalService_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6717,7 +7051,7 @@ func (x *SyncMessage_PniChangeNumber) String() string { func (*SyncMessage_PniChangeNumber) ProtoMessage() {} func (x *SyncMessage_PniChangeNumber) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[66] + mi := &file_SignalService_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6787,7 +7121,7 @@ type SyncMessage_CallEvent struct { func (x *SyncMessage_CallEvent) Reset() { *x = SyncMessage_CallEvent{} - mi := &file_SignalService_proto_msgTypes[67] + mi := &file_SignalService_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6799,7 +7133,7 @@ func (x *SyncMessage_CallEvent) String() string { func (*SyncMessage_CallEvent) ProtoMessage() {} func (x *SyncMessage_CallEvent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[67] + mi := &file_SignalService_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6869,7 +7203,7 @@ type SyncMessage_CallLinkUpdate struct { func (x *SyncMessage_CallLinkUpdate) Reset() { *x = SyncMessage_CallLinkUpdate{} - mi := &file_SignalService_proto_msgTypes[68] + mi := &file_SignalService_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6881,7 +7215,7 @@ func (x *SyncMessage_CallLinkUpdate) String() string { func (*SyncMessage_CallLinkUpdate) ProtoMessage() {} func (x *SyncMessage_CallLinkUpdate) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[68] + mi := &file_SignalService_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6942,7 +7276,7 @@ type SyncMessage_CallLogEvent struct { func (x *SyncMessage_CallLogEvent) Reset() { *x = SyncMessage_CallLogEvent{} - mi := &file_SignalService_proto_msgTypes[69] + mi := &file_SignalService_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6954,7 +7288,7 @@ func (x *SyncMessage_CallLogEvent) String() string { func (*SyncMessage_CallLogEvent) ProtoMessage() {} func (x *SyncMessage_CallLogEvent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[69] + mi := &file_SignalService_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7010,7 +7344,7 @@ type SyncMessage_DeleteForMe struct { func (x *SyncMessage_DeleteForMe) Reset() { *x = SyncMessage_DeleteForMe{} - mi := &file_SignalService_proto_msgTypes[70] + mi := &file_SignalService_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7022,7 +7356,7 @@ func (x *SyncMessage_DeleteForMe) String() string { func (*SyncMessage_DeleteForMe) ProtoMessage() {} func (x *SyncMessage_DeleteForMe) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[70] + mi := &file_SignalService_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7075,7 +7409,7 @@ type SyncMessage_DeviceNameChange struct { func (x *SyncMessage_DeviceNameChange) Reset() { *x = SyncMessage_DeviceNameChange{} - mi := &file_SignalService_proto_msgTypes[71] + mi := &file_SignalService_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7087,7 +7421,7 @@ func (x *SyncMessage_DeviceNameChange) String() string { func (*SyncMessage_DeviceNameChange) ProtoMessage() {} func (x *SyncMessage_DeviceNameChange) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[71] + mi := &file_SignalService_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7120,7 +7454,7 @@ type SyncMessage_AttachmentBackfillRequest struct { func (x *SyncMessage_AttachmentBackfillRequest) Reset() { *x = SyncMessage_AttachmentBackfillRequest{} - mi := &file_SignalService_proto_msgTypes[72] + mi := &file_SignalService_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7132,7 +7466,7 @@ func (x *SyncMessage_AttachmentBackfillRequest) String() string { func (*SyncMessage_AttachmentBackfillRequest) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillRequest) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[72] + mi := &file_SignalService_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7177,7 +7511,7 @@ type SyncMessage_AttachmentBackfillResponse struct { func (x *SyncMessage_AttachmentBackfillResponse) Reset() { *x = SyncMessage_AttachmentBackfillResponse{} - mi := &file_SignalService_proto_msgTypes[73] + mi := &file_SignalService_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7189,7 +7523,7 @@ func (x *SyncMessage_AttachmentBackfillResponse) String() string { func (*SyncMessage_AttachmentBackfillResponse) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[73] + mi := &file_SignalService_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7263,17 +7597,18 @@ func (*SyncMessage_AttachmentBackfillResponse_Error_) isSyncMessage_AttachmentBa } type SyncMessage_Sent_UnidentifiedDeliveryStatus struct { - state protoimpl.MessageState `protogen:"open.v1"` - DestinationServiceId *string `protobuf:"bytes,3,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` - Unidentified *bool `protobuf:"varint,2,opt,name=unidentified" json:"unidentified,omitempty"` - DestinationPniIdentityKey []byte `protobuf:"bytes,5,opt,name=destinationPniIdentityKey" json:"destinationPniIdentityKey,omitempty"` // Only set for PNI destinations - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + DestinationServiceId *string `protobuf:"bytes,3,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` + Unidentified *bool `protobuf:"varint,2,opt,name=unidentified" json:"unidentified,omitempty"` + DestinationPniIdentityKey []byte `protobuf:"bytes,5,opt,name=destinationPniIdentityKey" json:"destinationPniIdentityKey,omitempty"` // Only set for PNI destinations + DestinationServiceIdBinary []byte `protobuf:"bytes,6,opt,name=destinationServiceIdBinary" json:"destinationServiceIdBinary,omitempty"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) Reset() { *x = SyncMessage_Sent_UnidentifiedDeliveryStatus{} - mi := &file_SignalService_proto_msgTypes[74] + mi := &file_SignalService_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7285,7 +7620,7 @@ func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) String() string { func (*SyncMessage_Sent_UnidentifiedDeliveryStatus) ProtoMessage() {} func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[74] + mi := &file_SignalService_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7322,18 +7657,26 @@ func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) GetDestinationPniIdentityK return nil } +func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) GetDestinationServiceIdBinary() []byte { + if x != nil { + return x.DestinationServiceIdBinary + } + return nil +} + type SyncMessage_Sent_StoryMessageRecipient struct { - state protoimpl.MessageState `protogen:"open.v1"` - DestinationServiceId *string `protobuf:"bytes,1,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` - DistributionListIds []string `protobuf:"bytes,2,rep,name=distributionListIds" json:"distributionListIds,omitempty"` - IsAllowedToReply *bool `protobuf:"varint,3,opt,name=isAllowedToReply" json:"isAllowedToReply,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + DestinationServiceId *string `protobuf:"bytes,1,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` + DistributionListIds []string `protobuf:"bytes,2,rep,name=distributionListIds" json:"distributionListIds,omitempty"` + IsAllowedToReply *bool `protobuf:"varint,3,opt,name=isAllowedToReply" json:"isAllowedToReply,omitempty"` + DestinationServiceIdBinary []byte `protobuf:"bytes,5,opt,name=destinationServiceIdBinary" json:"destinationServiceIdBinary,omitempty"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SyncMessage_Sent_StoryMessageRecipient) Reset() { *x = SyncMessage_Sent_StoryMessageRecipient{} - mi := &file_SignalService_proto_msgTypes[75] + mi := &file_SignalService_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7345,7 +7688,7 @@ func (x *SyncMessage_Sent_StoryMessageRecipient) String() string { func (*SyncMessage_Sent_StoryMessageRecipient) ProtoMessage() {} func (x *SyncMessage_Sent_StoryMessageRecipient) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[75] + mi := &file_SignalService_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7382,6 +7725,13 @@ func (x *SyncMessage_Sent_StoryMessageRecipient) GetIsAllowedToReply() bool { return false } +func (x *SyncMessage_Sent_StoryMessageRecipient) GetDestinationServiceIdBinary() []byte { + if x != nil { + return x.DestinationServiceIdBinary + } + return nil +} + type SyncMessage_OutgoingPayment_MobileCoin struct { state protoimpl.MessageState `protogen:"open.v1"` RecipientAddress []byte `protobuf:"bytes,1,opt,name=recipientAddress" json:"recipientAddress,omitempty"` @@ -7398,7 +7748,7 @@ type SyncMessage_OutgoingPayment_MobileCoin struct { func (x *SyncMessage_OutgoingPayment_MobileCoin) Reset() { *x = SyncMessage_OutgoingPayment_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[76] + mi := &file_SignalService_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7410,7 +7760,7 @@ func (x *SyncMessage_OutgoingPayment_MobileCoin) String() string { func (*SyncMessage_OutgoingPayment_MobileCoin) ProtoMessage() {} func (x *SyncMessage_OutgoingPayment_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[76] + mi := &file_SignalService_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7492,7 +7842,7 @@ type SyncMessage_DeleteForMe_MessageDeletes struct { func (x *SyncMessage_DeleteForMe_MessageDeletes) Reset() { *x = SyncMessage_DeleteForMe_MessageDeletes{} - mi := &file_SignalService_proto_msgTypes[77] + mi := &file_SignalService_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7504,7 +7854,7 @@ func (x *SyncMessage_DeleteForMe_MessageDeletes) String() string { func (*SyncMessage_DeleteForMe_MessageDeletes) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_MessageDeletes) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[77] + mi := &file_SignalService_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7550,7 +7900,7 @@ type SyncMessage_DeleteForMe_AttachmentDelete struct { func (x *SyncMessage_DeleteForMe_AttachmentDelete) Reset() { *x = SyncMessage_DeleteForMe_AttachmentDelete{} - mi := &file_SignalService_proto_msgTypes[78] + mi := &file_SignalService_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7562,7 +7912,7 @@ func (x *SyncMessage_DeleteForMe_AttachmentDelete) String() string { func (*SyncMessage_DeleteForMe_AttachmentDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_AttachmentDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[78] + mi := &file_SignalService_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7625,7 +7975,7 @@ type SyncMessage_DeleteForMe_ConversationDelete struct { func (x *SyncMessage_DeleteForMe_ConversationDelete) Reset() { *x = SyncMessage_DeleteForMe_ConversationDelete{} - mi := &file_SignalService_proto_msgTypes[79] + mi := &file_SignalService_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7637,7 +7987,7 @@ func (x *SyncMessage_DeleteForMe_ConversationDelete) String() string { func (*SyncMessage_DeleteForMe_ConversationDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_ConversationDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[79] + mi := &file_SignalService_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7690,7 +8040,7 @@ type SyncMessage_DeleteForMe_LocalOnlyConversationDelete struct { func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) Reset() { *x = SyncMessage_DeleteForMe_LocalOnlyConversationDelete{} - mi := &file_SignalService_proto_msgTypes[80] + mi := &file_SignalService_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7702,7 +8052,7 @@ func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) String() string { func (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[80] + mi := &file_SignalService_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7738,7 +8088,7 @@ type SyncMessage_AttachmentBackfillResponse_AttachmentData struct { func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) Reset() { *x = SyncMessage_AttachmentBackfillResponse_AttachmentData{} - mi := &file_SignalService_proto_msgTypes[81] + mi := &file_SignalService_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7750,7 +8100,7 @@ func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) String() string func (*SyncMessage_AttachmentBackfillResponse_AttachmentData) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[81] + mi := &file_SignalService_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7819,7 +8169,7 @@ type SyncMessage_AttachmentBackfillResponse_AttachmentDataList struct { func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) Reset() { *x = SyncMessage_AttachmentBackfillResponse_AttachmentDataList{} - mi := &file_SignalService_proto_msgTypes[82] + mi := &file_SignalService_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7831,7 +8181,7 @@ func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) String() str func (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[82] + mi := &file_SignalService_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7871,7 +8221,7 @@ type ContactDetails_Avatar struct { func (x *ContactDetails_Avatar) Reset() { *x = ContactDetails_Avatar{} - mi := &file_SignalService_proto_msgTypes[83] + mi := &file_SignalService_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7883,7 +8233,7 @@ func (x *ContactDetails_Avatar) String() string { func (*ContactDetails_Avatar) ProtoMessage() {} func (x *ContactDetails_Avatar) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[83] + mi := &file_SignalService_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7923,7 +8273,7 @@ type PaymentAddress_MobileCoin struct { func (x *PaymentAddress_MobileCoin) Reset() { *x = PaymentAddress_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[84] + mi := &file_SignalService_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7935,7 +8285,7 @@ func (x *PaymentAddress_MobileCoin) String() string { func (*PaymentAddress_MobileCoin) ProtoMessage() {} func (x *PaymentAddress_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[84] + mi := &file_SignalService_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7969,7 +8319,7 @@ var File_SignalService_proto protoreflect.FileDescriptor const file_SignalService_proto_rawDesc = "" + "\n" + - "\x13SignalService.proto\x12\rsignalservice\"\xa7\x05\n" + + "\x13SignalService.proto\x12\rsignalservice\"\xf5\x06\n" + "\bEnvelope\x120\n" + "\x04type\x18\x01 \x01(\x0e2\x1c.signalservice.Envelope.TypeR\x04type\x12(\n" + "\x0fsourceServiceId\x18\v \x01(\tR\x0fsourceServiceId\x12\"\n" + @@ -7988,7 +8338,11 @@ const file_SignalService_proto_rawDesc = "" + "updatedPni\x18\x0f \x01(\tR\n" + "updatedPni\x12\x14\n" + "\x05story\x18\x10 \x01(\bR\x05story\x12*\n" + - "\x11report_spam_token\x18\x11 \x01(\fR\x0freportSpamToken\"\xae\x01\n" + + "\x11report_spam_token\x18\x11 \x01(\fR\x0freportSpamToken\x124\n" + + "\x15sourceServiceIdBinary\x18\x13 \x01(\fR\x15sourceServiceIdBinary\x12>\n" + + "\x1adestinationServiceIdBinary\x18\x14 \x01(\fR\x1adestinationServiceIdBinary\x12*\n" + + "\x10serverGuidBinary\x18\x15 \x01(\fR\x10serverGuidBinary\x12*\n" + + "\x10updatedPniBinary\x18\x16 \x01(\fR\x10updatedPniBinary\"\xae\x01\n" + "\x04Type\x12\v\n" + "\aUNKNOWN\x10\x00\x12\x0e\n" + "\n" + @@ -8050,7 +8404,7 @@ const file_SignalService_proto_rawDesc = "" + "\aurgency\x18\x02 \x01(\x0e2).signalservice.CallMessage.Opaque.UrgencyR\aurgency\"0\n" + "\aUrgency\x12\r\n" + "\tDROPPABLE\x10\x00\x12\x16\n" + - "\x12HANDLE_IMMEDIATELY\x10\x01J\x04\b\x04\x10\x05J\x04\b\x06\x10\aJ\x04\b\b\x10\t\"\xca'\n" + + "\x12HANDLE_IMMEDIATELY\x10\x01J\x04\b\x04\x10\x05J\x04\b\x06\x10\aJ\x04\b\b\x10\t\"\xca,\n" + "\vDataMessage\x12\x12\n" + "\x04body\x18\x01 \x01(\tR\x04body\x12B\n" + "\vattachments\x18\x02 \x03(\v2 .signalservice.AttachmentPointerR\vattachments\x127\n" + @@ -8084,7 +8438,11 @@ const file_SignalService_proto_rawDesc = "" + "pollCreate\x18\x18 \x01(\v2%.signalservice.DataMessage.PollCreateR\n" + "pollCreate\x12N\n" + "\rpollTerminate\x18\x19 \x01(\v2(.signalservice.DataMessage.PollTerminateR\rpollTerminate\x12?\n" + - "\bpollVote\x18\x1a \x01(\v2#.signalservice.DataMessage.PollVoteR\bpollVote\x1a\x9a\x05\n" + + "\bpollVote\x18\x1a \x01(\v2#.signalservice.DataMessage.PollVoteR\bpollVote\x12E\n" + + "\n" + + "pinMessage\x18\x1b \x01(\v2%.signalservice.DataMessage.PinMessageR\n" + + "pinMessage\x12K\n" + + "\funpinMessage\x18\x1c \x01(\v2'.signalservice.DataMessage.UnpinMessageR\funpinMessage\x1a\x9a\x05\n" + "\aPayment\x12U\n" + "\fnotification\x18\x01 \x01(\v2/.signalservice.DataMessage.Payment.NotificationH\x00R\fnotification\x12O\n" + "\n" + @@ -8113,7 +8471,7 @@ const file_SignalService_proto_rawDesc = "" + "\x04Type\x12\v\n" + "\aREQUEST\x10\x00\x12\r\n" + "\tACTIVATED\x10\x01B\x06\n" + - "\x04ItemJ\x06\b\xea\a\x10\xeb\aJ\x06\b\xeb\a\x10\xec\a\x1a\xda\x03\n" + + "\x04ItemJ\x06\b\xea\a\x10\xeb\aJ\x06\b\xeb\a\x10\xec\a\x1a\x84\x04\n" + "\x05Quote\x12\x0e\n" + "\x02id\x18\x01 \x01(\x04R\x02id\x12\x1c\n" + "\tauthorAci\x18\x05 \x01(\tR\tauthorAci\x12\x12\n" + @@ -8122,7 +8480,8 @@ const file_SignalService_proto_rawDesc = "" + "\n" + "bodyRanges\x18\x06 \x03(\v2\x18.signalservice.BodyRangeR\n" + "bodyRanges\x129\n" + - "\x04type\x18\a \x01(\x0e2%.signalservice.DataMessage.Quote.TypeR\x04type\x1a\x90\x01\n" + + "\x04type\x18\a \x01(\x0e2%.signalservice.DataMessage.Quote.TypeR\x04type\x12(\n" + + "\x0fauthorAciBinary\x18\b \x01(\fR\x0fauthorAciBinary\x1a\x90\x01\n" + "\x10QuotedAttachment\x12 \n" + "\vcontentType\x18\x01 \x01(\tR\vcontentType\x12\x1a\n" + "\bfileName\x18\x02 \x01(\tR\bfileName\x12>\n" + @@ -8197,19 +8556,21 @@ const file_SignalService_proto_rawDesc = "" + "\apackKey\x18\x02 \x01(\fR\apackKey\x12\x1c\n" + "\tstickerId\x18\x03 \x01(\rR\tstickerId\x124\n" + "\x04data\x18\x04 \x01(\v2 .signalservice.AttachmentPointerR\x04data\x12\x14\n" + - "\x05emoji\x18\x05 \x01(\tR\x05emoji\x1a\x9a\x01\n" + + "\x05emoji\x18\x05 \x01(\tR\x05emoji\x1a\xd0\x01\n" + "\bReaction\x12\x14\n" + "\x05emoji\x18\x01 \x01(\tR\x05emoji\x12\x16\n" + "\x06remove\x18\x02 \x01(\bR\x06remove\x12(\n" + "\x0ftargetAuthorAci\x18\x04 \x01(\tR\x0ftargetAuthorAci\x120\n" + - "\x13targetSentTimestamp\x18\x05 \x01(\x04R\x13targetSentTimestampJ\x04\b\x03\x10\x04\x1a:\n" + + "\x13targetSentTimestamp\x18\x05 \x01(\x04R\x13targetSentTimestamp\x124\n" + + "\x15targetAuthorAciBinary\x18\x06 \x01(\fR\x15targetAuthorAciBinaryJ\x04\b\x03\x10\x04\x1a:\n" + "\x06Delete\x120\n" + "\x13targetSentTimestamp\x18\x01 \x01(\x04R\x13targetSentTimestamp\x1a'\n" + "\x0fGroupCallUpdate\x12\x14\n" + - "\x05eraId\x18\x01 \x01(\tR\x05eraId\x1aR\n" + + "\x05eraId\x18\x01 \x01(\tR\x05eraId\x1a|\n" + "\fStoryContext\x12\x1c\n" + "\tauthorAci\x18\x01 \x01(\tR\tauthorAci\x12$\n" + - "\rsentTimestamp\x18\x02 \x01(\x04R\rsentTimestamp\x1aQ\n" + + "\rsentTimestamp\x18\x02 \x01(\x04R\rsentTimestamp\x12(\n" + + "\x0fauthorAciBinary\x18\x03 \x01(\fR\x0fauthorAciBinary\x1aQ\n" + "\tGiftBadge\x12D\n" + "\x1dreceiptCredentialPresentation\x18\x01 \x01(\fR\x1dreceiptCredentialPresentation\x1ah\n" + "\n" + @@ -8223,7 +8584,17 @@ const file_SignalService_proto_rawDesc = "" + "\x15targetAuthorAciBinary\x18\x01 \x01(\fR\x15targetAuthorAciBinary\x120\n" + "\x13targetSentTimestamp\x18\x02 \x01(\x04R\x13targetSentTimestamp\x12$\n" + "\roptionIndexes\x18\x03 \x03(\rR\roptionIndexes\x12\x1c\n" + - "\tvoteCount\x18\x04 \x01(\rR\tvoteCount\"Z\n" + + "\tvoteCount\x18\x04 \x01(\rR\tvoteCount\x1a\xe7\x01\n" + + "\n" + + "PinMessage\x124\n" + + "\x15targetAuthorAciBinary\x18\x01 \x01(\fR\x15targetAuthorAciBinary\x120\n" + + "\x13targetSentTimestamp\x18\x02 \x01(\x04R\x13targetSentTimestamp\x120\n" + + "\x12pinDurationSeconds\x18\x03 \x01(\rH\x00R\x12pinDurationSeconds\x120\n" + + "\x12pinDurationForever\x18\x04 \x01(\bH\x00R\x12pinDurationForeverB\r\n" + + "\vpinDuration\x1av\n" + + "\fUnpinMessage\x124\n" + + "\x15targetAuthorAciBinary\x18\x01 \x01(\fR\x15targetAuthorAciBinary\x120\n" + + "\x13targetSentTimestamp\x18\x02 \x01(\x04R\x13targetSentTimestamp\"Z\n" + "\x05Flags\x12\x0f\n" + "\vEND_SESSION\x10\x01\x12\x1b\n" + "\x17EXPIRATION_TIMER_UPDATE\x10\x02\x12\x16\n" + @@ -8239,7 +8610,7 @@ const file_SignalService_proto_rawDesc = "" + "\bMENTIONS\x10\x06\x12\f\n" + "\bPAYMENTS\x10\a\x12\t\n" + "\x05POLLS\x10\b\x12\v\n" + - "\aCURRENT\x10\a\x1a\x02\x10\x01J\x04\b\x03\x10\x04\"'\n" + + "\aCURRENT\x10\b\x1a\x02\x10\x01J\x04\b\x03\x10\x04\"'\n" + "\vNullMessage\x12\x18\n" + "\apadding\x18\x01 \x01(\fR\apadding\"\x92\x01\n" + "\x0eReceiptMessage\x126\n" + @@ -8301,17 +8672,18 @@ const file_SignalService_proto_rawDesc = "" + "\x06SCRIPT\x10\x04\x12\r\n" + "\tCONDENSED\x10\x05B\f\n" + "\n" + - "background\"\xe5\x01\n" + + "background\"\x99\x02\n" + "\bVerified\x12&\n" + "\x0edestinationAci\x18\x05 \x01(\tR\x0edestinationAci\x12 \n" + "\videntityKey\x18\x02 \x01(\fR\videntityKey\x123\n" + "\x05state\x18\x03 \x01(\x0e2\x1d.signalservice.Verified.StateR\x05state\x12 \n" + - "\vnullMessage\x18\x04 \x01(\fR\vnullMessage\"2\n" + + "\vnullMessage\x18\x04 \x01(\fR\vnullMessage\x122\n" + + "\x14destinationAciBinary\x18\x06 \x01(\fR\x14destinationAciBinary\"2\n" + "\x05State\x12\v\n" + "\aDEFAULT\x10\x00\x12\f\n" + "\bVERIFIED\x10\x01\x12\x0e\n" + "\n" + - "UNVERIFIED\x10\x02J\x04\b\x01\x10\x02\"\x87D\n" + + "UNVERIFIED\x10\x02J\x04\b\x01\x10\x02\"\x8fG\n" + "\vSyncMessage\x123\n" + "\x04sent\x18\x01 \x01(\v2\x1f.signalservice.SyncMessage.SentR\x04sent\x12?\n" + "\bcontacts\x18\x02 \x01(\v2#.signalservice.SyncMessage.ContactsR\bcontacts\x12<\n" + @@ -8336,7 +8708,7 @@ const file_SignalService_proto_rawDesc = "" + "\vdeleteForMe\x18\x16 \x01(\v2&.signalservice.SyncMessage.DeleteForMeR\vdeleteForMe\x12W\n" + "\x10deviceNameChange\x18\x17 \x01(\v2+.signalservice.SyncMessage.DeviceNameChangeR\x10deviceNameChange\x12r\n" + "\x19attachmentBackfillRequest\x18\x18 \x01(\v24.signalservice.SyncMessage.AttachmentBackfillRequestR\x19attachmentBackfillRequest\x12u\n" + - "\x1aattachmentBackfillResponse\x18\x19 \x01(\v25.signalservice.SyncMessage.AttachmentBackfillResponseR\x1aattachmentBackfillResponse\x1a\xfc\a\n" + + "\x1aattachmentBackfillResponse\x18\x19 \x01(\v25.signalservice.SyncMessage.AttachmentBackfillResponseR\x1aattachmentBackfillResponse\x1a\xbc\t\n" + "\x04Sent\x12(\n" + "\x0fdestinationE164\x18\x01 \x01(\tR\x0fdestinationE164\x122\n" + "\x14destinationServiceId\x18\a \x01(\tR\x14destinationServiceId\x12\x1c\n" + @@ -8348,22 +8720,28 @@ const file_SignalService_proto_rawDesc = "" + "\fstoryMessage\x18\b \x01(\v2\x1b.signalservice.StoryMessageR\fstoryMessage\x12m\n" + "\x16storyMessageRecipients\x18\t \x03(\v25.signalservice.SyncMessage.Sent.StoryMessageRecipientR\x16storyMessageRecipients\x12<\n" + "\veditMessage\x18\n" + - " \x01(\v2\x1a.signalservice.EditMessageR\veditMessage\x1a\xbe\x01\n" + + " \x01(\v2\x1a.signalservice.EditMessageR\veditMessage\x12>\n" + + "\x1adestinationServiceIdBinary\x18\f \x01(\fR\x1adestinationServiceIdBinary\x1a\xfe\x01\n" + "\x1aUnidentifiedDeliveryStatus\x122\n" + "\x14destinationServiceId\x18\x03 \x01(\tR\x14destinationServiceId\x12\"\n" + "\funidentified\x18\x02 \x01(\bR\funidentified\x12<\n" + - "\x19destinationPniIdentityKey\x18\x05 \x01(\fR\x19destinationPniIdentityKeyJ\x04\b\x01\x10\x02J\x04\b\x04\x10\x05\x1a\xaf\x01\n" + + "\x19destinationPniIdentityKey\x18\x05 \x01(\fR\x19destinationPniIdentityKey\x12>\n" + + "\x1adestinationServiceIdBinary\x18\x06 \x01(\fR\x1adestinationServiceIdBinaryJ\x04\b\x01\x10\x02J\x04\b\x04\x10\x05\x1a\xef\x01\n" + "\x15StoryMessageRecipient\x122\n" + "\x14destinationServiceId\x18\x01 \x01(\tR\x14destinationServiceId\x120\n" + "\x13distributionListIds\x18\x02 \x03(\tR\x13distributionListIds\x12*\n" + - "\x10isAllowedToReply\x18\x03 \x01(\bR\x10isAllowedToReplyJ\x04\b\x04\x10\x05J\x04\b\v\x10\f\x1ac\n" + + "\x10isAllowedToReply\x18\x03 \x01(\bR\x10isAllowedToReply\x12>\n" + + "\x1adestinationServiceIdBinary\x18\x05 \x01(\fR\x1adestinationServiceIdBinaryJ\x04\b\x04\x10\x05J\x04\b\v\x10\f\x1ac\n" + "\bContacts\x124\n" + "\x04blob\x18\x01 \x01(\v2 .signalservice.AttachmentPointerR\x04blob\x12!\n" + - "\bcomplete\x18\x02 \x01(\b:\x05falseR\bcomplete\x1aS\n" + + "\bcomplete\x18\x02 \x01(\b:\x05falseR\bcomplete\x1as\n" + "\aBlocked\x12\x18\n" + "\anumbers\x18\x01 \x03(\tR\anumbers\x12\x12\n" + "\x04acis\x18\x03 \x03(\tR\x04acis\x12\x1a\n" + - "\bgroupIds\x18\x02 \x03(\fR\bgroupIds\x1a\x9f\x01\n" + + "\bgroupIds\x18\x02 \x03(\fR\bgroupIds\x12\x1e\n" + + "\n" + + "acisBinary\x18\x04 \x03(\fR\n" + + "acisBinary\x1a\x9f\x01\n" + "\aRequest\x12;\n" + "\x04type\x18\x01 \x01(\x0e2'.signalservice.SyncMessage.Request.TypeR\x04type\"W\n" + "\x04Type\x12\v\n" + @@ -8371,13 +8749,15 @@ const file_SignalService_proto_rawDesc = "" + "\bCONTACTS\x10\x01\x12\v\n" + "\aBLOCKED\x10\x03\x12\x11\n" + "\rCONFIGURATION\x10\x04\x12\b\n" + - "\x04KEYS\x10\x05\"\x04\b\x02\x10\x02\"\x04\b\x06\x10\x06\x1aH\n" + + "\x04KEYS\x10\x05\"\x04\b\x02\x10\x02\"\x04\b\x06\x10\x06\x1ar\n" + "\x04Read\x12\x1c\n" + "\tsenderAci\x18\x03 \x01(\tR\tsenderAci\x12\x1c\n" + - "\ttimestamp\x18\x02 \x01(\x04R\ttimestampJ\x04\b\x01\x10\x02\x1aJ\n" + + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\x12(\n" + + "\x0fsenderAciBinary\x18\x04 \x01(\fR\x0fsenderAciBinaryJ\x04\b\x01\x10\x02\x1at\n" + "\x06Viewed\x12\x1c\n" + "\tsenderAci\x18\x03 \x01(\tR\tsenderAci\x12\x1c\n" + - "\ttimestamp\x18\x02 \x01(\x04R\ttimestampJ\x04\b\x01\x10\x02\x1a\x83\x02\n" + + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\x12(\n" + + "\x0fsenderAciBinary\x18\x04 \x01(\fR\x0fsenderAciBinaryJ\x04\b\x01\x10\x02\x1a\x83\x02\n" + "\rConfiguration\x12\"\n" + "\freadReceipts\x18\x01 \x01(\bR\freadReceipts\x12F\n" + "\x1eunidentifiedDeliveryIndicators\x18\x02 \x01(\bR\x1eunidentifiedDeliveryIndicators\x12*\n" + @@ -8391,10 +8771,11 @@ const file_SignalService_proto_rawDesc = "" + "\x04Type\x12\v\n" + "\aINSTALL\x10\x00\x12\n" + "\n" + - "\x06REMOVE\x10\x01\x1aP\n" + + "\x06REMOVE\x10\x01\x1az\n" + "\fViewOnceOpen\x12\x1c\n" + "\tsenderAci\x18\x03 \x01(\tR\tsenderAci\x12\x1c\n" + - "\ttimestamp\x18\x02 \x01(\x04R\ttimestampJ\x04\b\x01\x10\x02\x1a\xa5\x01\n" + + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\x12(\n" + + "\x0fsenderAciBinary\x18\x04 \x01(\fR\x0fsenderAciBinaryJ\x04\b\x01\x10\x02\x1a\xa5\x01\n" + "\vFetchLatest\x12?\n" + "\x04type\x18\x01 \x01(\x0e2+.signalservice.SyncMessage.FetchLatest.TypeR\x04type\"U\n" + "\x04Type\x12\v\n" + @@ -8410,11 +8791,12 @@ const file_SignalService_proto_rawDesc = "" + "\tpublicKey\x18\x01 \x01(\fR\tpublicKey\x12\x1e\n" + "\n" + "privateKey\x18\x02 \x01(\fR\n" + - "privateKey\x1a\x8e\x02\n" + + "privateKey\x1a\xb8\x02\n" + "\x16MessageRequestResponse\x12\x1c\n" + "\tthreadAci\x18\x02 \x01(\tR\tthreadAci\x12\x18\n" + "\agroupId\x18\x03 \x01(\fR\agroupId\x12J\n" + - "\x04type\x18\x04 \x01(\x0e26.signalservice.SyncMessage.MessageRequestResponse.TypeR\x04type\"j\n" + + "\x04type\x18\x04 \x01(\x0e26.signalservice.SyncMessage.MessageRequestResponse.TypeR\x04type\x12(\n" + + "\x0fthreadAciBinary\x18\x05 \x01(\fR\x0fthreadAciBinary\"j\n" + "\x04Type\x12\v\n" + "\aUNKNOWN\x10\x00\x12\n" + "\n" + @@ -8575,10 +8957,11 @@ const file_SignalService_proto_rawDesc = "" + "\x0eGroupContextV2\x12\x1c\n" + "\tmasterKey\x18\x01 \x01(\fR\tmasterKey\x12\x1a\n" + "\brevision\x18\x02 \x01(\rR\brevision\x12 \n" + - "\vgroupChange\x18\x03 \x01(\fR\vgroupChange\"\xe6\x02\n" + + "\vgroupChange\x18\x03 \x01(\fR\vgroupChange\"\x84\x03\n" + "\x0eContactDetails\x12\x16\n" + "\x06number\x18\x01 \x01(\tR\x06number\x12\x10\n" + - "\x03aci\x18\t \x01(\tR\x03aci\x12\x12\n" + + "\x03aci\x18\t \x01(\tR\x03aci\x12\x1c\n" + + "\taciBinary\x18\r \x01(\fR\taciBinary\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12<\n" + "\x06avatar\x18\x03 \x01(\v2$.signalservice.ContactDetails.AvatarR\x06avatar\x12 \n" + "\vexpireTimer\x18\b \x01(\rR\vexpireTimer\x12.\n" + @@ -8608,14 +8991,15 @@ const file_SignalService_proto_rawDesc = "" + "\tsignature\x18\x02 \x01(\fR\tsignature\"}\n" + "\vEditMessage\x120\n" + "\x13targetSentTimestamp\x18\x01 \x01(\x04R\x13targetSentTimestamp\x12<\n" + - "\vdataMessage\x18\x02 \x01(\v2\x1a.signalservice.DataMessageR\vdataMessage\"\xfe\x01\n" + + "\vdataMessage\x18\x02 \x01(\v2\x1a.signalservice.DataMessageR\vdataMessage\"\xac\x02\n" + "\tBodyRange\x12\x14\n" + "\x05start\x18\x01 \x01(\rR\x05start\x12\x16\n" + "\x06length\x18\x02 \x01(\rR\x06length\x12 \n" + "\n" + "mentionAci\x18\x03 \x01(\tH\x00R\n" + "mentionAci\x126\n" + - "\x05style\x18\x04 \x01(\x0e2\x1e.signalservice.BodyRange.StyleH\x00R\x05style\"V\n" + + "\x05style\x18\x04 \x01(\x0e2\x1e.signalservice.BodyRange.StyleH\x00R\x05style\x12,\n" + + "\x10mentionAciBinary\x18\x05 \x01(\fH\x00R\x10mentionAciBinary\"V\n" + "\x05Style\x12\b\n" + "\x04NONE\x10\x00\x12\b\n" + "\x04BOLD\x10\x01\x12\n" + @@ -8624,20 +9008,22 @@ const file_SignalService_proto_rawDesc = "" + "\aSPOILER\x10\x03\x12\x11\n" + "\rSTRIKETHROUGH\x10\x04\x12\r\n" + "\tMONOSPACE\x10\x05B\x11\n" + - "\x0fassociatedValue\"\x92\x01\n" + + "\x0fassociatedValue\"\xca\x01\n" + "\x12AddressableMessage\x12*\n" + "\x0fauthorServiceId\x18\x01 \x01(\tH\x00R\x0fauthorServiceId\x12 \n" + "\n" + "authorE164\x18\x02 \x01(\tH\x00R\n" + - "authorE164\x12$\n" + + "authorE164\x126\n" + + "\x15authorServiceIdBinary\x18\x04 \x01(\fH\x00R\x15authorServiceIdBinary\x12$\n" + "\rsentTimestamp\x18\x03 \x01(\x04R\rsentTimestampB\b\n" + - "\x06author\"\x9c\x01\n" + + "\x06author\"\xd4\x01\n" + "\x16ConversationIdentifier\x12*\n" + "\x0fthreadServiceId\x18\x01 \x01(\tH\x00R\x0fthreadServiceId\x12&\n" + "\rthreadGroupId\x18\x02 \x01(\fH\x00R\rthreadGroupId\x12 \n" + "\n" + "threadE164\x18\x03 \x01(\tH\x00R\n" + - "threadE164B\f\n" + + "threadE164\x126\n" + + "\x15threadServiceIdBinary\x18\x04 \x01(\fH\x00R\x15threadServiceIdBinaryB\f\n" + "\n" + "identifierBE\n" + ".org.whispersystems.signalservice.internal.pushB\x13SignalServiceProtos" @@ -8655,7 +9041,7 @@ func file_SignalService_proto_rawDescGZIP() []byte { } var file_SignalService_proto_enumTypes = make([]protoimpl.EnumInfo, 28) -var file_SignalService_proto_msgTypes = make([]protoimpl.MessageInfo, 85) +var file_SignalService_proto_msgTypes = make([]protoimpl.MessageInfo, 87) var file_SignalService_proto_goTypes = []any{ (Envelope_Type)(0), // 0: signalservice.Envelope.Type (CallMessage_Offer_Type)(0), // 1: signalservice.CallMessage.Offer.Type @@ -8725,51 +9111,53 @@ var file_SignalService_proto_goTypes = []any{ (*DataMessage_PollCreate)(nil), // 65: signalservice.DataMessage.PollCreate (*DataMessage_PollTerminate)(nil), // 66: signalservice.DataMessage.PollTerminate (*DataMessage_PollVote)(nil), // 67: signalservice.DataMessage.PollVote - (*DataMessage_Payment_Amount)(nil), // 68: signalservice.DataMessage.Payment.Amount - (*DataMessage_Payment_Notification)(nil), // 69: signalservice.DataMessage.Payment.Notification - (*DataMessage_Payment_Activation)(nil), // 70: signalservice.DataMessage.Payment.Activation - (*DataMessage_Payment_Amount_MobileCoin)(nil), // 71: signalservice.DataMessage.Payment.Amount.MobileCoin - (*DataMessage_Payment_Notification_MobileCoin)(nil), // 72: signalservice.DataMessage.Payment.Notification.MobileCoin - (*DataMessage_Quote_QuotedAttachment)(nil), // 73: signalservice.DataMessage.Quote.QuotedAttachment - (*DataMessage_Contact_Name)(nil), // 74: signalservice.DataMessage.Contact.Name - (*DataMessage_Contact_Phone)(nil), // 75: signalservice.DataMessage.Contact.Phone - (*DataMessage_Contact_Email)(nil), // 76: signalservice.DataMessage.Contact.Email - (*DataMessage_Contact_PostalAddress)(nil), // 77: signalservice.DataMessage.Contact.PostalAddress - (*DataMessage_Contact_Avatar)(nil), // 78: signalservice.DataMessage.Contact.Avatar - (*TextAttachment_Gradient)(nil), // 79: signalservice.TextAttachment.Gradient - (*SyncMessage_Sent)(nil), // 80: signalservice.SyncMessage.Sent - (*SyncMessage_Contacts)(nil), // 81: signalservice.SyncMessage.Contacts - (*SyncMessage_Blocked)(nil), // 82: signalservice.SyncMessage.Blocked - (*SyncMessage_Request)(nil), // 83: signalservice.SyncMessage.Request - (*SyncMessage_Read)(nil), // 84: signalservice.SyncMessage.Read - (*SyncMessage_Viewed)(nil), // 85: signalservice.SyncMessage.Viewed - (*SyncMessage_Configuration)(nil), // 86: signalservice.SyncMessage.Configuration - (*SyncMessage_StickerPackOperation)(nil), // 87: signalservice.SyncMessage.StickerPackOperation - (*SyncMessage_ViewOnceOpen)(nil), // 88: signalservice.SyncMessage.ViewOnceOpen - (*SyncMessage_FetchLatest)(nil), // 89: signalservice.SyncMessage.FetchLatest - (*SyncMessage_Keys)(nil), // 90: signalservice.SyncMessage.Keys - (*SyncMessage_PniIdentity)(nil), // 91: signalservice.SyncMessage.PniIdentity - (*SyncMessage_MessageRequestResponse)(nil), // 92: signalservice.SyncMessage.MessageRequestResponse - (*SyncMessage_OutgoingPayment)(nil), // 93: signalservice.SyncMessage.OutgoingPayment - (*SyncMessage_PniChangeNumber)(nil), // 94: signalservice.SyncMessage.PniChangeNumber - (*SyncMessage_CallEvent)(nil), // 95: signalservice.SyncMessage.CallEvent - (*SyncMessage_CallLinkUpdate)(nil), // 96: signalservice.SyncMessage.CallLinkUpdate - (*SyncMessage_CallLogEvent)(nil), // 97: signalservice.SyncMessage.CallLogEvent - (*SyncMessage_DeleteForMe)(nil), // 98: signalservice.SyncMessage.DeleteForMe - (*SyncMessage_DeviceNameChange)(nil), // 99: signalservice.SyncMessage.DeviceNameChange - (*SyncMessage_AttachmentBackfillRequest)(nil), // 100: signalservice.SyncMessage.AttachmentBackfillRequest - (*SyncMessage_AttachmentBackfillResponse)(nil), // 101: signalservice.SyncMessage.AttachmentBackfillResponse - (*SyncMessage_Sent_UnidentifiedDeliveryStatus)(nil), // 102: signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus - (*SyncMessage_Sent_StoryMessageRecipient)(nil), // 103: signalservice.SyncMessage.Sent.StoryMessageRecipient - (*SyncMessage_OutgoingPayment_MobileCoin)(nil), // 104: signalservice.SyncMessage.OutgoingPayment.MobileCoin - (*SyncMessage_DeleteForMe_MessageDeletes)(nil), // 105: signalservice.SyncMessage.DeleteForMe.MessageDeletes - (*SyncMessage_DeleteForMe_AttachmentDelete)(nil), // 106: signalservice.SyncMessage.DeleteForMe.AttachmentDelete - (*SyncMessage_DeleteForMe_ConversationDelete)(nil), // 107: signalservice.SyncMessage.DeleteForMe.ConversationDelete - (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete)(nil), // 108: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete - (*SyncMessage_AttachmentBackfillResponse_AttachmentData)(nil), // 109: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList)(nil), // 110: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList - (*ContactDetails_Avatar)(nil), // 111: signalservice.ContactDetails.Avatar - (*PaymentAddress_MobileCoin)(nil), // 112: signalservice.PaymentAddress.MobileCoin + (*DataMessage_PinMessage)(nil), // 68: signalservice.DataMessage.PinMessage + (*DataMessage_UnpinMessage)(nil), // 69: signalservice.DataMessage.UnpinMessage + (*DataMessage_Payment_Amount)(nil), // 70: signalservice.DataMessage.Payment.Amount + (*DataMessage_Payment_Notification)(nil), // 71: signalservice.DataMessage.Payment.Notification + (*DataMessage_Payment_Activation)(nil), // 72: signalservice.DataMessage.Payment.Activation + (*DataMessage_Payment_Amount_MobileCoin)(nil), // 73: signalservice.DataMessage.Payment.Amount.MobileCoin + (*DataMessage_Payment_Notification_MobileCoin)(nil), // 74: signalservice.DataMessage.Payment.Notification.MobileCoin + (*DataMessage_Quote_QuotedAttachment)(nil), // 75: signalservice.DataMessage.Quote.QuotedAttachment + (*DataMessage_Contact_Name)(nil), // 76: signalservice.DataMessage.Contact.Name + (*DataMessage_Contact_Phone)(nil), // 77: signalservice.DataMessage.Contact.Phone + (*DataMessage_Contact_Email)(nil), // 78: signalservice.DataMessage.Contact.Email + (*DataMessage_Contact_PostalAddress)(nil), // 79: signalservice.DataMessage.Contact.PostalAddress + (*DataMessage_Contact_Avatar)(nil), // 80: signalservice.DataMessage.Contact.Avatar + (*TextAttachment_Gradient)(nil), // 81: signalservice.TextAttachment.Gradient + (*SyncMessage_Sent)(nil), // 82: signalservice.SyncMessage.Sent + (*SyncMessage_Contacts)(nil), // 83: signalservice.SyncMessage.Contacts + (*SyncMessage_Blocked)(nil), // 84: signalservice.SyncMessage.Blocked + (*SyncMessage_Request)(nil), // 85: signalservice.SyncMessage.Request + (*SyncMessage_Read)(nil), // 86: signalservice.SyncMessage.Read + (*SyncMessage_Viewed)(nil), // 87: signalservice.SyncMessage.Viewed + (*SyncMessage_Configuration)(nil), // 88: signalservice.SyncMessage.Configuration + (*SyncMessage_StickerPackOperation)(nil), // 89: signalservice.SyncMessage.StickerPackOperation + (*SyncMessage_ViewOnceOpen)(nil), // 90: signalservice.SyncMessage.ViewOnceOpen + (*SyncMessage_FetchLatest)(nil), // 91: signalservice.SyncMessage.FetchLatest + (*SyncMessage_Keys)(nil), // 92: signalservice.SyncMessage.Keys + (*SyncMessage_PniIdentity)(nil), // 93: signalservice.SyncMessage.PniIdentity + (*SyncMessage_MessageRequestResponse)(nil), // 94: signalservice.SyncMessage.MessageRequestResponse + (*SyncMessage_OutgoingPayment)(nil), // 95: signalservice.SyncMessage.OutgoingPayment + (*SyncMessage_PniChangeNumber)(nil), // 96: signalservice.SyncMessage.PniChangeNumber + (*SyncMessage_CallEvent)(nil), // 97: signalservice.SyncMessage.CallEvent + (*SyncMessage_CallLinkUpdate)(nil), // 98: signalservice.SyncMessage.CallLinkUpdate + (*SyncMessage_CallLogEvent)(nil), // 99: signalservice.SyncMessage.CallLogEvent + (*SyncMessage_DeleteForMe)(nil), // 100: signalservice.SyncMessage.DeleteForMe + (*SyncMessage_DeviceNameChange)(nil), // 101: signalservice.SyncMessage.DeviceNameChange + (*SyncMessage_AttachmentBackfillRequest)(nil), // 102: signalservice.SyncMessage.AttachmentBackfillRequest + (*SyncMessage_AttachmentBackfillResponse)(nil), // 103: signalservice.SyncMessage.AttachmentBackfillResponse + (*SyncMessage_Sent_UnidentifiedDeliveryStatus)(nil), // 104: signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus + (*SyncMessage_Sent_StoryMessageRecipient)(nil), // 105: signalservice.SyncMessage.Sent.StoryMessageRecipient + (*SyncMessage_OutgoingPayment_MobileCoin)(nil), // 106: signalservice.SyncMessage.OutgoingPayment.MobileCoin + (*SyncMessage_DeleteForMe_MessageDeletes)(nil), // 107: signalservice.SyncMessage.DeleteForMe.MessageDeletes + (*SyncMessage_DeleteForMe_AttachmentDelete)(nil), // 108: signalservice.SyncMessage.DeleteForMe.AttachmentDelete + (*SyncMessage_DeleteForMe_ConversationDelete)(nil), // 109: signalservice.SyncMessage.DeleteForMe.ConversationDelete + (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete)(nil), // 110: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete + (*SyncMessage_AttachmentBackfillResponse_AttachmentData)(nil), // 111: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList)(nil), // 112: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList + (*ContactDetails_Avatar)(nil), // 113: signalservice.ContactDetails.Avatar + (*PaymentAddress_MobileCoin)(nil), // 114: signalservice.PaymentAddress.MobileCoin } var file_SignalService_proto_depIdxs = []int32{ 0, // 0: signalservice.Envelope.type:type_name -> signalservice.Envelope.Type @@ -8804,108 +9192,110 @@ var file_SignalService_proto_depIdxs = []int32{ 65, // 29: signalservice.DataMessage.pollCreate:type_name -> signalservice.DataMessage.PollCreate 66, // 30: signalservice.DataMessage.pollTerminate:type_name -> signalservice.DataMessage.PollTerminate 67, // 31: signalservice.DataMessage.pollVote:type_name -> signalservice.DataMessage.PollVote - 11, // 32: signalservice.ReceiptMessage.type:type_name -> signalservice.ReceiptMessage.Type - 12, // 33: signalservice.TypingMessage.action:type_name -> signalservice.TypingMessage.Action - 41, // 34: signalservice.StoryMessage.group:type_name -> signalservice.GroupContextV2 - 40, // 35: signalservice.StoryMessage.fileAttachment:type_name -> signalservice.AttachmentPointer - 37, // 36: signalservice.StoryMessage.textAttachment:type_name -> signalservice.TextAttachment - 47, // 37: signalservice.StoryMessage.bodyRanges:type_name -> signalservice.BodyRange - 40, // 38: signalservice.Preview.image:type_name -> signalservice.AttachmentPointer - 13, // 39: signalservice.TextAttachment.textStyle:type_name -> signalservice.TextAttachment.Style - 36, // 40: signalservice.TextAttachment.preview:type_name -> signalservice.Preview - 79, // 41: signalservice.TextAttachment.gradient:type_name -> signalservice.TextAttachment.Gradient - 14, // 42: signalservice.Verified.state:type_name -> signalservice.Verified.State - 80, // 43: signalservice.SyncMessage.sent:type_name -> signalservice.SyncMessage.Sent - 81, // 44: signalservice.SyncMessage.contacts:type_name -> signalservice.SyncMessage.Contacts - 83, // 45: signalservice.SyncMessage.request:type_name -> signalservice.SyncMessage.Request - 84, // 46: signalservice.SyncMessage.read:type_name -> signalservice.SyncMessage.Read - 82, // 47: signalservice.SyncMessage.blocked:type_name -> signalservice.SyncMessage.Blocked - 38, // 48: signalservice.SyncMessage.verified:type_name -> signalservice.Verified - 86, // 49: signalservice.SyncMessage.configuration:type_name -> signalservice.SyncMessage.Configuration - 87, // 50: signalservice.SyncMessage.stickerPackOperation:type_name -> signalservice.SyncMessage.StickerPackOperation - 88, // 51: signalservice.SyncMessage.viewOnceOpen:type_name -> signalservice.SyncMessage.ViewOnceOpen - 89, // 52: signalservice.SyncMessage.fetchLatest:type_name -> signalservice.SyncMessage.FetchLatest - 90, // 53: signalservice.SyncMessage.keys:type_name -> signalservice.SyncMessage.Keys - 92, // 54: signalservice.SyncMessage.messageRequestResponse:type_name -> signalservice.SyncMessage.MessageRequestResponse - 93, // 55: signalservice.SyncMessage.outgoingPayment:type_name -> signalservice.SyncMessage.OutgoingPayment - 85, // 56: signalservice.SyncMessage.viewed:type_name -> signalservice.SyncMessage.Viewed - 94, // 57: signalservice.SyncMessage.pniChangeNumber:type_name -> signalservice.SyncMessage.PniChangeNumber - 95, // 58: signalservice.SyncMessage.callEvent:type_name -> signalservice.SyncMessage.CallEvent - 96, // 59: signalservice.SyncMessage.callLinkUpdate:type_name -> signalservice.SyncMessage.CallLinkUpdate - 97, // 60: signalservice.SyncMessage.callLogEvent:type_name -> signalservice.SyncMessage.CallLogEvent - 98, // 61: signalservice.SyncMessage.deleteForMe:type_name -> signalservice.SyncMessage.DeleteForMe - 99, // 62: signalservice.SyncMessage.deviceNameChange:type_name -> signalservice.SyncMessage.DeviceNameChange - 100, // 63: signalservice.SyncMessage.attachmentBackfillRequest:type_name -> signalservice.SyncMessage.AttachmentBackfillRequest - 101, // 64: signalservice.SyncMessage.attachmentBackfillResponse:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse - 111, // 65: signalservice.ContactDetails.avatar:type_name -> signalservice.ContactDetails.Avatar - 112, // 66: signalservice.PaymentAddress.mobileCoin:type_name -> signalservice.PaymentAddress.MobileCoin - 31, // 67: signalservice.EditMessage.dataMessage:type_name -> signalservice.DataMessage - 27, // 68: signalservice.BodyRange.style:type_name -> signalservice.BodyRange.Style - 1, // 69: signalservice.CallMessage.Offer.type:type_name -> signalservice.CallMessage.Offer.Type - 2, // 70: signalservice.CallMessage.Hangup.type:type_name -> signalservice.CallMessage.Hangup.Type - 3, // 71: signalservice.CallMessage.Opaque.urgency:type_name -> signalservice.CallMessage.Opaque.Urgency - 69, // 72: signalservice.DataMessage.Payment.notification:type_name -> signalservice.DataMessage.Payment.Notification - 70, // 73: signalservice.DataMessage.Payment.activation:type_name -> signalservice.DataMessage.Payment.Activation - 73, // 74: signalservice.DataMessage.Quote.attachments:type_name -> signalservice.DataMessage.Quote.QuotedAttachment - 47, // 75: signalservice.DataMessage.Quote.bodyRanges:type_name -> signalservice.BodyRange - 7, // 76: signalservice.DataMessage.Quote.type:type_name -> signalservice.DataMessage.Quote.Type - 74, // 77: signalservice.DataMessage.Contact.name:type_name -> signalservice.DataMessage.Contact.Name - 75, // 78: signalservice.DataMessage.Contact.number:type_name -> signalservice.DataMessage.Contact.Phone - 76, // 79: signalservice.DataMessage.Contact.email:type_name -> signalservice.DataMessage.Contact.Email - 77, // 80: signalservice.DataMessage.Contact.address:type_name -> signalservice.DataMessage.Contact.PostalAddress - 78, // 81: signalservice.DataMessage.Contact.avatar:type_name -> signalservice.DataMessage.Contact.Avatar - 40, // 82: signalservice.DataMessage.Sticker.data:type_name -> signalservice.AttachmentPointer - 71, // 83: signalservice.DataMessage.Payment.Amount.mobileCoin:type_name -> signalservice.DataMessage.Payment.Amount.MobileCoin - 72, // 84: signalservice.DataMessage.Payment.Notification.mobileCoin:type_name -> signalservice.DataMessage.Payment.Notification.MobileCoin - 6, // 85: signalservice.DataMessage.Payment.Activation.type:type_name -> signalservice.DataMessage.Payment.Activation.Type - 40, // 86: signalservice.DataMessage.Quote.QuotedAttachment.thumbnail:type_name -> signalservice.AttachmentPointer - 8, // 87: signalservice.DataMessage.Contact.Phone.type:type_name -> signalservice.DataMessage.Contact.Phone.Type - 9, // 88: signalservice.DataMessage.Contact.Email.type:type_name -> signalservice.DataMessage.Contact.Email.Type - 10, // 89: signalservice.DataMessage.Contact.PostalAddress.type:type_name -> signalservice.DataMessage.Contact.PostalAddress.Type - 40, // 90: signalservice.DataMessage.Contact.Avatar.avatar:type_name -> signalservice.AttachmentPointer - 31, // 91: signalservice.SyncMessage.Sent.message:type_name -> signalservice.DataMessage - 102, // 92: signalservice.SyncMessage.Sent.unidentifiedStatus:type_name -> signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus - 35, // 93: signalservice.SyncMessage.Sent.storyMessage:type_name -> signalservice.StoryMessage - 103, // 94: signalservice.SyncMessage.Sent.storyMessageRecipients:type_name -> signalservice.SyncMessage.Sent.StoryMessageRecipient - 46, // 95: signalservice.SyncMessage.Sent.editMessage:type_name -> signalservice.EditMessage - 40, // 96: signalservice.SyncMessage.Contacts.blob:type_name -> signalservice.AttachmentPointer - 15, // 97: signalservice.SyncMessage.Request.type:type_name -> signalservice.SyncMessage.Request.Type - 16, // 98: signalservice.SyncMessage.StickerPackOperation.type:type_name -> signalservice.SyncMessage.StickerPackOperation.Type - 17, // 99: signalservice.SyncMessage.FetchLatest.type:type_name -> signalservice.SyncMessage.FetchLatest.Type - 18, // 100: signalservice.SyncMessage.MessageRequestResponse.type:type_name -> signalservice.SyncMessage.MessageRequestResponse.Type - 104, // 101: signalservice.SyncMessage.OutgoingPayment.mobileCoin:type_name -> signalservice.SyncMessage.OutgoingPayment.MobileCoin - 19, // 102: signalservice.SyncMessage.CallEvent.type:type_name -> signalservice.SyncMessage.CallEvent.Type - 20, // 103: signalservice.SyncMessage.CallEvent.direction:type_name -> signalservice.SyncMessage.CallEvent.Direction - 21, // 104: signalservice.SyncMessage.CallEvent.event:type_name -> signalservice.SyncMessage.CallEvent.Event - 22, // 105: signalservice.SyncMessage.CallLinkUpdate.type:type_name -> signalservice.SyncMessage.CallLinkUpdate.Type - 23, // 106: signalservice.SyncMessage.CallLogEvent.type:type_name -> signalservice.SyncMessage.CallLogEvent.Type - 105, // 107: signalservice.SyncMessage.DeleteForMe.messageDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.MessageDeletes - 107, // 108: signalservice.SyncMessage.DeleteForMe.conversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.ConversationDelete - 108, // 109: signalservice.SyncMessage.DeleteForMe.localOnlyConversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete - 106, // 110: signalservice.SyncMessage.DeleteForMe.attachmentDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.AttachmentDelete - 48, // 111: signalservice.SyncMessage.AttachmentBackfillRequest.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 112: signalservice.SyncMessage.AttachmentBackfillRequest.targetConversation:type_name -> signalservice.ConversationIdentifier - 48, // 113: signalservice.SyncMessage.AttachmentBackfillResponse.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 114: signalservice.SyncMessage.AttachmentBackfillResponse.targetConversation:type_name -> signalservice.ConversationIdentifier - 110, // 115: signalservice.SyncMessage.AttachmentBackfillResponse.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList - 24, // 116: signalservice.SyncMessage.AttachmentBackfillResponse.error:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.Error - 49, // 117: signalservice.SyncMessage.DeleteForMe.MessageDeletes.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 118: signalservice.SyncMessage.DeleteForMe.MessageDeletes.messages:type_name -> signalservice.AddressableMessage - 49, // 119: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 120: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 121: signalservice.SyncMessage.DeleteForMe.ConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 122: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentMessages:type_name -> signalservice.AddressableMessage - 48, // 123: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentNonExpiringMessages:type_name -> signalservice.AddressableMessage - 49, // 124: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier - 40, // 125: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.attachment:type_name -> signalservice.AttachmentPointer - 25, // 126: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.status:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status - 109, // 127: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - 109, // 128: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.longText:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - 129, // [129:129] is the sub-list for method output_type - 129, // [129:129] is the sub-list for method input_type - 129, // [129:129] is the sub-list for extension type_name - 129, // [129:129] is the sub-list for extension extendee - 0, // [0:129] is the sub-list for field type_name + 68, // 32: signalservice.DataMessage.pinMessage:type_name -> signalservice.DataMessage.PinMessage + 69, // 33: signalservice.DataMessage.unpinMessage:type_name -> signalservice.DataMessage.UnpinMessage + 11, // 34: signalservice.ReceiptMessage.type:type_name -> signalservice.ReceiptMessage.Type + 12, // 35: signalservice.TypingMessage.action:type_name -> signalservice.TypingMessage.Action + 41, // 36: signalservice.StoryMessage.group:type_name -> signalservice.GroupContextV2 + 40, // 37: signalservice.StoryMessage.fileAttachment:type_name -> signalservice.AttachmentPointer + 37, // 38: signalservice.StoryMessage.textAttachment:type_name -> signalservice.TextAttachment + 47, // 39: signalservice.StoryMessage.bodyRanges:type_name -> signalservice.BodyRange + 40, // 40: signalservice.Preview.image:type_name -> signalservice.AttachmentPointer + 13, // 41: signalservice.TextAttachment.textStyle:type_name -> signalservice.TextAttachment.Style + 36, // 42: signalservice.TextAttachment.preview:type_name -> signalservice.Preview + 81, // 43: signalservice.TextAttachment.gradient:type_name -> signalservice.TextAttachment.Gradient + 14, // 44: signalservice.Verified.state:type_name -> signalservice.Verified.State + 82, // 45: signalservice.SyncMessage.sent:type_name -> signalservice.SyncMessage.Sent + 83, // 46: signalservice.SyncMessage.contacts:type_name -> signalservice.SyncMessage.Contacts + 85, // 47: signalservice.SyncMessage.request:type_name -> signalservice.SyncMessage.Request + 86, // 48: signalservice.SyncMessage.read:type_name -> signalservice.SyncMessage.Read + 84, // 49: signalservice.SyncMessage.blocked:type_name -> signalservice.SyncMessage.Blocked + 38, // 50: signalservice.SyncMessage.verified:type_name -> signalservice.Verified + 88, // 51: signalservice.SyncMessage.configuration:type_name -> signalservice.SyncMessage.Configuration + 89, // 52: signalservice.SyncMessage.stickerPackOperation:type_name -> signalservice.SyncMessage.StickerPackOperation + 90, // 53: signalservice.SyncMessage.viewOnceOpen:type_name -> signalservice.SyncMessage.ViewOnceOpen + 91, // 54: signalservice.SyncMessage.fetchLatest:type_name -> signalservice.SyncMessage.FetchLatest + 92, // 55: signalservice.SyncMessage.keys:type_name -> signalservice.SyncMessage.Keys + 94, // 56: signalservice.SyncMessage.messageRequestResponse:type_name -> signalservice.SyncMessage.MessageRequestResponse + 95, // 57: signalservice.SyncMessage.outgoingPayment:type_name -> signalservice.SyncMessage.OutgoingPayment + 87, // 58: signalservice.SyncMessage.viewed:type_name -> signalservice.SyncMessage.Viewed + 96, // 59: signalservice.SyncMessage.pniChangeNumber:type_name -> signalservice.SyncMessage.PniChangeNumber + 97, // 60: signalservice.SyncMessage.callEvent:type_name -> signalservice.SyncMessage.CallEvent + 98, // 61: signalservice.SyncMessage.callLinkUpdate:type_name -> signalservice.SyncMessage.CallLinkUpdate + 99, // 62: signalservice.SyncMessage.callLogEvent:type_name -> signalservice.SyncMessage.CallLogEvent + 100, // 63: signalservice.SyncMessage.deleteForMe:type_name -> signalservice.SyncMessage.DeleteForMe + 101, // 64: signalservice.SyncMessage.deviceNameChange:type_name -> signalservice.SyncMessage.DeviceNameChange + 102, // 65: signalservice.SyncMessage.attachmentBackfillRequest:type_name -> signalservice.SyncMessage.AttachmentBackfillRequest + 103, // 66: signalservice.SyncMessage.attachmentBackfillResponse:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse + 113, // 67: signalservice.ContactDetails.avatar:type_name -> signalservice.ContactDetails.Avatar + 114, // 68: signalservice.PaymentAddress.mobileCoin:type_name -> signalservice.PaymentAddress.MobileCoin + 31, // 69: signalservice.EditMessage.dataMessage:type_name -> signalservice.DataMessage + 27, // 70: signalservice.BodyRange.style:type_name -> signalservice.BodyRange.Style + 1, // 71: signalservice.CallMessage.Offer.type:type_name -> signalservice.CallMessage.Offer.Type + 2, // 72: signalservice.CallMessage.Hangup.type:type_name -> signalservice.CallMessage.Hangup.Type + 3, // 73: signalservice.CallMessage.Opaque.urgency:type_name -> signalservice.CallMessage.Opaque.Urgency + 71, // 74: signalservice.DataMessage.Payment.notification:type_name -> signalservice.DataMessage.Payment.Notification + 72, // 75: signalservice.DataMessage.Payment.activation:type_name -> signalservice.DataMessage.Payment.Activation + 75, // 76: signalservice.DataMessage.Quote.attachments:type_name -> signalservice.DataMessage.Quote.QuotedAttachment + 47, // 77: signalservice.DataMessage.Quote.bodyRanges:type_name -> signalservice.BodyRange + 7, // 78: signalservice.DataMessage.Quote.type:type_name -> signalservice.DataMessage.Quote.Type + 76, // 79: signalservice.DataMessage.Contact.name:type_name -> signalservice.DataMessage.Contact.Name + 77, // 80: signalservice.DataMessage.Contact.number:type_name -> signalservice.DataMessage.Contact.Phone + 78, // 81: signalservice.DataMessage.Contact.email:type_name -> signalservice.DataMessage.Contact.Email + 79, // 82: signalservice.DataMessage.Contact.address:type_name -> signalservice.DataMessage.Contact.PostalAddress + 80, // 83: signalservice.DataMessage.Contact.avatar:type_name -> signalservice.DataMessage.Contact.Avatar + 40, // 84: signalservice.DataMessage.Sticker.data:type_name -> signalservice.AttachmentPointer + 73, // 85: signalservice.DataMessage.Payment.Amount.mobileCoin:type_name -> signalservice.DataMessage.Payment.Amount.MobileCoin + 74, // 86: signalservice.DataMessage.Payment.Notification.mobileCoin:type_name -> signalservice.DataMessage.Payment.Notification.MobileCoin + 6, // 87: signalservice.DataMessage.Payment.Activation.type:type_name -> signalservice.DataMessage.Payment.Activation.Type + 40, // 88: signalservice.DataMessage.Quote.QuotedAttachment.thumbnail:type_name -> signalservice.AttachmentPointer + 8, // 89: signalservice.DataMessage.Contact.Phone.type:type_name -> signalservice.DataMessage.Contact.Phone.Type + 9, // 90: signalservice.DataMessage.Contact.Email.type:type_name -> signalservice.DataMessage.Contact.Email.Type + 10, // 91: signalservice.DataMessage.Contact.PostalAddress.type:type_name -> signalservice.DataMessage.Contact.PostalAddress.Type + 40, // 92: signalservice.DataMessage.Contact.Avatar.avatar:type_name -> signalservice.AttachmentPointer + 31, // 93: signalservice.SyncMessage.Sent.message:type_name -> signalservice.DataMessage + 104, // 94: signalservice.SyncMessage.Sent.unidentifiedStatus:type_name -> signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus + 35, // 95: signalservice.SyncMessage.Sent.storyMessage:type_name -> signalservice.StoryMessage + 105, // 96: signalservice.SyncMessage.Sent.storyMessageRecipients:type_name -> signalservice.SyncMessage.Sent.StoryMessageRecipient + 46, // 97: signalservice.SyncMessage.Sent.editMessage:type_name -> signalservice.EditMessage + 40, // 98: signalservice.SyncMessage.Contacts.blob:type_name -> signalservice.AttachmentPointer + 15, // 99: signalservice.SyncMessage.Request.type:type_name -> signalservice.SyncMessage.Request.Type + 16, // 100: signalservice.SyncMessage.StickerPackOperation.type:type_name -> signalservice.SyncMessage.StickerPackOperation.Type + 17, // 101: signalservice.SyncMessage.FetchLatest.type:type_name -> signalservice.SyncMessage.FetchLatest.Type + 18, // 102: signalservice.SyncMessage.MessageRequestResponse.type:type_name -> signalservice.SyncMessage.MessageRequestResponse.Type + 106, // 103: signalservice.SyncMessage.OutgoingPayment.mobileCoin:type_name -> signalservice.SyncMessage.OutgoingPayment.MobileCoin + 19, // 104: signalservice.SyncMessage.CallEvent.type:type_name -> signalservice.SyncMessage.CallEvent.Type + 20, // 105: signalservice.SyncMessage.CallEvent.direction:type_name -> signalservice.SyncMessage.CallEvent.Direction + 21, // 106: signalservice.SyncMessage.CallEvent.event:type_name -> signalservice.SyncMessage.CallEvent.Event + 22, // 107: signalservice.SyncMessage.CallLinkUpdate.type:type_name -> signalservice.SyncMessage.CallLinkUpdate.Type + 23, // 108: signalservice.SyncMessage.CallLogEvent.type:type_name -> signalservice.SyncMessage.CallLogEvent.Type + 107, // 109: signalservice.SyncMessage.DeleteForMe.messageDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.MessageDeletes + 109, // 110: signalservice.SyncMessage.DeleteForMe.conversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.ConversationDelete + 110, // 111: signalservice.SyncMessage.DeleteForMe.localOnlyConversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete + 108, // 112: signalservice.SyncMessage.DeleteForMe.attachmentDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.AttachmentDelete + 48, // 113: signalservice.SyncMessage.AttachmentBackfillRequest.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 114: signalservice.SyncMessage.AttachmentBackfillRequest.targetConversation:type_name -> signalservice.ConversationIdentifier + 48, // 115: signalservice.SyncMessage.AttachmentBackfillResponse.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 116: signalservice.SyncMessage.AttachmentBackfillResponse.targetConversation:type_name -> signalservice.ConversationIdentifier + 112, // 117: signalservice.SyncMessage.AttachmentBackfillResponse.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList + 24, // 118: signalservice.SyncMessage.AttachmentBackfillResponse.error:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.Error + 49, // 119: signalservice.SyncMessage.DeleteForMe.MessageDeletes.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 120: signalservice.SyncMessage.DeleteForMe.MessageDeletes.messages:type_name -> signalservice.AddressableMessage + 49, // 121: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 122: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 123: signalservice.SyncMessage.DeleteForMe.ConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 124: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentMessages:type_name -> signalservice.AddressableMessage + 48, // 125: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentNonExpiringMessages:type_name -> signalservice.AddressableMessage + 49, // 126: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier + 40, // 127: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.attachment:type_name -> signalservice.AttachmentPointer + 25, // 128: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.status:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status + 111, // 129: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + 111, // 130: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.longText:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + 131, // [131:131] is the sub-list for method output_type + 131, // [131:131] is the sub-list for method input_type + 131, // [131:131] is the sub-list for extension type_name + 131, // [131:131] is the sub-list for extension extendee + 0, // [0:131] is the sub-list for field type_name } func init() { file_SignalService_proto_init() } @@ -8931,34 +9321,41 @@ func file_SignalService_proto_init() { file_SignalService_proto_msgTypes[19].OneofWrappers = []any{ (*BodyRange_MentionAci)(nil), (*BodyRange_Style_)(nil), + (*BodyRange_MentionAciBinary)(nil), } file_SignalService_proto_msgTypes[20].OneofWrappers = []any{ (*AddressableMessage_AuthorServiceId)(nil), (*AddressableMessage_AuthorE164)(nil), + (*AddressableMessage_AuthorServiceIdBinary)(nil), } file_SignalService_proto_msgTypes[21].OneofWrappers = []any{ (*ConversationIdentifier_ThreadServiceId)(nil), (*ConversationIdentifier_ThreadGroupId)(nil), (*ConversationIdentifier_ThreadE164)(nil), + (*ConversationIdentifier_ThreadServiceIdBinary)(nil), } file_SignalService_proto_msgTypes[28].OneofWrappers = []any{ (*DataMessage_Payment_Notification_)(nil), (*DataMessage_Payment_Activation_)(nil), } file_SignalService_proto_msgTypes[40].OneofWrappers = []any{ + (*DataMessage_PinMessage_PinDurationSeconds)(nil), + (*DataMessage_PinMessage_PinDurationForever)(nil), + } + file_SignalService_proto_msgTypes[42].OneofWrappers = []any{ (*DataMessage_Payment_Amount_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[41].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[43].OneofWrappers = []any{ (*DataMessage_Payment_Notification_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[65].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[67].OneofWrappers = []any{ (*SyncMessage_OutgoingPayment_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[73].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[75].OneofWrappers = []any{ (*SyncMessage_AttachmentBackfillResponse_Attachments)(nil), (*SyncMessage_AttachmentBackfillResponse_Error_)(nil), } - file_SignalService_proto_msgTypes[81].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[83].OneofWrappers = []any{ (*SyncMessage_AttachmentBackfillResponse_AttachmentData_Attachment)(nil), (*SyncMessage_AttachmentBackfillResponse_AttachmentData_Status_)(nil), } @@ -8968,7 +9365,7 @@ func file_SignalService_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_SignalService_proto_rawDesc), len(file_SignalService_proto_rawDesc)), NumEnums: 28, - NumMessages: 85, + NumMessages: 87, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/signalmeow/protobuf/SignalService.proto b/pkg/signalmeow/protobuf/SignalService.proto index 249c4eb..da4d44f 100644 --- a/pkg/signalmeow/protobuf/SignalService.proto +++ b/pkg/signalmeow/protobuf/SignalService.proto @@ -40,7 +40,11 @@ message Envelope { optional bool story = 16; // indicates that the content is a story. optional bytes report_spam_token = 17; // token sent when reporting spam reserved 18; // internal server use - // next: 19 + optional bytes sourceServiceIdBinary = 19; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + optional bytes destinationServiceIdBinary = 20; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + optional bytes serverGuidBinary = 21; // 16-byte UUID + optional bytes updatedPniBinary = 22; // 16-byte UUID + // next: 22 } message Content { @@ -193,6 +197,7 @@ message DataMessage { repeated QuotedAttachment attachments = 4; repeated BodyRange bodyRanges = 6; optional Type type = 7; + optional bytes authorAciBinary = 8; // 16-byte UUID } message Contact { @@ -277,6 +282,7 @@ message DataMessage { reserved /* targetAuthorE164 */ 3; optional string targetAuthorAci = 4; optional uint64 targetSentTimestamp = 5; + optional bytes targetAuthorAciBinary = 6; // 16-byte UUID } message Delete { @@ -290,6 +296,7 @@ message DataMessage { message StoryContext { optional string authorAci = 1; optional uint64 sentTimestamp = 2; + optional bytes authorAciBinary = 3; // 16-byte UUID } enum ProtocolVersion { @@ -304,7 +311,7 @@ message DataMessage { MENTIONS = 6; PAYMENTS = 7; POLLS = 8; - CURRENT = 7; + CURRENT = 8; } message GiftBadge { @@ -328,6 +335,20 @@ message DataMessage { optional uint32 voteCount = 4; // increment this by 1 each time you vote on a given poll } + message PinMessage { + optional bytes targetAuthorAciBinary = 1; // 16-byte UUID + optional uint64 targetSentTimestamp = 2; + oneof pinDuration { + uint32 pinDurationSeconds = 3; + bool pinDurationForever = 4; + } + } + + message UnpinMessage { + optional bytes targetAuthorAciBinary = 1; // 16-byte UUID + optional uint64 targetSentTimestamp = 2; + } + optional string body = 1; repeated AttachmentPointer attachments = 2; reserved /*groupV1*/ 3; @@ -353,7 +374,9 @@ message DataMessage { optional PollCreate pollCreate = 24; optional PollTerminate pollTerminate = 25; optional PollVote pollVote = 26; - // NEXT ID: 27 + optional PinMessage pinMessage = 27; + optional UnpinMessage unpinMessage = 28; + // NEXT ID: 29 } message NullMessage { @@ -442,6 +465,7 @@ message Verified { optional bytes identityKey = 2; optional State state = 3; optional bytes nullMessage = 4; + optional bytes destinationAciBinary = 6; // 16-byte UUID } message SyncMessage { @@ -452,6 +476,7 @@ message SyncMessage { optional bool unidentified = 2; reserved /*destinationPni */ 4; optional bytes destinationPniIdentityKey = 5; // Only set for PNI destinations + optional bytes destinationServiceIdBinary = 6; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) } message StoryMessageRecipient { @@ -459,6 +484,7 @@ message SyncMessage { repeated string distributionListIds = 2; optional bool isAllowedToReply = 3; reserved /*destinationPni */ 4; + optional bytes destinationServiceIdBinary = 5; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) } optional string destinationE164 = 1; @@ -472,7 +498,8 @@ message SyncMessage { repeated StoryMessageRecipient storyMessageRecipients = 9; optional EditMessage editMessage = 10; reserved /*destinationPni */ 11; - // Next ID: 12 + optional bytes destinationServiceIdBinary = 12; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + // Next ID: 13 } message Contacts { @@ -484,6 +511,7 @@ message SyncMessage { repeated string numbers = 1; repeated string acis = 3; repeated bytes groupIds = 2; + repeated bytes acisBinary = 4; // 16-byte UUID } message Request { @@ -504,12 +532,14 @@ message SyncMessage { reserved /*senderE164*/ 1; optional string senderAci = 3; optional uint64 timestamp = 2; + optional bytes senderAciBinary = 4; // 16-byte UUID } message Viewed { reserved /*senderE164*/ 1; optional string senderAci = 3; optional uint64 timestamp = 2; + optional bytes senderAciBinary = 4; // 16-byte UUID } message Configuration { @@ -536,6 +566,7 @@ message SyncMessage { reserved /*senderE164*/ 1; optional string senderAci = 3; optional uint64 timestamp = 2; + optional bytes senderAciBinary = 4; // 16-byte UUID } message FetchLatest { @@ -576,6 +607,7 @@ message SyncMessage { optional string threadAci = 2; optional bytes groupId = 3; optional Type type = 4; + optional bytes threadAciBinary = 5; // 16-byte UUID } message OutgoingPayment { @@ -823,6 +855,7 @@ message ContactDetails { optional string number = 1; optional string aci = 9; + optional bytes aciBinary = 13; // 16-byte UUID optional string name = 2; optional Avatar avatar = 3; reserved /* color */ 4; @@ -833,7 +866,7 @@ message ContactDetails { optional uint32 expireTimerVersion = 12; optional uint32 inboxPosition = 10; reserved /* archived */ 11; - // NEXT ID: 13 + // NEXT ID: 14 } message PaymentAddress { @@ -880,6 +913,7 @@ message BodyRange { oneof associatedValue { string mentionAci = 3; Style style = 4; + bytes mentionAciBinary = 5; // 16-byte UUID } } @@ -887,6 +921,7 @@ message AddressableMessage { oneof author { string authorServiceId = 1; string authorE164 = 2; + bytes authorServiceIdBinary = 4; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) } optional uint64 sentTimestamp = 3; } @@ -896,5 +931,6 @@ message ConversationIdentifier { string threadServiceId = 1; bytes threadGroupId = 2; string threadE164 = 3; + bytes threadServiceIdBinary = 4; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) } } diff --git a/pkg/signalmeow/protobuf/StickerResources.pb.go b/pkg/signalmeow/protobuf/StickerResources.pb.go index 52905c6..e83cda1 100644 --- a/pkg/signalmeow/protobuf/StickerResources.pb.go +++ b/pkg/signalmeow/protobuf/StickerResources.pb.go @@ -5,8 +5,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: StickerResources.proto package signalpb diff --git a/pkg/signalmeow/protobuf/StorageService.pb.go b/pkg/signalmeow/protobuf/StorageService.pb.go index 1294a3f..9a27146 100644 --- a/pkg/signalmeow/protobuf/StorageService.pb.go +++ b/pkg/signalmeow/protobuf/StorageService.pb.go @@ -5,8 +5,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: StorageService.proto package signalpb @@ -1086,7 +1086,9 @@ type ContactRecord struct { PniSignatureVerified bool `protobuf:"varint,21,opt,name=pniSignatureVerified,proto3" json:"pniSignatureVerified,omitempty"` Nickname *ContactRecord_Name `protobuf:"bytes,22,opt,name=nickname,proto3" json:"nickname,omitempty"` Note string `protobuf:"bytes,23,opt,name=note,proto3" json:"note,omitempty"` - AvatarColor *AvatarColor `protobuf:"varint,24,opt,name=avatarColor,proto3,enum=signalservice.AvatarColor,oneof" json:"avatarColor,omitempty"` // Next ID: 25 + AvatarColor *AvatarColor `protobuf:"varint,24,opt,name=avatarColor,proto3,enum=signalservice.AvatarColor,oneof" json:"avatarColor,omitempty"` + AciBinary []byte `protobuf:"bytes,25,opt,name=aciBinary,proto3" json:"aciBinary,omitempty"` // 16-byte UUID + PniBinary []byte `protobuf:"bytes,26,opt,name=pniBinary,proto3" json:"pniBinary,omitempty"` // 16-byte UUID unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1289,6 +1291,20 @@ func (x *ContactRecord) GetAvatarColor() AvatarColor { return AvatarColor_A100 } +func (x *ContactRecord) GetAciBinary() []byte { + if x != nil { + return x.AciBinary + } + return nil +} + +func (x *ContactRecord) GetPniBinary() []byte { + if x != nil { + return x.PniBinary + } + return nil +} + type GroupV1Record struct { state protoimpl.MessageState `protogen:"open.v1"` Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -1580,6 +1596,8 @@ type AccountRecord struct { AvatarColor *AvatarColor `protobuf:"varint,42,opt,name=avatarColor,proto3,enum=signalservice.AvatarColor,oneof" json:"avatarColor,omitempty"` BackupTierHistory *AccountRecord_BackupTierHistory `protobuf:"bytes,43,opt,name=backupTierHistory,proto3" json:"backupTierHistory,omitempty"` NotificationProfileManualOverride *AccountRecord_NotificationProfileManualOverride `protobuf:"bytes,44,opt,name=notificationProfileManualOverride,proto3" json:"notificationProfileManualOverride,omitempty"` + NotificationProfileSyncDisabled bool `protobuf:"varint,45,opt,name=notificationProfileSyncDisabled,proto3" json:"notificationProfileSyncDisabled,omitempty"` + AutomaticKeyVerificationDisabled bool `protobuf:"varint,46,opt,name=automaticKeyVerificationDisabled,proto3" json:"automaticKeyVerificationDisabled,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1873,16 +1891,31 @@ func (x *AccountRecord) GetNotificationProfileManualOverride() *AccountRecord_No return nil } +func (x *AccountRecord) GetNotificationProfileSyncDisabled() bool { + if x != nil { + return x.NotificationProfileSyncDisabled + } + return false +} + +func (x *AccountRecord) GetAutomaticKeyVerificationDisabled() bool { + if x != nil { + return x.AutomaticKeyVerificationDisabled + } + return false +} + type StoryDistributionListRecord struct { - state protoimpl.MessageState `protogen:"open.v1"` - Identifier []byte `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - RecipientServiceIds []string `protobuf:"bytes,3,rep,name=recipientServiceIds,proto3" json:"recipientServiceIds,omitempty"` - DeletedAtTimestamp uint64 `protobuf:"varint,4,opt,name=deletedAtTimestamp,proto3" json:"deletedAtTimestamp,omitempty"` - AllowsReplies bool `protobuf:"varint,5,opt,name=allowsReplies,proto3" json:"allowsReplies,omitempty"` - IsBlockList bool `protobuf:"varint,6,opt,name=isBlockList,proto3" json:"isBlockList,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Identifier []byte `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + RecipientServiceIds []string `protobuf:"bytes,3,rep,name=recipientServiceIds,proto3" json:"recipientServiceIds,omitempty"` + DeletedAtTimestamp uint64 `protobuf:"varint,4,opt,name=deletedAtTimestamp,proto3" json:"deletedAtTimestamp,omitempty"` + AllowsReplies bool `protobuf:"varint,5,opt,name=allowsReplies,proto3" json:"allowsReplies,omitempty"` + IsBlockList bool `protobuf:"varint,6,opt,name=isBlockList,proto3" json:"isBlockList,omitempty"` + RecipientServiceIdsBinary [][]byte `protobuf:"bytes,7,rep,name=recipientServiceIdsBinary,proto3" json:"recipientServiceIdsBinary,omitempty"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StoryDistributionListRecord) Reset() { @@ -1957,6 +1990,13 @@ func (x *StoryDistributionListRecord) GetIsBlockList() bool { return false } +func (x *StoryDistributionListRecord) GetRecipientServiceIdsBinary() [][]byte { + if x != nil { + return x.RecipientServiceIdsBinary + } + return nil +} + type CallLinkRecord struct { state protoimpl.MessageState `protogen:"open.v1"` RootKey []byte `protobuf:"bytes,1,opt,name=rootKey,proto3" json:"rootKey,omitempty"` @@ -2883,11 +2923,12 @@ func (*AccountRecord_NotificationProfileManualOverride_Enabled) isAccountRecord_ } type AccountRecord_PinnedConversation_Contact struct { - state protoimpl.MessageState `protogen:"open.v1"` - ServiceId string `protobuf:"bytes,1,opt,name=serviceId,proto3" json:"serviceId,omitempty"` - E164 string `protobuf:"bytes,2,opt,name=e164,proto3" json:"e164,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ServiceId string `protobuf:"bytes,1,opt,name=serviceId,proto3" json:"serviceId,omitempty"` + E164 string `protobuf:"bytes,2,opt,name=e164,proto3" json:"e164,omitempty"` + ServiceIdBinary []byte `protobuf:"bytes,3,opt,name=serviceIdBinary,proto3" json:"serviceIdBinary,omitempty"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountRecord_PinnedConversation_Contact) Reset() { @@ -2934,6 +2975,13 @@ func (x *AccountRecord_PinnedConversation_Contact) GetE164() string { return "" } +func (x *AccountRecord_PinnedConversation_Contact) GetServiceIdBinary() []byte { + if x != nil { + return x.ServiceIdBinary + } + return nil +} + type AccountRecord_NotificationProfileManualOverride_ManuallyEnabled struct { state protoimpl.MessageState `protogen:"open.v1"` Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -2988,11 +3036,12 @@ func (x *AccountRecord_NotificationProfileManualOverride_ManuallyEnabled) GetEnd } type Recipient_Contact struct { - state protoimpl.MessageState `protogen:"open.v1"` - ServiceId string `protobuf:"bytes,1,opt,name=serviceId,proto3" json:"serviceId,omitempty"` - E164 string `protobuf:"bytes,2,opt,name=e164,proto3" json:"e164,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ServiceId string `protobuf:"bytes,1,opt,name=serviceId,proto3" json:"serviceId,omitempty"` + E164 string `protobuf:"bytes,2,opt,name=e164,proto3" json:"e164,omitempty"` + ServiceIdBinary []byte `protobuf:"bytes,3,opt,name=serviceIdBinary,proto3" json:"serviceIdBinary,omitempty"` // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Recipient_Contact) Reset() { @@ -3039,6 +3088,13 @@ func (x *Recipient_Contact) GetE164() string { return "" } +func (x *Recipient_Contact) GetServiceIdBinary() []byte { + if x != nil { + return x.ServiceIdBinary + } + return nil +} + var File_StorageService_proto protoreflect.FileDescriptor const file_StorageService_proto_rawDesc = "" + @@ -3091,7 +3147,7 @@ const file_StorageService_proto_rawDesc = "" + "chatFolder\x18\b \x01(\v2\x1f.signalservice.ChatFolderRecordH\x00R\n" + "chatFolder\x12V\n" + "\x13notificationProfile\x18\t \x01(\v2\".signalservice.NotificationProfileH\x00R\x13notificationProfileB\b\n" + - "\x06record\"\x9d\b\n" + + "\x06record\"\xd9\b\n" + "\rContactRecord\x12\x10\n" + "\x03aci\x18\x01 \x01(\tR\x03aci\x12\x12\n" + "\x04e164\x18\x02 \x01(\tR\x04e164\x12\x10\n" + @@ -3121,7 +3177,9 @@ const file_StorageService_proto_rawDesc = "" + "\x14pniSignatureVerified\x18\x15 \x01(\bR\x14pniSignatureVerified\x12=\n" + "\bnickname\x18\x16 \x01(\v2!.signalservice.ContactRecord.NameR\bnickname\x12\x12\n" + "\x04note\x18\x17 \x01(\tR\x04note\x12A\n" + - "\vavatarColor\x18\x18 \x01(\x0e2\x1a.signalservice.AvatarColorH\x00R\vavatarColor\x88\x01\x01\x1a4\n" + + "\vavatarColor\x18\x18 \x01(\x0e2\x1a.signalservice.AvatarColorH\x00R\vavatarColor\x88\x01\x01\x12\x1c\n" + + "\taciBinary\x18\x19 \x01(\fR\taciBinary\x12\x1c\n" + + "\tpniBinary\x18\x1a \x01(\fR\tpniBinary\x1a4\n" + "\x04Name\x12\x14\n" + "\x05given\x18\x01 \x01(\tR\x05given\x12\x16\n" + "\x06family\x18\x02 \x01(\tR\x06family\":\n" + @@ -3158,7 +3216,7 @@ const file_StorageService_proto_rawDesc = "" + "\">\n" + "\bPayments\x12\x18\n" + "\aenabled\x18\x01 \x01(\bR\aenabled\x12\x18\n" + - "\aentropy\x18\x02 \x01(\fR\aentropy\"\x8b\x1b\n" + + "\aentropy\x18\x02 \x01(\fR\aentropy\"\xcb\x1c\n" + "\rAccountRecord\x12\x1e\n" + "\n" + "profileKey\x18\x01 \x01(\fR\n" + @@ -3203,14 +3261,17 @@ const file_StorageService_proto_rawDesc = "" + "\x14backupSubscriberData\x18) \x01(\v2..signalservice.AccountRecord.IAPSubscriberDataR\x14backupSubscriberData\x12A\n" + "\vavatarColor\x18* \x01(\x0e2\x1a.signalservice.AvatarColorH\x02R\vavatarColor\x88\x01\x01\x12\\\n" + "\x11backupTierHistory\x18+ \x01(\v2..signalservice.AccountRecord.BackupTierHistoryR\x11backupTierHistory\x12\x8c\x01\n" + - "!notificationProfileManualOverride\x18, \x01(\v2>.signalservice.AccountRecord.NotificationProfileManualOverrideR!notificationProfileManualOverride\x1a\x86\x02\n" + + "!notificationProfileManualOverride\x18, \x01(\v2>.signalservice.AccountRecord.NotificationProfileManualOverrideR!notificationProfileManualOverride\x12H\n" + + "\x1fnotificationProfileSyncDisabled\x18- \x01(\bR\x1fnotificationProfileSyncDisabled\x12J\n" + + " automaticKeyVerificationDisabled\x18. \x01(\bR automaticKeyVerificationDisabled\x1a\xb0\x02\n" + "\x12PinnedConversation\x12S\n" + "\acontact\x18\x01 \x01(\v27.signalservice.AccountRecord.PinnedConversation.ContactH\x00R\acontact\x12&\n" + "\rlegacyGroupId\x18\x03 \x01(\fH\x00R\rlegacyGroupId\x12(\n" + - "\x0egroupMasterKey\x18\x04 \x01(\fH\x00R\x0egroupMasterKey\x1a;\n" + + "\x0egroupMasterKey\x18\x04 \x01(\fH\x00R\x0egroupMasterKey\x1ae\n" + "\aContact\x12\x1c\n" + "\tserviceId\x18\x01 \x01(\tR\tserviceId\x12\x12\n" + - "\x04e164\x18\x02 \x01(\tR\x04e164B\f\n" + + "\x04e164\x18\x02 \x01(\tR\x04e164\x12(\n" + + "\x0fserviceIdBinary\x18\x03 \x01(\fR\x0fserviceIdBinaryB\f\n" + "\n" + "identifier\x1a\xf8\x01\n" + "\fUsernameLink\x12\x18\n" + @@ -3258,7 +3319,7 @@ const file_StorageService_proto_rawDesc = "" + "_hasBackupB\r\n" + "\v_backupTierB\x0e\n" + "\f_avatarColorJ\x04\b\t\x10\n" + - "J\x04\b\x13\x10\x14J\x04\b\x1c\x10\x1dJ\x04\b\x1f\x10 J\x04\b$\x10%J\x04\b%\x10&J\x04\b&\x10'\"\xfb\x01\n" + + "J\x04\b\x13\x10\x14J\x04\b\x1c\x10\x1dJ\x04\b\x1f\x10 J\x04\b$\x10%J\x04\b%\x10&J\x04\b&\x10'\"\xb9\x02\n" + "\x1bStoryDistributionListRecord\x12\x1e\n" + "\n" + "identifier\x18\x01 \x01(\fR\n" + @@ -3267,20 +3328,22 @@ const file_StorageService_proto_rawDesc = "" + "\x13recipientServiceIds\x18\x03 \x03(\tR\x13recipientServiceIds\x12.\n" + "\x12deletedAtTimestamp\x18\x04 \x01(\x04R\x12deletedAtTimestamp\x12$\n" + "\rallowsReplies\x18\x05 \x01(\bR\rallowsReplies\x12 \n" + - "\visBlockList\x18\x06 \x01(\bR\visBlockList\"\xa7\x01\n" + + "\visBlockList\x18\x06 \x01(\bR\visBlockList\x12<\n" + + "\x19recipientServiceIdsBinary\x18\a \x03(\fR\x19recipientServiceIdsBinary\"\xa7\x01\n" + "\x0eCallLinkRecord\x12\x18\n" + "\arootKey\x18\x01 \x01(\fR\arootKey\x12\"\n" + "\fadminPasskey\x18\x02 \x01(\fR\fadminPasskey\x122\n" + "\x14deletedAtTimestampMs\x18\x03 \x01(\x04R\x14deletedAtTimestampMs\x12\x19\n" + "\x05epoch\x18\x04 \x01(\fH\x00R\x05epoch\x88\x01\x01B\b\n" + - "\x06_epoch\"\xe6\x01\n" + + "\x06_epoch\"\x90\x02\n" + "\tRecipient\x12<\n" + "\acontact\x18\x01 \x01(\v2 .signalservice.Recipient.ContactH\x00R\acontact\x12&\n" + "\rlegacyGroupId\x18\x02 \x01(\fH\x00R\rlegacyGroupId\x12(\n" + - "\x0egroupMasterKey\x18\x03 \x01(\fH\x00R\x0egroupMasterKey\x1a;\n" + + "\x0egroupMasterKey\x18\x03 \x01(\fH\x00R\x0egroupMasterKey\x1ae\n" + "\aContact\x12\x1c\n" + "\tserviceId\x18\x01 \x01(\tR\tserviceId\x12\x12\n" + - "\x04e164\x18\x02 \x01(\tR\x04e164B\f\n" + + "\x04e164\x18\x02 \x01(\tR\x04e164\x12(\n" + + "\x0fserviceIdBinary\x18\x03 \x01(\fR\x0fserviceIdBinaryB\f\n" + "\n" + "identifier\"\xe8\x04\n" + "\x10ChatFolderRecord\x12\x1e\n" + diff --git a/pkg/signalmeow/protobuf/StorageService.proto b/pkg/signalmeow/protobuf/StorageService.proto index 4258fba..95ec845 100644 --- a/pkg/signalmeow/protobuf/StorageService.proto +++ b/pkg/signalmeow/protobuf/StorageService.proto @@ -140,7 +140,9 @@ message ContactRecord { Name nickname = 22; string note = 23; optional AvatarColor avatarColor = 24; - // Next ID: 25 + bytes aciBinary = 25; // 16-byte UUID + bytes pniBinary = 26; // 16-byte UUID + // Next ID: 27 } message GroupV1Record { @@ -187,8 +189,9 @@ message AccountRecord { message PinnedConversation { message Contact { - string serviceId = 1; - string e164 = 2; + string serviceId = 1; + string e164 = 2; + bytes serviceIdBinary = 3; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) } oneof identifier { @@ -291,15 +294,18 @@ message AccountRecord { optional AvatarColor avatarColor = 42; BackupTierHistory backupTierHistory = 43; NotificationProfileManualOverride notificationProfileManualOverride = 44; + bool notificationProfileSyncDisabled = 45; + bool automaticKeyVerificationDisabled = 46; } message StoryDistributionListRecord { - bytes identifier = 1; - string name = 2; - repeated string recipientServiceIds = 3; - uint64 deletedAtTimestamp = 4; - bool allowsReplies = 5; - bool isBlockList = 6; + bytes identifier = 1; + string name = 2; + repeated string recipientServiceIds = 3; + uint64 deletedAtTimestamp = 4; + bool allowsReplies = 5; + bool isBlockList = 6; + repeated bytes recipientServiceIdsBinary = 7; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) } message CallLinkRecord { @@ -311,8 +317,9 @@ message CallLinkRecord { message Recipient { message Contact { - string serviceId = 1; - string e164 = 2; + string serviceId = 1; + string e164 = 2; + bytes serviceIdBinary = 3; // service ID binary (i.e. 16 byte UUID for ACI, 1 byte prefix + 16 byte UUID for PNI) } oneof identifier { diff --git a/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go b/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go index d512960..e30f6d6 100644 --- a/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go +++ b/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: UnidentifiedDelivery.proto // Copyright 2018 Signal Messenger, LLC diff --git a/pkg/signalmeow/protobuf/WebSocketResources.pb.go b/pkg/signalmeow/protobuf/WebSocketResources.pb.go index ef45ba0..f35110d 100644 --- a/pkg/signalmeow/protobuf/WebSocketResources.pb.go +++ b/pkg/signalmeow/protobuf/WebSocketResources.pb.go @@ -5,8 +5,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: WebSocketResources.proto package signalpb diff --git a/pkg/signalmeow/protobuf/backuppb/Backup.pb.go b/pkg/signalmeow/protobuf/backuppb/Backup.pb.go index 86e176a..73930ae 100644 --- a/pkg/signalmeow/protobuf/backuppb/Backup.pb.go +++ b/pkg/signalmeow/protobuf/backuppb/Backup.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v3.21.12 +// protoc-gen-go v1.36.11 +// protoc v6.33.5 // source: backuppb/Backup.proto package backuppb @@ -210,6 +210,159 @@ func (AccountData_PhoneNumberSharingMode) EnumDescriptor() ([]byte, []int) { return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 0} } +type AccountData_SentMediaQuality int32 + +const ( + AccountData_UNKNOWN_QUALITY AccountData_SentMediaQuality = 0 // Interpret as "Standard" + AccountData_STANDARD AccountData_SentMediaQuality = 1 + AccountData_HIGH AccountData_SentMediaQuality = 2 +) + +// Enum value maps for AccountData_SentMediaQuality. +var ( + AccountData_SentMediaQuality_name = map[int32]string{ + 0: "UNKNOWN_QUALITY", + 1: "STANDARD", + 2: "HIGH", + } + AccountData_SentMediaQuality_value = map[string]int32{ + "UNKNOWN_QUALITY": 0, + "STANDARD": 1, + "HIGH": 2, + } +) + +func (x AccountData_SentMediaQuality) Enum() *AccountData_SentMediaQuality { + p := new(AccountData_SentMediaQuality) + *p = x + return p +} + +func (x AccountData_SentMediaQuality) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AccountData_SentMediaQuality) Descriptor() protoreflect.EnumDescriptor { + return file_backuppb_Backup_proto_enumTypes[3].Descriptor() +} + +func (AccountData_SentMediaQuality) Type() protoreflect.EnumType { + return &file_backuppb_Backup_proto_enumTypes[3] +} + +func (x AccountData_SentMediaQuality) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AccountData_SentMediaQuality.Descriptor instead. +func (AccountData_SentMediaQuality) EnumDescriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 1} +} + +type AccountData_AppTheme int32 + +const ( + AccountData_UNKNOWN_APP_THEME AccountData_AppTheme = 0 // Interpret as "System" + AccountData_SYSTEM AccountData_AppTheme = 1 + AccountData_LIGHT AccountData_AppTheme = 2 + AccountData_DARK AccountData_AppTheme = 3 +) + +// Enum value maps for AccountData_AppTheme. +var ( + AccountData_AppTheme_name = map[int32]string{ + 0: "UNKNOWN_APP_THEME", + 1: "SYSTEM", + 2: "LIGHT", + 3: "DARK", + } + AccountData_AppTheme_value = map[string]int32{ + "UNKNOWN_APP_THEME": 0, + "SYSTEM": 1, + "LIGHT": 2, + "DARK": 3, + } +) + +func (x AccountData_AppTheme) Enum() *AccountData_AppTheme { + p := new(AccountData_AppTheme) + *p = x + return p +} + +func (x AccountData_AppTheme) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AccountData_AppTheme) Descriptor() protoreflect.EnumDescriptor { + return file_backuppb_Backup_proto_enumTypes[4].Descriptor() +} + +func (AccountData_AppTheme) Type() protoreflect.EnumType { + return &file_backuppb_Backup_proto_enumTypes[4] +} + +func (x AccountData_AppTheme) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AccountData_AppTheme.Descriptor instead. +func (AccountData_AppTheme) EnumDescriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 2} +} + +type AccountData_CallsUseLessDataSetting int32 + +const ( + AccountData_UNKNOWN_CALL_DATA_SETTING AccountData_CallsUseLessDataSetting = 0 // Interpret as "Never" + AccountData_NEVER AccountData_CallsUseLessDataSetting = 1 + AccountData_MOBILE_DATA_ONLY AccountData_CallsUseLessDataSetting = 2 + AccountData_WIFI_AND_MOBILE_DATA AccountData_CallsUseLessDataSetting = 3 +) + +// Enum value maps for AccountData_CallsUseLessDataSetting. +var ( + AccountData_CallsUseLessDataSetting_name = map[int32]string{ + 0: "UNKNOWN_CALL_DATA_SETTING", + 1: "NEVER", + 2: "MOBILE_DATA_ONLY", + 3: "WIFI_AND_MOBILE_DATA", + } + AccountData_CallsUseLessDataSetting_value = map[string]int32{ + "UNKNOWN_CALL_DATA_SETTING": 0, + "NEVER": 1, + "MOBILE_DATA_ONLY": 2, + "WIFI_AND_MOBILE_DATA": 3, + } +) + +func (x AccountData_CallsUseLessDataSetting) Enum() *AccountData_CallsUseLessDataSetting { + p := new(AccountData_CallsUseLessDataSetting) + *p = x + return p +} + +func (x AccountData_CallsUseLessDataSetting) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AccountData_CallsUseLessDataSetting) Descriptor() protoreflect.EnumDescriptor { + return file_backuppb_Backup_proto_enumTypes[5].Descriptor() +} + +func (AccountData_CallsUseLessDataSetting) Type() protoreflect.EnumType { + return &file_backuppb_Backup_proto_enumTypes[5] +} + +func (x AccountData_CallsUseLessDataSetting) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AccountData_CallsUseLessDataSetting.Descriptor instead. +func (AccountData_CallsUseLessDataSetting) EnumDescriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 3} +} + type AccountData_UsernameLink_Color int32 const ( @@ -261,11 +414,11 @@ func (x AccountData_UsernameLink_Color) String() string { } func (AccountData_UsernameLink_Color) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[3].Descriptor() + return file_backuppb_Backup_proto_enumTypes[6].Descriptor() } func (AccountData_UsernameLink_Color) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[3] + return &file_backuppb_Backup_proto_enumTypes[6] } func (x AccountData_UsernameLink_Color) Number() protoreflect.EnumNumber { @@ -277,6 +430,107 @@ func (AccountData_UsernameLink_Color) EnumDescriptor() ([]byte, []int) { return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 0, 0} } +type AccountData_AutoDownloadSettings_AutoDownloadOption int32 + +const ( + AccountData_AutoDownloadSettings_UNKNOWN AccountData_AutoDownloadSettings_AutoDownloadOption = 0 // Interpret as "Never" + AccountData_AutoDownloadSettings_NEVER AccountData_AutoDownloadSettings_AutoDownloadOption = 1 + AccountData_AutoDownloadSettings_WIFI AccountData_AutoDownloadSettings_AutoDownloadOption = 2 + AccountData_AutoDownloadSettings_WIFI_AND_CELLULAR AccountData_AutoDownloadSettings_AutoDownloadOption = 3 +) + +// Enum value maps for AccountData_AutoDownloadSettings_AutoDownloadOption. +var ( + AccountData_AutoDownloadSettings_AutoDownloadOption_name = map[int32]string{ + 0: "UNKNOWN", + 1: "NEVER", + 2: "WIFI", + 3: "WIFI_AND_CELLULAR", + } + AccountData_AutoDownloadSettings_AutoDownloadOption_value = map[string]int32{ + "UNKNOWN": 0, + "NEVER": 1, + "WIFI": 2, + "WIFI_AND_CELLULAR": 3, + } +) + +func (x AccountData_AutoDownloadSettings_AutoDownloadOption) Enum() *AccountData_AutoDownloadSettings_AutoDownloadOption { + p := new(AccountData_AutoDownloadSettings_AutoDownloadOption) + *p = x + return p +} + +func (x AccountData_AutoDownloadSettings_AutoDownloadOption) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AccountData_AutoDownloadSettings_AutoDownloadOption) Descriptor() protoreflect.EnumDescriptor { + return file_backuppb_Backup_proto_enumTypes[7].Descriptor() +} + +func (AccountData_AutoDownloadSettings_AutoDownloadOption) Type() protoreflect.EnumType { + return &file_backuppb_Backup_proto_enumTypes[7] +} + +func (x AccountData_AutoDownloadSettings_AutoDownloadOption) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AccountData_AutoDownloadSettings_AutoDownloadOption.Descriptor instead. +func (AccountData_AutoDownloadSettings_AutoDownloadOption) EnumDescriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 1, 0} +} + +type AccountData_AndroidSpecificSettings_NavigationBarSize int32 + +const ( + AccountData_AndroidSpecificSettings_UNKNOWN_BAR_SIZE AccountData_AndroidSpecificSettings_NavigationBarSize = 0 // Intepret as "Normal" + AccountData_AndroidSpecificSettings_NORMAL AccountData_AndroidSpecificSettings_NavigationBarSize = 1 + AccountData_AndroidSpecificSettings_COMPACT AccountData_AndroidSpecificSettings_NavigationBarSize = 2 +) + +// Enum value maps for AccountData_AndroidSpecificSettings_NavigationBarSize. +var ( + AccountData_AndroidSpecificSettings_NavigationBarSize_name = map[int32]string{ + 0: "UNKNOWN_BAR_SIZE", + 1: "NORMAL", + 2: "COMPACT", + } + AccountData_AndroidSpecificSettings_NavigationBarSize_value = map[string]int32{ + "UNKNOWN_BAR_SIZE": 0, + "NORMAL": 1, + "COMPACT": 2, + } +) + +func (x AccountData_AndroidSpecificSettings_NavigationBarSize) Enum() *AccountData_AndroidSpecificSettings_NavigationBarSize { + p := new(AccountData_AndroidSpecificSettings_NavigationBarSize) + *p = x + return p +} + +func (x AccountData_AndroidSpecificSettings_NavigationBarSize) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AccountData_AndroidSpecificSettings_NavigationBarSize) Descriptor() protoreflect.EnumDescriptor { + return file_backuppb_Backup_proto_enumTypes[8].Descriptor() +} + +func (AccountData_AndroidSpecificSettings_NavigationBarSize) Type() protoreflect.EnumType { + return &file_backuppb_Backup_proto_enumTypes[8] +} + +func (x AccountData_AndroidSpecificSettings_NavigationBarSize) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AccountData_AndroidSpecificSettings_NavigationBarSize.Descriptor instead. +func (AccountData_AndroidSpecificSettings_NavigationBarSize) EnumDescriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 5, 0} +} + type Contact_IdentityState int32 const ( @@ -310,11 +564,11 @@ func (x Contact_IdentityState) String() string { } func (Contact_IdentityState) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[4].Descriptor() + return file_backuppb_Backup_proto_enumTypes[9].Descriptor() } func (Contact_IdentityState) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[4] + return &file_backuppb_Backup_proto_enumTypes[9] } func (x Contact_IdentityState) Number() protoreflect.EnumNumber { @@ -359,11 +613,11 @@ func (x Contact_Visibility) String() string { } func (Contact_Visibility) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[5].Descriptor() + return file_backuppb_Backup_proto_enumTypes[10].Descriptor() } func (Contact_Visibility) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[5] + return &file_backuppb_Backup_proto_enumTypes[10] } func (x Contact_Visibility) Number() protoreflect.EnumNumber { @@ -408,11 +662,11 @@ func (x Group_StorySendMode) String() string { } func (Group_StorySendMode) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[6].Descriptor() + return file_backuppb_Backup_proto_enumTypes[11].Descriptor() } func (Group_StorySendMode) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[6] + return &file_backuppb_Backup_proto_enumTypes[11] } func (x Group_StorySendMode) Number() protoreflect.EnumNumber { @@ -457,11 +711,11 @@ func (x Group_Member_Role) String() string { } func (Group_Member_Role) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[7].Descriptor() + return file_backuppb_Backup_proto_enumTypes[12].Descriptor() } func (Group_Member_Role) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[7] + return &file_backuppb_Backup_proto_enumTypes[12] } func (x Group_Member_Role) Number() protoreflect.EnumNumber { @@ -512,11 +766,11 @@ func (x Group_AccessControl_AccessRequired) String() string { } func (Group_AccessControl_AccessRequired) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[8].Descriptor() + return file_backuppb_Backup_proto_enumTypes[13].Descriptor() } func (Group_AccessControl_AccessRequired) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[8] + return &file_backuppb_Backup_proto_enumTypes[13] } func (x Group_AccessControl_AccessRequired) Number() protoreflect.EnumNumber { @@ -561,11 +815,11 @@ func (x CallLink_Restrictions) String() string { } func (CallLink_Restrictions) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[9].Descriptor() + return file_backuppb_Backup_proto_enumTypes[14].Descriptor() } func (CallLink_Restrictions) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[9] + return &file_backuppb_Backup_proto_enumTypes[14] } func (x CallLink_Restrictions) Number() protoreflect.EnumNumber { @@ -607,11 +861,11 @@ func (x AdHocCall_State) String() string { } func (AdHocCall_State) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[10].Descriptor() + return file_backuppb_Backup_proto_enumTypes[15].Descriptor() } func (AdHocCall_State) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[10] + return &file_backuppb_Backup_proto_enumTypes[15] } func (x AdHocCall_State) Number() protoreflect.EnumNumber { @@ -659,11 +913,11 @@ func (x DistributionList_PrivacyMode) String() string { } func (DistributionList_PrivacyMode) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[11].Descriptor() + return file_backuppb_Backup_proto_enumTypes[16].Descriptor() } func (DistributionList_PrivacyMode) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[11] + return &file_backuppb_Backup_proto_enumTypes[16] } func (x DistributionList_PrivacyMode) Number() protoreflect.EnumNumber { @@ -708,11 +962,11 @@ func (x SendStatus_Failed_FailureReason) String() string { } func (SendStatus_Failed_FailureReason) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[12].Descriptor() + return file_backuppb_Backup_proto_enumTypes[17].Descriptor() } func (SendStatus_Failed_FailureReason) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[12] + return &file_backuppb_Backup_proto_enumTypes[17] } func (x SendStatus_Failed_FailureReason) Number() protoreflect.EnumNumber { @@ -757,11 +1011,11 @@ func (x PaymentNotification_TransactionDetails_FailedTransaction_FailureReason) } func (PaymentNotification_TransactionDetails_FailedTransaction_FailureReason) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[13].Descriptor() + return file_backuppb_Backup_proto_enumTypes[18].Descriptor() } func (PaymentNotification_TransactionDetails_FailedTransaction_FailureReason) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[13] + return &file_backuppb_Backup_proto_enumTypes[18] } func (x PaymentNotification_TransactionDetails_FailedTransaction_FailureReason) Number() protoreflect.EnumNumber { @@ -806,11 +1060,11 @@ func (x PaymentNotification_TransactionDetails_Transaction_Status) String() stri } func (PaymentNotification_TransactionDetails_Transaction_Status) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[14].Descriptor() + return file_backuppb_Backup_proto_enumTypes[19].Descriptor() } func (PaymentNotification_TransactionDetails_Transaction_Status) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[14] + return &file_backuppb_Backup_proto_enumTypes[19] } func (x PaymentNotification_TransactionDetails_Transaction_Status) Number() protoreflect.EnumNumber { @@ -858,11 +1112,11 @@ func (x GiftBadge_State) String() string { } func (GiftBadge_State) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[15].Descriptor() + return file_backuppb_Backup_proto_enumTypes[20].Descriptor() } func (GiftBadge_State) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[15] + return &file_backuppb_Backup_proto_enumTypes[20] } func (x GiftBadge_State) Number() protoreflect.EnumNumber { @@ -913,11 +1167,11 @@ func (x ContactAttachment_Phone_Type) String() string { } func (ContactAttachment_Phone_Type) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[16].Descriptor() + return file_backuppb_Backup_proto_enumTypes[21].Descriptor() } func (ContactAttachment_Phone_Type) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[16] + return &file_backuppb_Backup_proto_enumTypes[21] } func (x ContactAttachment_Phone_Type) Number() protoreflect.EnumNumber { @@ -968,11 +1222,11 @@ func (x ContactAttachment_Email_Type) String() string { } func (ContactAttachment_Email_Type) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[17].Descriptor() + return file_backuppb_Backup_proto_enumTypes[22].Descriptor() } func (ContactAttachment_Email_Type) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[17] + return &file_backuppb_Backup_proto_enumTypes[22] } func (x ContactAttachment_Email_Type) Number() protoreflect.EnumNumber { @@ -1020,11 +1274,11 @@ func (x ContactAttachment_PostalAddress_Type) String() string { } func (ContactAttachment_PostalAddress_Type) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[18].Descriptor() + return file_backuppb_Backup_proto_enumTypes[23].Descriptor() } func (ContactAttachment_PostalAddress_Type) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[18] + return &file_backuppb_Backup_proto_enumTypes[23] } func (x ContactAttachment_PostalAddress_Type) Number() protoreflect.EnumNumber { @@ -1075,11 +1329,11 @@ func (x MessageAttachment_Flag) String() string { } func (MessageAttachment_Flag) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[19].Descriptor() + return file_backuppb_Backup_proto_enumTypes[24].Descriptor() } func (MessageAttachment_Flag) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[19] + return &file_backuppb_Backup_proto_enumTypes[24] } func (x MessageAttachment_Flag) Number() protoreflect.EnumNumber { @@ -1130,11 +1384,11 @@ func (x Quote_Type) String() string { } func (Quote_Type) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[20].Descriptor() + return file_backuppb_Backup_proto_enumTypes[25].Descriptor() } func (Quote_Type) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[20] + return &file_backuppb_Backup_proto_enumTypes[25] } func (x Quote_Type) Number() protoreflect.EnumNumber { @@ -1188,11 +1442,11 @@ func (x BodyRange_Style) String() string { } func (BodyRange_Style) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[21].Descriptor() + return file_backuppb_Backup_proto_enumTypes[26].Descriptor() } func (BodyRange_Style) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[21] + return &file_backuppb_Backup_proto_enumTypes[26] } func (x BodyRange_Style) Number() protoreflect.EnumNumber { @@ -1237,11 +1491,11 @@ func (x IndividualCall_Type) String() string { } func (IndividualCall_Type) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[22].Descriptor() + return file_backuppb_Backup_proto_enumTypes[27].Descriptor() } func (IndividualCall_Type) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[22] + return &file_backuppb_Backup_proto_enumTypes[27] } func (x IndividualCall_Type) Number() protoreflect.EnumNumber { @@ -1286,11 +1540,11 @@ func (x IndividualCall_Direction) String() string { } func (IndividualCall_Direction) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[23].Descriptor() + return file_backuppb_Backup_proto_enumTypes[28].Descriptor() } func (IndividualCall_Direction) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[23] + return &file_backuppb_Backup_proto_enumTypes[28] } func (x IndividualCall_Direction) Number() protoreflect.EnumNumber { @@ -1345,11 +1599,11 @@ func (x IndividualCall_State) String() string { } func (IndividualCall_State) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[24].Descriptor() + return file_backuppb_Backup_proto_enumTypes[29].Descriptor() } func (IndividualCall_State) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[24] + return &file_backuppb_Backup_proto_enumTypes[29] } func (x IndividualCall_State) Number() protoreflect.EnumNumber { @@ -1421,11 +1675,11 @@ func (x GroupCall_State) String() string { } func (GroupCall_State) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[25].Descriptor() + return file_backuppb_Backup_proto_enumTypes[30].Descriptor() } func (GroupCall_State) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[25] + return &file_backuppb_Backup_proto_enumTypes[30] } func (x GroupCall_State) Number() protoreflect.EnumNumber { @@ -1512,11 +1766,11 @@ func (x SimpleChatUpdate_Type) String() string { } func (SimpleChatUpdate_Type) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[26].Descriptor() + return file_backuppb_Backup_proto_enumTypes[31].Descriptor() } func (SimpleChatUpdate_Type) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[26] + return &file_backuppb_Backup_proto_enumTypes[31] } func (x SimpleChatUpdate_Type) Number() protoreflect.EnumNumber { @@ -1618,11 +1872,11 @@ func (x ChatStyle_WallpaperPreset) String() string { } func (ChatStyle_WallpaperPreset) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[27].Descriptor() + return file_backuppb_Backup_proto_enumTypes[32].Descriptor() } func (ChatStyle_WallpaperPreset) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[27] + return &file_backuppb_Backup_proto_enumTypes[32] } func (x ChatStyle_WallpaperPreset) Number() protoreflect.EnumNumber { @@ -1631,7 +1885,7 @@ func (x ChatStyle_WallpaperPreset) Number() protoreflect.EnumNumber { // Deprecated: Use ChatStyle_WallpaperPreset.Descriptor instead. func (ChatStyle_WallpaperPreset) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 0} } type ChatStyle_BubbleColorPreset int32 @@ -1727,11 +1981,11 @@ func (x ChatStyle_BubbleColorPreset) String() string { } func (ChatStyle_BubbleColorPreset) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[28].Descriptor() + return file_backuppb_Backup_proto_enumTypes[33].Descriptor() } func (ChatStyle_BubbleColorPreset) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[28] + return &file_backuppb_Backup_proto_enumTypes[33] } func (x ChatStyle_BubbleColorPreset) Number() protoreflect.EnumNumber { @@ -1740,7 +1994,7 @@ func (x ChatStyle_BubbleColorPreset) Number() protoreflect.EnumNumber { // Deprecated: Use ChatStyle_BubbleColorPreset.Descriptor instead. func (ChatStyle_BubbleColorPreset) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 1} } type NotificationProfile_DayOfWeek int32 @@ -1791,11 +2045,11 @@ func (x NotificationProfile_DayOfWeek) String() string { } func (NotificationProfile_DayOfWeek) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[29].Descriptor() + return file_backuppb_Backup_proto_enumTypes[34].Descriptor() } func (NotificationProfile_DayOfWeek) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[29] + return &file_backuppb_Backup_proto_enumTypes[34] } func (x NotificationProfile_DayOfWeek) Number() protoreflect.EnumNumber { @@ -1804,7 +2058,7 @@ func (x NotificationProfile_DayOfWeek) Number() protoreflect.EnumNumber { // Deprecated: Use NotificationProfile_DayOfWeek.Descriptor instead. func (NotificationProfile_DayOfWeek) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{81, 0} } // Represents the default "All chats" folder record vs all other custom folders @@ -1841,11 +2095,11 @@ func (x ChatFolder_FolderType) String() string { } func (ChatFolder_FolderType) Descriptor() protoreflect.EnumDescriptor { - return file_backuppb_Backup_proto_enumTypes[30].Descriptor() + return file_backuppb_Backup_proto_enumTypes[35].Descriptor() } func (ChatFolder_FolderType) Type() protoreflect.EnumType { - return &file_backuppb_Backup_proto_enumTypes[30] + return &file_backuppb_Backup_proto_enumTypes[35] } func (x ChatFolder_FolderType) Number() protoreflect.EnumNumber { @@ -1854,7 +2108,7 @@ func (x ChatFolder_FolderType) Number() protoreflect.EnumNumber { // Deprecated: Use ChatFolder_FolderType.Descriptor instead. func (ChatFolder_FolderType) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{81, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{82, 0} } type BackupInfo struct { @@ -2138,19 +2392,23 @@ func (*Frame_NotificationProfile) isFrame_Item() {} func (*Frame_ChatFolder) isFrame_Item() {} type AccountData struct { - state protoimpl.MessageState `protogen:"open.v1"` - ProfileKey []byte `protobuf:"bytes,1,opt,name=profileKey,proto3" json:"profileKey,omitempty"` - Username *string `protobuf:"bytes,2,opt,name=username,proto3,oneof" json:"username,omitempty"` - UsernameLink *AccountData_UsernameLink `protobuf:"bytes,3,opt,name=usernameLink,proto3" json:"usernameLink,omitempty"` - GivenName string `protobuf:"bytes,4,opt,name=givenName,proto3" json:"givenName,omitempty"` - FamilyName string `protobuf:"bytes,5,opt,name=familyName,proto3" json:"familyName,omitempty"` - AvatarUrlPath string `protobuf:"bytes,6,opt,name=avatarUrlPath,proto3" json:"avatarUrlPath,omitempty"` - DonationSubscriberData *AccountData_SubscriberData `protobuf:"bytes,7,opt,name=donationSubscriberData,proto3" json:"donationSubscriberData,omitempty"` - AccountSettings *AccountData_AccountSettings `protobuf:"bytes,9,opt,name=accountSettings,proto3" json:"accountSettings,omitempty"` - BackupsSubscriberData *AccountData_IAPSubscriberData `protobuf:"bytes,10,opt,name=backupsSubscriberData,proto3" json:"backupsSubscriberData,omitempty"` - SvrPin string `protobuf:"bytes,11,opt,name=svrPin,proto3" json:"svrPin,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ProfileKey []byte `protobuf:"bytes,1,opt,name=profileKey,proto3" json:"profileKey,omitempty"` + Username *string `protobuf:"bytes,2,opt,name=username,proto3,oneof" json:"username,omitempty"` + UsernameLink *AccountData_UsernameLink `protobuf:"bytes,3,opt,name=usernameLink,proto3" json:"usernameLink,omitempty"` + GivenName string `protobuf:"bytes,4,opt,name=givenName,proto3" json:"givenName,omitempty"` + FamilyName string `protobuf:"bytes,5,opt,name=familyName,proto3" json:"familyName,omitempty"` + AvatarUrlPath string `protobuf:"bytes,6,opt,name=avatarUrlPath,proto3" json:"avatarUrlPath,omitempty"` + DonationSubscriberData *AccountData_SubscriberData `protobuf:"bytes,7,opt,name=donationSubscriberData,proto3" json:"donationSubscriberData,omitempty"` + AccountSettings *AccountData_AccountSettings `protobuf:"bytes,9,opt,name=accountSettings,proto3" json:"accountSettings,omitempty"` + BackupsSubscriberData *AccountData_IAPSubscriberData `protobuf:"bytes,10,opt,name=backupsSubscriberData,proto3" json:"backupsSubscriberData,omitempty"` + SvrPin string `protobuf:"bytes,11,opt,name=svrPin,proto3" json:"svrPin,omitempty"` + AndroidSpecificSettings *AccountData_AndroidSpecificSettings `protobuf:"bytes,12,opt,name=androidSpecificSettings,proto3" json:"androidSpecificSettings,omitempty"` + BioText string `protobuf:"bytes,13,opt,name=bioText,proto3" json:"bioText,omitempty"` + BioEmoji string `protobuf:"bytes,14,opt,name=bioEmoji,proto3" json:"bioEmoji,omitempty"` + KeyTransparencyData []byte `protobuf:"bytes,15,opt,name=keyTransparencyData,proto3,oneof" json:"keyTransparencyData,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountData) Reset() { @@ -2253,6 +2511,34 @@ func (x *AccountData) GetSvrPin() string { return "" } +func (x *AccountData) GetAndroidSpecificSettings() *AccountData_AndroidSpecificSettings { + if x != nil { + return x.AndroidSpecificSettings + } + return nil +} + +func (x *AccountData) GetBioText() string { + if x != nil { + return x.BioText + } + return "" +} + +func (x *AccountData) GetBioEmoji() string { + if x != nil { + return x.BioEmoji + } + return "" +} + +func (x *AccountData) GetKeyTransparencyData() []byte { + if x != nil { + return x.KeyTransparencyData + } + return nil +} + type Recipient struct { state protoimpl.MessageState `protogen:"open.v1"` Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // generated id for reference only within this file @@ -2423,22 +2709,23 @@ type Contact struct { // // *Contact_Registered_ // *Contact_NotRegistered_ - Registration isContact_Registration `protobuf_oneof:"registration"` - ProfileKey []byte `protobuf:"bytes,9,opt,name=profileKey,proto3,oneof" json:"profileKey,omitempty"` - ProfileSharing bool `protobuf:"varint,10,opt,name=profileSharing,proto3" json:"profileSharing,omitempty"` - ProfileGivenName *string `protobuf:"bytes,11,opt,name=profileGivenName,proto3,oneof" json:"profileGivenName,omitempty"` - ProfileFamilyName *string `protobuf:"bytes,12,opt,name=profileFamilyName,proto3,oneof" json:"profileFamilyName,omitempty"` - HideStory bool `protobuf:"varint,13,opt,name=hideStory,proto3" json:"hideStory,omitempty"` - IdentityKey []byte `protobuf:"bytes,14,opt,name=identityKey,proto3,oneof" json:"identityKey,omitempty"` - IdentityState Contact_IdentityState `protobuf:"varint,15,opt,name=identityState,proto3,enum=signal.backup.Contact_IdentityState" json:"identityState,omitempty"` - Nickname *Contact_Name `protobuf:"bytes,16,opt,name=nickname,proto3" json:"nickname,omitempty"` // absent iff both `given` and `family` are empty - Note string `protobuf:"bytes,17,opt,name=note,proto3" json:"note,omitempty"` - SystemGivenName string `protobuf:"bytes,18,opt,name=systemGivenName,proto3" json:"systemGivenName,omitempty"` - SystemFamilyName string `protobuf:"bytes,19,opt,name=systemFamilyName,proto3" json:"systemFamilyName,omitempty"` - SystemNickname string `protobuf:"bytes,20,opt,name=systemNickname,proto3" json:"systemNickname,omitempty"` - AvatarColor *AvatarColor `protobuf:"varint,21,opt,name=avatarColor,proto3,enum=signal.backup.AvatarColor,oneof" json:"avatarColor,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Registration isContact_Registration `protobuf_oneof:"registration"` + ProfileKey []byte `protobuf:"bytes,9,opt,name=profileKey,proto3,oneof" json:"profileKey,omitempty"` + ProfileSharing bool `protobuf:"varint,10,opt,name=profileSharing,proto3" json:"profileSharing,omitempty"` + ProfileGivenName *string `protobuf:"bytes,11,opt,name=profileGivenName,proto3,oneof" json:"profileGivenName,omitempty"` + ProfileFamilyName *string `protobuf:"bytes,12,opt,name=profileFamilyName,proto3,oneof" json:"profileFamilyName,omitempty"` + HideStory bool `protobuf:"varint,13,opt,name=hideStory,proto3" json:"hideStory,omitempty"` + IdentityKey []byte `protobuf:"bytes,14,opt,name=identityKey,proto3,oneof" json:"identityKey,omitempty"` + IdentityState Contact_IdentityState `protobuf:"varint,15,opt,name=identityState,proto3,enum=signal.backup.Contact_IdentityState" json:"identityState,omitempty"` + Nickname *Contact_Name `protobuf:"bytes,16,opt,name=nickname,proto3" json:"nickname,omitempty"` // absent iff both `given` and `family` are empty + Note string `protobuf:"bytes,17,opt,name=note,proto3" json:"note,omitempty"` + SystemGivenName string `protobuf:"bytes,18,opt,name=systemGivenName,proto3" json:"systemGivenName,omitempty"` + SystemFamilyName string `protobuf:"bytes,19,opt,name=systemFamilyName,proto3" json:"systemFamilyName,omitempty"` + SystemNickname string `protobuf:"bytes,20,opt,name=systemNickname,proto3" json:"systemNickname,omitempty"` + AvatarColor *AvatarColor `protobuf:"varint,21,opt,name=avatarColor,proto3,enum=signal.backup.AvatarColor,oneof" json:"avatarColor,omitempty"` + KeyTransparencyData []byte `protobuf:"bytes,22,opt,name=keyTransparencyData,proto3,oneof" json:"keyTransparencyData,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Contact) Reset() { @@ -2629,6 +2916,13 @@ func (x *Contact) GetAvatarColor() AvatarColor { return AvatarColor_A100 } +func (x *Contact) GetKeyTransparencyData() []byte { + if x != nil { + return x.KeyTransparencyData + } + return nil +} + type isContact_Registration interface { isContact_Registration() } @@ -3286,7 +3580,8 @@ type ChatItem struct { // *ChatItem_ViewOnceMessage // *ChatItem_DirectStoryReplyMessage // *ChatItem_Poll - Item isChatItem_Item `protobuf_oneof:"item"` + Item isChatItem_Item `protobuf_oneof:"item"` + PinDetails *ChatItem_PinDetails `protobuf:"bytes,21,opt,name=pinDetails,proto3" json:"pinDetails,omitempty"` // only set if message is pinned unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -3501,6 +3796,13 @@ func (x *ChatItem) GetPoll() *Poll { return nil } +func (x *ChatItem) GetPinDetails() *ChatItem_PinDetails { + if x != nil { + return x.PinDetails + } + return nil +} + type isChatItem_DirectionalDetails interface { isChatItem_DirectionalDetails() } @@ -4983,6 +5285,7 @@ type Poll struct { AllowMultiple bool `protobuf:"varint,2,opt,name=allowMultiple,proto3" json:"allowMultiple,omitempty"` Options []*Poll_PollOption `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` // At least two HasEnded bool `protobuf:"varint,4,opt,name=hasEnded,proto3" json:"hasEnded,omitempty"` + Reactions []*Reaction `protobuf:"bytes,5,rep,name=reactions,proto3" json:"reactions,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -5045,6 +5348,13 @@ func (x *Poll) GetHasEnded() bool { return false } +func (x *Poll) GetReactions() []*Reaction { + if x != nil { + return x.Reactions + } + return nil +} + type ChatUpdateMessage struct { state protoimpl.MessageState `protogen:"open.v1"` // If unset, importers should ignore the update message without throwing an error. @@ -5061,6 +5371,7 @@ type ChatUpdateMessage struct { // *ChatUpdateMessage_GroupCall // *ChatUpdateMessage_LearnedProfileChange // *ChatUpdateMessage_PollTerminate + // *ChatUpdateMessage_PinMessage Update isChatUpdateMessage_Update `protobuf_oneof:"update"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -5193,6 +5504,15 @@ func (x *ChatUpdateMessage) GetPollTerminate() *PollTerminateUpdate { return nil } +func (x *ChatUpdateMessage) GetPinMessage() *PinMessageUpdate { + if x != nil { + if x, ok := x.Update.(*ChatUpdateMessage_PinMessage); ok { + return x.PinMessage + } + } + return nil +} + type isChatUpdateMessage_Update interface { isChatUpdateMessage_Update() } @@ -5237,6 +5557,10 @@ type ChatUpdateMessage_PollTerminate struct { PollTerminate *PollTerminateUpdate `protobuf:"bytes,10,opt,name=pollTerminate,proto3,oneof"` } +type ChatUpdateMessage_PinMessage struct { + PinMessage *PinMessageUpdate `protobuf:"bytes,11,opt,name=pinMessage,proto3,oneof"` +} + func (*ChatUpdateMessage_SimpleUpdate) isChatUpdateMessage_Update() {} func (*ChatUpdateMessage_GroupChange) isChatUpdateMessage_Update() {} @@ -5257,6 +5581,8 @@ func (*ChatUpdateMessage_LearnedProfileChange) isChatUpdateMessage_Update() {} func (*ChatUpdateMessage_PollTerminate) isChatUpdateMessage_Update() {} +func (*ChatUpdateMessage_PinMessage) isChatUpdateMessage_Update() {} + type IndividualCall struct { state protoimpl.MessageState `protogen:"open.v1"` CallId *uint64 `protobuf:"varint,1,opt,name=callId,proto3,oneof" json:"callId,omitempty"` @@ -7532,6 +7858,58 @@ func (x *PollTerminateUpdate) GetQuestion() string { return "" } +type PinMessageUpdate struct { + state protoimpl.MessageState `protogen:"open.v1"` + TargetSentTimestamp uint64 `protobuf:"varint,1,opt,name=targetSentTimestamp,proto3" json:"targetSentTimestamp,omitempty"` + AuthorId uint64 `protobuf:"varint,2,opt,name=authorId,proto3" json:"authorId,omitempty"` // recipient id + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PinMessageUpdate) Reset() { + *x = PinMessageUpdate{} + mi := &file_backuppb_Backup_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PinMessageUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PinMessageUpdate) ProtoMessage() {} + +func (x *PinMessageUpdate) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[78] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PinMessageUpdate.ProtoReflect.Descriptor instead. +func (*PinMessageUpdate) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{78} +} + +func (x *PinMessageUpdate) GetTargetSentTimestamp() uint64 { + if x != nil { + return x.TargetSentTimestamp + } + return 0 +} + +func (x *PinMessageUpdate) GetAuthorId() uint64 { + if x != nil { + return x.AuthorId + } + return 0 +} + type StickerPack struct { state protoimpl.MessageState `protogen:"open.v1"` PackId []byte `protobuf:"bytes,1,opt,name=packId,proto3" json:"packId,omitempty"` @@ -7542,7 +7920,7 @@ type StickerPack struct { func (x *StickerPack) Reset() { *x = StickerPack{} - mi := &file_backuppb_Backup_proto_msgTypes[78] + mi := &file_backuppb_Backup_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7554,7 +7932,7 @@ func (x *StickerPack) String() string { func (*StickerPack) ProtoMessage() {} func (x *StickerPack) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[78] + mi := &file_backuppb_Backup_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7567,7 +7945,7 @@ func (x *StickerPack) ProtoReflect() protoreflect.Message { // Deprecated: Use StickerPack.ProtoReflect.Descriptor instead. func (*StickerPack) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{78} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{79} } func (x *StickerPack) GetPackId() []byte { @@ -7608,7 +7986,7 @@ type ChatStyle struct { func (x *ChatStyle) Reset() { *x = ChatStyle{} - mi := &file_backuppb_Backup_proto_msgTypes[79] + mi := &file_backuppb_Backup_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7620,7 +7998,7 @@ func (x *ChatStyle) String() string { func (*ChatStyle) ProtoMessage() {} func (x *ChatStyle) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[79] + mi := &file_backuppb_Backup_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7633,7 +8011,7 @@ func (x *ChatStyle) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle.ProtoReflect.Descriptor instead. func (*ChatStyle) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80} } func (x *ChatStyle) GetWallpaper() isChatStyle_Wallpaper { @@ -7765,7 +8143,7 @@ type NotificationProfile struct { func (x *NotificationProfile) Reset() { *x = NotificationProfile{} - mi := &file_backuppb_Backup_proto_msgTypes[80] + mi := &file_backuppb_Backup_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7777,7 +8155,7 @@ func (x *NotificationProfile) String() string { func (*NotificationProfile) ProtoMessage() {} func (x *NotificationProfile) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[80] + mi := &file_backuppb_Backup_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7790,7 +8168,7 @@ func (x *NotificationProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use NotificationProfile.ProtoReflect.Descriptor instead. func (*NotificationProfile) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{80} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{81} } func (x *NotificationProfile) GetName() string { @@ -7896,7 +8274,7 @@ type ChatFolder struct { func (x *ChatFolder) Reset() { *x = ChatFolder{} - mi := &file_backuppb_Backup_proto_msgTypes[81] + mi := &file_backuppb_Backup_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7908,7 +8286,7 @@ func (x *ChatFolder) String() string { func (*ChatFolder) ProtoMessage() {} func (x *ChatFolder) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[81] + mi := &file_backuppb_Backup_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7921,7 +8299,7 @@ func (x *ChatFolder) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatFolder.ProtoReflect.Descriptor instead. func (*ChatFolder) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{81} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{82} } func (x *ChatFolder) GetName() string { @@ -7998,7 +8376,7 @@ type AccountData_UsernameLink struct { func (x *AccountData_UsernameLink) Reset() { *x = AccountData_UsernameLink{} - mi := &file_backuppb_Backup_proto_msgTypes[82] + mi := &file_backuppb_Backup_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8010,7 +8388,7 @@ func (x *AccountData_UsernameLink) String() string { func (*AccountData_UsernameLink) ProtoMessage() {} func (x *AccountData_UsernameLink) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[82] + mi := &file_backuppb_Backup_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8047,6 +8425,74 @@ func (x *AccountData_UsernameLink) GetColor() AccountData_UsernameLink_Color { return AccountData_UsernameLink_UNKNOWN } +type AccountData_AutoDownloadSettings struct { + state protoimpl.MessageState `protogen:"open.v1"` + Images AccountData_AutoDownloadSettings_AutoDownloadOption `protobuf:"varint,1,opt,name=images,proto3,enum=signal.backup.AccountData_AutoDownloadSettings_AutoDownloadOption" json:"images,omitempty"` + Audio AccountData_AutoDownloadSettings_AutoDownloadOption `protobuf:"varint,2,opt,name=audio,proto3,enum=signal.backup.AccountData_AutoDownloadSettings_AutoDownloadOption" json:"audio,omitempty"` + Video AccountData_AutoDownloadSettings_AutoDownloadOption `protobuf:"varint,3,opt,name=video,proto3,enum=signal.backup.AccountData_AutoDownloadSettings_AutoDownloadOption" json:"video,omitempty"` + Documents AccountData_AutoDownloadSettings_AutoDownloadOption `protobuf:"varint,4,opt,name=documents,proto3,enum=signal.backup.AccountData_AutoDownloadSettings_AutoDownloadOption" json:"documents,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AccountData_AutoDownloadSettings) Reset() { + *x = AccountData_AutoDownloadSettings{} + mi := &file_backuppb_Backup_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AccountData_AutoDownloadSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccountData_AutoDownloadSettings) ProtoMessage() {} + +func (x *AccountData_AutoDownloadSettings) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[84] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccountData_AutoDownloadSettings.ProtoReflect.Descriptor instead. +func (*AccountData_AutoDownloadSettings) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 1} +} + +func (x *AccountData_AutoDownloadSettings) GetImages() AccountData_AutoDownloadSettings_AutoDownloadOption { + if x != nil { + return x.Images + } + return AccountData_AutoDownloadSettings_UNKNOWN +} + +func (x *AccountData_AutoDownloadSettings) GetAudio() AccountData_AutoDownloadSettings_AutoDownloadOption { + if x != nil { + return x.Audio + } + return AccountData_AutoDownloadSettings_UNKNOWN +} + +func (x *AccountData_AutoDownloadSettings) GetVideo() AccountData_AutoDownloadSettings_AutoDownloadOption { + if x != nil { + return x.Video + } + return AccountData_AutoDownloadSettings_UNKNOWN +} + +func (x *AccountData_AutoDownloadSettings) GetDocuments() AccountData_AutoDownloadSettings_AutoDownloadOption { + if x != nil { + return x.Documents + } + return AccountData_AutoDownloadSettings_UNKNOWN +} + type AccountData_AccountSettings struct { state protoimpl.MessageState `protogen:"open.v1"` ReadReceipts bool `protobuf:"varint,1,opt,name=readReceipts,proto3" json:"readReceipts,omitempty"` @@ -8070,14 +8516,22 @@ type AccountData_AccountSettings struct { CustomChatColors []*ChatStyle_CustomChatColor `protobuf:"bytes,19,rep,name=customChatColors,proto3" json:"customChatColors,omitempty"` OptimizeOnDeviceStorage bool `protobuf:"varint,20,opt,name=optimizeOnDeviceStorage,proto3" json:"optimizeOnDeviceStorage,omitempty"` // See zkgroup for integer particular values. Unset if backups are not enabled. - BackupTier *uint64 `protobuf:"varint,21,opt,name=backupTier,proto3,oneof" json:"backupTier,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + BackupTier *uint64 `protobuf:"varint,21,opt,name=backupTier,proto3,oneof" json:"backupTier,omitempty"` + DefaultSentMediaQuality AccountData_SentMediaQuality `protobuf:"varint,23,opt,name=defaultSentMediaQuality,proto3,enum=signal.backup.AccountData_SentMediaQuality" json:"defaultSentMediaQuality,omitempty"` + AutoDownloadSettings *AccountData_AutoDownloadSettings `protobuf:"bytes,24,opt,name=autoDownloadSettings,proto3" json:"autoDownloadSettings,omitempty"` + ScreenLockTimeoutMinutes *uint32 `protobuf:"varint,26,opt,name=screenLockTimeoutMinutes,proto3,oneof" json:"screenLockTimeoutMinutes,omitempty"` // If unset, consider screen lock to be disabled. + PinReminders *bool `protobuf:"varint,27,opt,name=pinReminders,proto3,oneof" json:"pinReminders,omitempty"` // If unset, consider pin reminders to be enabled. + AppTheme AccountData_AppTheme `protobuf:"varint,28,opt,name=appTheme,proto3,enum=signal.backup.AccountData_AppTheme" json:"appTheme,omitempty"` // If unset, treat the same as "Unknown" case + CallsUseLessDataSetting AccountData_CallsUseLessDataSetting `protobuf:"varint,29,opt,name=callsUseLessDataSetting,proto3,enum=signal.backup.AccountData_CallsUseLessDataSetting" json:"callsUseLessDataSetting,omitempty"` // If unset, treat the same as "Unknown" case + AllowSealedSenderFromAnyone bool `protobuf:"varint,30,opt,name=allowSealedSenderFromAnyone,proto3" json:"allowSealedSenderFromAnyone,omitempty"` + AllowAutomaticKeyVerification bool `protobuf:"varint,31,opt,name=allowAutomaticKeyVerification,proto3" json:"allowAutomaticKeyVerification,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountData_AccountSettings) Reset() { *x = AccountData_AccountSettings{} - mi := &file_backuppb_Backup_proto_msgTypes[83] + mi := &file_backuppb_Backup_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8089,7 +8543,7 @@ func (x *AccountData_AccountSettings) String() string { func (*AccountData_AccountSettings) ProtoMessage() {} func (x *AccountData_AccountSettings) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[83] + mi := &file_backuppb_Backup_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8102,7 +8556,7 @@ func (x *AccountData_AccountSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountData_AccountSettings.ProtoReflect.Descriptor instead. func (*AccountData_AccountSettings) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 2} } func (x *AccountData_AccountSettings) GetReadReceipts() bool { @@ -8252,6 +8706,62 @@ func (x *AccountData_AccountSettings) GetBackupTier() uint64 { return 0 } +func (x *AccountData_AccountSettings) GetDefaultSentMediaQuality() AccountData_SentMediaQuality { + if x != nil { + return x.DefaultSentMediaQuality + } + return AccountData_UNKNOWN_QUALITY +} + +func (x *AccountData_AccountSettings) GetAutoDownloadSettings() *AccountData_AutoDownloadSettings { + if x != nil { + return x.AutoDownloadSettings + } + return nil +} + +func (x *AccountData_AccountSettings) GetScreenLockTimeoutMinutes() uint32 { + if x != nil && x.ScreenLockTimeoutMinutes != nil { + return *x.ScreenLockTimeoutMinutes + } + return 0 +} + +func (x *AccountData_AccountSettings) GetPinReminders() bool { + if x != nil && x.PinReminders != nil { + return *x.PinReminders + } + return false +} + +func (x *AccountData_AccountSettings) GetAppTheme() AccountData_AppTheme { + if x != nil { + return x.AppTheme + } + return AccountData_UNKNOWN_APP_THEME +} + +func (x *AccountData_AccountSettings) GetCallsUseLessDataSetting() AccountData_CallsUseLessDataSetting { + if x != nil { + return x.CallsUseLessDataSetting + } + return AccountData_UNKNOWN_CALL_DATA_SETTING +} + +func (x *AccountData_AccountSettings) GetAllowSealedSenderFromAnyone() bool { + if x != nil { + return x.AllowSealedSenderFromAnyone + } + return false +} + +func (x *AccountData_AccountSettings) GetAllowAutomaticKeyVerification() bool { + if x != nil { + return x.AllowAutomaticKeyVerification + } + return false +} + type AccountData_SubscriberData struct { state protoimpl.MessageState `protogen:"open.v1"` SubscriberId []byte `protobuf:"bytes,1,opt,name=subscriberId,proto3" json:"subscriberId,omitempty"` @@ -8263,7 +8773,7 @@ type AccountData_SubscriberData struct { func (x *AccountData_SubscriberData) Reset() { *x = AccountData_SubscriberData{} - mi := &file_backuppb_Backup_proto_msgTypes[84] + mi := &file_backuppb_Backup_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8275,7 +8785,7 @@ func (x *AccountData_SubscriberData) String() string { func (*AccountData_SubscriberData) ProtoMessage() {} func (x *AccountData_SubscriberData) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[84] + mi := &file_backuppb_Backup_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8288,7 +8798,7 @@ func (x *AccountData_SubscriberData) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountData_SubscriberData.ProtoReflect.Descriptor instead. func (*AccountData_SubscriberData) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 2} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 3} } func (x *AccountData_SubscriberData) GetSubscriberId() []byte { @@ -8328,7 +8838,7 @@ type AccountData_IAPSubscriberData struct { func (x *AccountData_IAPSubscriberData) Reset() { *x = AccountData_IAPSubscriberData{} - mi := &file_backuppb_Backup_proto_msgTypes[85] + mi := &file_backuppb_Backup_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8340,7 +8850,7 @@ func (x *AccountData_IAPSubscriberData) String() string { func (*AccountData_IAPSubscriberData) ProtoMessage() {} func (x *AccountData_IAPSubscriberData) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[85] + mi := &file_backuppb_Backup_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8353,7 +8863,7 @@ func (x *AccountData_IAPSubscriberData) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountData_IAPSubscriberData.ProtoReflect.Descriptor instead. func (*AccountData_IAPSubscriberData) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 3} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 4} } func (x *AccountData_IAPSubscriberData) GetSubscriberId() []byte { @@ -8408,6 +8918,66 @@ func (*AccountData_IAPSubscriberData_PurchaseToken) isAccountData_IAPSubscriberD func (*AccountData_IAPSubscriberData_OriginalTransactionId) isAccountData_IAPSubscriberData_IapSubscriptionId() { } +type AccountData_AndroidSpecificSettings struct { + state protoimpl.MessageState `protogen:"open.v1"` + UseSystemEmoji bool `protobuf:"varint,1,opt,name=useSystemEmoji,proto3" json:"useSystemEmoji,omitempty"` + ScreenshotSecurity bool `protobuf:"varint,2,opt,name=screenshotSecurity,proto3" json:"screenshotSecurity,omitempty"` + NavigationBarSize AccountData_AndroidSpecificSettings_NavigationBarSize `protobuf:"varint,3,opt,name=navigationBarSize,proto3,enum=signal.backup.AccountData_AndroidSpecificSettings_NavigationBarSize" json:"navigationBarSize,omitempty"` // If unset, treat the same as "Unknown" case + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AccountData_AndroidSpecificSettings) Reset() { + *x = AccountData_AndroidSpecificSettings{} + mi := &file_backuppb_Backup_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AccountData_AndroidSpecificSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccountData_AndroidSpecificSettings) ProtoMessage() {} + +func (x *AccountData_AndroidSpecificSettings) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[88] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccountData_AndroidSpecificSettings.ProtoReflect.Descriptor instead. +func (*AccountData_AndroidSpecificSettings) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{2, 5} +} + +func (x *AccountData_AndroidSpecificSettings) GetUseSystemEmoji() bool { + if x != nil { + return x.UseSystemEmoji + } + return false +} + +func (x *AccountData_AndroidSpecificSettings) GetScreenshotSecurity() bool { + if x != nil { + return x.ScreenshotSecurity + } + return false +} + +func (x *AccountData_AndroidSpecificSettings) GetNavigationBarSize() AccountData_AndroidSpecificSettings_NavigationBarSize { + if x != nil { + return x.NavigationBarSize + } + return AccountData_AndroidSpecificSettings_UNKNOWN_BAR_SIZE +} + type Contact_Registered struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -8416,7 +8986,7 @@ type Contact_Registered struct { func (x *Contact_Registered) Reset() { *x = Contact_Registered{} - mi := &file_backuppb_Backup_proto_msgTypes[86] + mi := &file_backuppb_Backup_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8428,7 +8998,7 @@ func (x *Contact_Registered) String() string { func (*Contact_Registered) ProtoMessage() {} func (x *Contact_Registered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[86] + mi := &file_backuppb_Backup_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8453,7 +9023,7 @@ type Contact_NotRegistered struct { func (x *Contact_NotRegistered) Reset() { *x = Contact_NotRegistered{} - mi := &file_backuppb_Backup_proto_msgTypes[87] + mi := &file_backuppb_Backup_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8465,7 +9035,7 @@ func (x *Contact_NotRegistered) String() string { func (*Contact_NotRegistered) ProtoMessage() {} func (x *Contact_NotRegistered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[87] + mi := &file_backuppb_Backup_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8498,7 +9068,7 @@ type Contact_Name struct { func (x *Contact_Name) Reset() { *x = Contact_Name{} - mi := &file_backuppb_Backup_proto_msgTypes[88] + mi := &file_backuppb_Backup_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8510,7 +9080,7 @@ func (x *Contact_Name) String() string { func (*Contact_Name) ProtoMessage() {} func (x *Contact_Name) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[88] + mi := &file_backuppb_Backup_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8565,7 +9135,7 @@ type Group_GroupSnapshot struct { func (x *Group_GroupSnapshot) Reset() { *x = Group_GroupSnapshot{} - mi := &file_backuppb_Backup_proto_msgTypes[89] + mi := &file_backuppb_Backup_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8577,7 +9147,7 @@ func (x *Group_GroupSnapshot) String() string { func (*Group_GroupSnapshot) ProtoMessage() {} func (x *Group_GroupSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[89] + mi := &file_backuppb_Backup_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8694,7 +9264,7 @@ type Group_GroupAttributeBlob struct { func (x *Group_GroupAttributeBlob) Reset() { *x = Group_GroupAttributeBlob{} - mi := &file_backuppb_Backup_proto_msgTypes[90] + mi := &file_backuppb_Backup_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8706,7 +9276,7 @@ func (x *Group_GroupAttributeBlob) String() string { func (*Group_GroupAttributeBlob) ProtoMessage() {} func (x *Group_GroupAttributeBlob) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[90] + mi := &file_backuppb_Backup_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8804,7 +9374,7 @@ type Group_Member struct { func (x *Group_Member) Reset() { *x = Group_Member{} - mi := &file_backuppb_Backup_proto_msgTypes[91] + mi := &file_backuppb_Backup_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8816,7 +9386,7 @@ func (x *Group_Member) String() string { func (*Group_Member) ProtoMessage() {} func (x *Group_Member) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[91] + mi := &file_backuppb_Backup_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8864,7 +9434,7 @@ type Group_MemberPendingProfileKey struct { func (x *Group_MemberPendingProfileKey) Reset() { *x = Group_MemberPendingProfileKey{} - mi := &file_backuppb_Backup_proto_msgTypes[92] + mi := &file_backuppb_Backup_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8876,7 +9446,7 @@ func (x *Group_MemberPendingProfileKey) String() string { func (*Group_MemberPendingProfileKey) ProtoMessage() {} func (x *Group_MemberPendingProfileKey) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[92] + mi := &file_backuppb_Backup_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8923,7 +9493,7 @@ type Group_MemberPendingAdminApproval struct { func (x *Group_MemberPendingAdminApproval) Reset() { *x = Group_MemberPendingAdminApproval{} - mi := &file_backuppb_Backup_proto_msgTypes[93] + mi := &file_backuppb_Backup_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8935,7 +9505,7 @@ func (x *Group_MemberPendingAdminApproval) String() string { func (*Group_MemberPendingAdminApproval) ProtoMessage() {} func (x *Group_MemberPendingAdminApproval) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[93] + mi := &file_backuppb_Backup_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8975,7 +9545,7 @@ type Group_MemberBanned struct { func (x *Group_MemberBanned) Reset() { *x = Group_MemberBanned{} - mi := &file_backuppb_Backup_proto_msgTypes[94] + mi := &file_backuppb_Backup_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8987,7 +9557,7 @@ func (x *Group_MemberBanned) String() string { func (*Group_MemberBanned) ProtoMessage() {} func (x *Group_MemberBanned) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[94] + mi := &file_backuppb_Backup_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9028,7 +9598,7 @@ type Group_AccessControl struct { func (x *Group_AccessControl) Reset() { *x = Group_AccessControl{} - mi := &file_backuppb_Backup_proto_msgTypes[95] + mi := &file_backuppb_Backup_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9040,7 +9610,7 @@ func (x *Group_AccessControl) String() string { func (*Group_AccessControl) ProtoMessage() {} func (x *Group_AccessControl) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[95] + mi := &file_backuppb_Backup_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9089,7 +9659,7 @@ type ChatItem_IncomingMessageDetails struct { func (x *ChatItem_IncomingMessageDetails) Reset() { *x = ChatItem_IncomingMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[96] + mi := &file_backuppb_Backup_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9101,7 +9671,7 @@ func (x *ChatItem_IncomingMessageDetails) String() string { func (*ChatItem_IncomingMessageDetails) ProtoMessage() {} func (x *ChatItem_IncomingMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[96] + mi := &file_backuppb_Backup_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9155,7 +9725,7 @@ type ChatItem_OutgoingMessageDetails struct { func (x *ChatItem_OutgoingMessageDetails) Reset() { *x = ChatItem_OutgoingMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[97] + mi := &file_backuppb_Backup_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9167,7 +9737,7 @@ func (x *ChatItem_OutgoingMessageDetails) String() string { func (*ChatItem_OutgoingMessageDetails) ProtoMessage() {} func (x *ChatItem_OutgoingMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[97] + mi := &file_backuppb_Backup_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9205,7 +9775,7 @@ type ChatItem_DirectionlessMessageDetails struct { func (x *ChatItem_DirectionlessMessageDetails) Reset() { *x = ChatItem_DirectionlessMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[98] + mi := &file_backuppb_Backup_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9217,7 +9787,7 @@ func (x *ChatItem_DirectionlessMessageDetails) String() string { func (*ChatItem_DirectionlessMessageDetails) ProtoMessage() {} func (x *ChatItem_DirectionlessMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[98] + mi := &file_backuppb_Backup_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9233,6 +9803,96 @@ func (*ChatItem_DirectionlessMessageDetails) Descriptor() ([]byte, []int) { return file_backuppb_Backup_proto_rawDescGZIP(), []int{13, 2} } +type ChatItem_PinDetails struct { + state protoimpl.MessageState `protogen:"open.v1"` + PinnedAtTimestamp uint64 `protobuf:"varint,1,opt,name=pinnedAtTimestamp,proto3" json:"pinnedAtTimestamp,omitempty"` + // Types that are valid to be assigned to PinExpiry: + // + // *ChatItem_PinDetails_PinExpiresAtTimestamp + // *ChatItem_PinDetails_PinNeverExpires + PinExpiry isChatItem_PinDetails_PinExpiry `protobuf_oneof:"pinExpiry"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ChatItem_PinDetails) Reset() { + *x = ChatItem_PinDetails{} + mi := &file_backuppb_Backup_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ChatItem_PinDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChatItem_PinDetails) ProtoMessage() {} + +func (x *ChatItem_PinDetails) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[102] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChatItem_PinDetails.ProtoReflect.Descriptor instead. +func (*ChatItem_PinDetails) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{13, 3} +} + +func (x *ChatItem_PinDetails) GetPinnedAtTimestamp() uint64 { + if x != nil { + return x.PinnedAtTimestamp + } + return 0 +} + +func (x *ChatItem_PinDetails) GetPinExpiry() isChatItem_PinDetails_PinExpiry { + if x != nil { + return x.PinExpiry + } + return nil +} + +func (x *ChatItem_PinDetails) GetPinExpiresAtTimestamp() uint64 { + if x != nil { + if x, ok := x.PinExpiry.(*ChatItem_PinDetails_PinExpiresAtTimestamp); ok { + return x.PinExpiresAtTimestamp + } + } + return 0 +} + +func (x *ChatItem_PinDetails) GetPinNeverExpires() bool { + if x != nil { + if x, ok := x.PinExpiry.(*ChatItem_PinDetails_PinNeverExpires); ok { + return x.PinNeverExpires + } + } + return false +} + +type isChatItem_PinDetails_PinExpiry interface { + isChatItem_PinDetails_PinExpiry() +} + +type ChatItem_PinDetails_PinExpiresAtTimestamp struct { + PinExpiresAtTimestamp uint64 `protobuf:"varint,2,opt,name=pinExpiresAtTimestamp,proto3,oneof"` // timestamp when the pin should expire +} + +type ChatItem_PinDetails_PinNeverExpires struct { + PinNeverExpires bool `protobuf:"varint,3,opt,name=pinNeverExpires,proto3,oneof"` +} + +func (*ChatItem_PinDetails_PinExpiresAtTimestamp) isChatItem_PinDetails_PinExpiry() {} + +func (*ChatItem_PinDetails_PinNeverExpires) isChatItem_PinDetails_PinExpiry() {} + type SendStatus_Pending struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -9241,7 +9901,7 @@ type SendStatus_Pending struct { func (x *SendStatus_Pending) Reset() { *x = SendStatus_Pending{} - mi := &file_backuppb_Backup_proto_msgTypes[99] + mi := &file_backuppb_Backup_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9253,7 +9913,7 @@ func (x *SendStatus_Pending) String() string { func (*SendStatus_Pending) ProtoMessage() {} func (x *SendStatus_Pending) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[99] + mi := &file_backuppb_Backup_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9278,7 +9938,7 @@ type SendStatus_Sent struct { func (x *SendStatus_Sent) Reset() { *x = SendStatus_Sent{} - mi := &file_backuppb_Backup_proto_msgTypes[100] + mi := &file_backuppb_Backup_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9290,7 +9950,7 @@ func (x *SendStatus_Sent) String() string { func (*SendStatus_Sent) ProtoMessage() {} func (x *SendStatus_Sent) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[100] + mi := &file_backuppb_Backup_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9322,7 +9982,7 @@ type SendStatus_Delivered struct { func (x *SendStatus_Delivered) Reset() { *x = SendStatus_Delivered{} - mi := &file_backuppb_Backup_proto_msgTypes[101] + mi := &file_backuppb_Backup_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9334,7 +9994,7 @@ func (x *SendStatus_Delivered) String() string { func (*SendStatus_Delivered) ProtoMessage() {} func (x *SendStatus_Delivered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[101] + mi := &file_backuppb_Backup_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9366,7 +10026,7 @@ type SendStatus_Read struct { func (x *SendStatus_Read) Reset() { *x = SendStatus_Read{} - mi := &file_backuppb_Backup_proto_msgTypes[102] + mi := &file_backuppb_Backup_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9378,7 +10038,7 @@ func (x *SendStatus_Read) String() string { func (*SendStatus_Read) ProtoMessage() {} func (x *SendStatus_Read) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[102] + mi := &file_backuppb_Backup_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9410,7 +10070,7 @@ type SendStatus_Viewed struct { func (x *SendStatus_Viewed) Reset() { *x = SendStatus_Viewed{} - mi := &file_backuppb_Backup_proto_msgTypes[103] + mi := &file_backuppb_Backup_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9422,7 +10082,7 @@ func (x *SendStatus_Viewed) String() string { func (*SendStatus_Viewed) ProtoMessage() {} func (x *SendStatus_Viewed) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[103] + mi := &file_backuppb_Backup_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9454,7 +10114,7 @@ type SendStatus_Skipped struct { func (x *SendStatus_Skipped) Reset() { *x = SendStatus_Skipped{} - mi := &file_backuppb_Backup_proto_msgTypes[104] + mi := &file_backuppb_Backup_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9466,7 +10126,7 @@ func (x *SendStatus_Skipped) String() string { func (*SendStatus_Skipped) ProtoMessage() {} func (x *SendStatus_Skipped) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[104] + mi := &file_backuppb_Backup_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9491,7 +10151,7 @@ type SendStatus_Failed struct { func (x *SendStatus_Failed) Reset() { *x = SendStatus_Failed{} - mi := &file_backuppb_Backup_proto_msgTypes[105] + mi := &file_backuppb_Backup_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9503,7 +10163,7 @@ func (x *SendStatus_Failed) String() string { func (*SendStatus_Failed) ProtoMessage() {} func (x *SendStatus_Failed) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[105] + mi := &file_backuppb_Backup_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9536,7 +10196,7 @@ type DirectStoryReplyMessage_TextReply struct { func (x *DirectStoryReplyMessage_TextReply) Reset() { *x = DirectStoryReplyMessage_TextReply{} - mi := &file_backuppb_Backup_proto_msgTypes[106] + mi := &file_backuppb_Backup_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9548,7 +10208,7 @@ func (x *DirectStoryReplyMessage_TextReply) String() string { func (*DirectStoryReplyMessage_TextReply) ProtoMessage() {} func (x *DirectStoryReplyMessage_TextReply) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[106] + mi := &file_backuppb_Backup_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9593,7 +10253,7 @@ type PaymentNotification_TransactionDetails struct { func (x *PaymentNotification_TransactionDetails) Reset() { *x = PaymentNotification_TransactionDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[107] + mi := &file_backuppb_Backup_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9605,7 +10265,7 @@ func (x *PaymentNotification_TransactionDetails) String() string { func (*PaymentNotification_TransactionDetails) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[107] + mi := &file_backuppb_Backup_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9674,7 +10334,7 @@ type PaymentNotification_TransactionDetails_MobileCoinTxoIdentification struct { func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) Reset() { *x = PaymentNotification_TransactionDetails_MobileCoinTxoIdentification{} - mi := &file_backuppb_Backup_proto_msgTypes[108] + mi := &file_backuppb_Backup_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9686,7 +10346,7 @@ func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) Str func (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[108] + mi := &file_backuppb_Backup_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9725,7 +10385,7 @@ type PaymentNotification_TransactionDetails_FailedTransaction struct { func (x *PaymentNotification_TransactionDetails_FailedTransaction) Reset() { *x = PaymentNotification_TransactionDetails_FailedTransaction{} - mi := &file_backuppb_Backup_proto_msgTypes[109] + mi := &file_backuppb_Backup_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9737,7 +10397,7 @@ func (x *PaymentNotification_TransactionDetails_FailedTransaction) String() stri func (*PaymentNotification_TransactionDetails_FailedTransaction) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_FailedTransaction) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[109] + mi := &file_backuppb_Backup_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9778,7 +10438,7 @@ type PaymentNotification_TransactionDetails_Transaction struct { func (x *PaymentNotification_TransactionDetails_Transaction) Reset() { *x = PaymentNotification_TransactionDetails_Transaction{} - mi := &file_backuppb_Backup_proto_msgTypes[110] + mi := &file_backuppb_Backup_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9790,7 +10450,7 @@ func (x *PaymentNotification_TransactionDetails_Transaction) String() string { func (*PaymentNotification_TransactionDetails_Transaction) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_Transaction) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[110] + mi := &file_backuppb_Backup_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9869,7 +10529,7 @@ type ContactAttachment_Name struct { func (x *ContactAttachment_Name) Reset() { *x = ContactAttachment_Name{} - mi := &file_backuppb_Backup_proto_msgTypes[111] + mi := &file_backuppb_Backup_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9881,7 +10541,7 @@ func (x *ContactAttachment_Name) String() string { func (*ContactAttachment_Name) ProtoMessage() {} func (x *ContactAttachment_Name) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[111] + mi := &file_backuppb_Backup_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9950,7 +10610,7 @@ type ContactAttachment_Phone struct { func (x *ContactAttachment_Phone) Reset() { *x = ContactAttachment_Phone{} - mi := &file_backuppb_Backup_proto_msgTypes[112] + mi := &file_backuppb_Backup_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9962,7 +10622,7 @@ func (x *ContactAttachment_Phone) String() string { func (*ContactAttachment_Phone) ProtoMessage() {} func (x *ContactAttachment_Phone) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[112] + mi := &file_backuppb_Backup_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10010,7 +10670,7 @@ type ContactAttachment_Email struct { func (x *ContactAttachment_Email) Reset() { *x = ContactAttachment_Email{} - mi := &file_backuppb_Backup_proto_msgTypes[113] + mi := &file_backuppb_Backup_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10022,7 +10682,7 @@ func (x *ContactAttachment_Email) String() string { func (*ContactAttachment_Email) ProtoMessage() {} func (x *ContactAttachment_Email) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[113] + mi := &file_backuppb_Backup_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10076,7 +10736,7 @@ type ContactAttachment_PostalAddress struct { func (x *ContactAttachment_PostalAddress) Reset() { *x = ContactAttachment_PostalAddress{} - mi := &file_backuppb_Backup_proto_msgTypes[114] + mi := &file_backuppb_Backup_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10088,7 +10748,7 @@ func (x *ContactAttachment_PostalAddress) String() string { func (*ContactAttachment_PostalAddress) ProtoMessage() {} func (x *ContactAttachment_PostalAddress) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[114] + mi := &file_backuppb_Backup_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10203,7 +10863,7 @@ type FilePointer_LocatorInfo struct { func (x *FilePointer_LocatorInfo) Reset() { *x = FilePointer_LocatorInfo{} - mi := &file_backuppb_Backup_proto_msgTypes[115] + mi := &file_backuppb_Backup_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10215,7 +10875,7 @@ func (x *FilePointer_LocatorInfo) String() string { func (*FilePointer_LocatorInfo) ProtoMessage() {} func (x *FilePointer_LocatorInfo) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[115] + mi := &file_backuppb_Backup_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10335,7 +10995,7 @@ type Quote_QuotedAttachment struct { func (x *Quote_QuotedAttachment) Reset() { *x = Quote_QuotedAttachment{} - mi := &file_backuppb_Backup_proto_msgTypes[116] + mi := &file_backuppb_Backup_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10347,7 +11007,7 @@ func (x *Quote_QuotedAttachment) String() string { func (*Quote_QuotedAttachment) ProtoMessage() {} func (x *Quote_QuotedAttachment) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[116] + mi := &file_backuppb_Backup_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10394,7 +11054,7 @@ type Poll_PollOption struct { func (x *Poll_PollOption) Reset() { *x = Poll_PollOption{} - mi := &file_backuppb_Backup_proto_msgTypes[117] + mi := &file_backuppb_Backup_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10406,7 +11066,7 @@ func (x *Poll_PollOption) String() string { func (*Poll_PollOption) ProtoMessage() {} func (x *Poll_PollOption) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[117] + mi := &file_backuppb_Backup_proto_msgTypes[121] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10446,7 +11106,7 @@ type Poll_PollOption_PollVote struct { func (x *Poll_PollOption_PollVote) Reset() { *x = Poll_PollOption_PollVote{} - mi := &file_backuppb_Backup_proto_msgTypes[118] + mi := &file_backuppb_Backup_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10458,7 +11118,7 @@ func (x *Poll_PollOption_PollVote) String() string { func (*Poll_PollOption_PollVote) ProtoMessage() {} func (x *Poll_PollOption_PollVote) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[118] + mi := &file_backuppb_Backup_proto_msgTypes[122] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10535,7 +11195,7 @@ type GroupChangeChatUpdate_Update struct { func (x *GroupChangeChatUpdate_Update) Reset() { *x = GroupChangeChatUpdate_Update{} - mi := &file_backuppb_Backup_proto_msgTypes[119] + mi := &file_backuppb_Backup_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10547,7 +11207,7 @@ func (x *GroupChangeChatUpdate_Update) String() string { func (*GroupChangeChatUpdate_Update) ProtoMessage() {} func (x *GroupChangeChatUpdate_Update) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[119] + mi := &file_backuppb_Backup_proto_msgTypes[123] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11121,7 +11781,7 @@ type GroupInvitationRevokedUpdate_Invitee struct { func (x *GroupInvitationRevokedUpdate_Invitee) Reset() { *x = GroupInvitationRevokedUpdate_Invitee{} - mi := &file_backuppb_Backup_proto_msgTypes[120] + mi := &file_backuppb_Backup_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11133,7 +11793,7 @@ func (x *GroupInvitationRevokedUpdate_Invitee) String() string { func (*GroupInvitationRevokedUpdate_Invitee) ProtoMessage() {} func (x *GroupInvitationRevokedUpdate_Invitee) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[120] + mi := &file_backuppb_Backup_proto_msgTypes[124] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11181,7 +11841,7 @@ type ChatStyle_Gradient struct { func (x *ChatStyle_Gradient) Reset() { *x = ChatStyle_Gradient{} - mi := &file_backuppb_Backup_proto_msgTypes[121] + mi := &file_backuppb_Backup_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11193,7 +11853,7 @@ func (x *ChatStyle_Gradient) String() string { func (*ChatStyle_Gradient) ProtoMessage() {} func (x *ChatStyle_Gradient) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[121] + mi := &file_backuppb_Backup_proto_msgTypes[125] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11206,7 +11866,7 @@ func (x *ChatStyle_Gradient) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_Gradient.ProtoReflect.Descriptor instead. func (*ChatStyle_Gradient) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 0} } func (x *ChatStyle_Gradient) GetAngle() uint32 { @@ -11246,7 +11906,7 @@ type ChatStyle_CustomChatColor struct { func (x *ChatStyle_CustomChatColor) Reset() { *x = ChatStyle_CustomChatColor{} - mi := &file_backuppb_Backup_proto_msgTypes[122] + mi := &file_backuppb_Backup_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11258,7 +11918,7 @@ func (x *ChatStyle_CustomChatColor) String() string { func (*ChatStyle_CustomChatColor) ProtoMessage() {} func (x *ChatStyle_CustomChatColor) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[122] + mi := &file_backuppb_Backup_proto_msgTypes[126] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11271,7 +11931,7 @@ func (x *ChatStyle_CustomChatColor) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_CustomChatColor.ProtoReflect.Descriptor instead. func (*ChatStyle_CustomChatColor) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 1} } func (x *ChatStyle_CustomChatColor) GetId() uint64 { @@ -11330,7 +11990,7 @@ type ChatStyle_AutomaticBubbleColor struct { func (x *ChatStyle_AutomaticBubbleColor) Reset() { *x = ChatStyle_AutomaticBubbleColor{} - mi := &file_backuppb_Backup_proto_msgTypes[123] + mi := &file_backuppb_Backup_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11342,7 +12002,7 @@ func (x *ChatStyle_AutomaticBubbleColor) String() string { func (*ChatStyle_AutomaticBubbleColor) ProtoMessage() {} func (x *ChatStyle_AutomaticBubbleColor) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[123] + mi := &file_backuppb_Backup_proto_msgTypes[127] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11355,7 +12015,7 @@ func (x *ChatStyle_AutomaticBubbleColor) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_AutomaticBubbleColor.ProtoReflect.Descriptor instead. func (*ChatStyle_AutomaticBubbleColor) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79, 2} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 2} } var File_backuppb_Backup_proto protoreflect.FileDescriptor @@ -11382,7 +12042,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\n" + "chatFolder\x18\b \x01(\v2\x19.signal.backup.ChatFolderH\x00R\n" + "chatFolderB\x06\n" + - "\x04item\"\xdf\x13\n" + + "\x04item\"\xf9\"\n" + "\vAccountData\x12\x1e\n" + "\n" + "profileKey\x18\x01 \x01(\fR\n" + @@ -11398,7 +12058,11 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x0faccountSettings\x18\t \x01(\v2*.signal.backup.AccountData.AccountSettingsR\x0faccountSettings\x12b\n" + "\x15backupsSubscriberData\x18\n" + " \x01(\v2,.signal.backup.AccountData.IAPSubscriberDataR\x15backupsSubscriberData\x12\x16\n" + - "\x06svrPin\x18\v \x01(\tR\x06svrPin\x1a\xf6\x01\n" + + "\x06svrPin\x18\v \x01(\tR\x06svrPin\x12l\n" + + "\x17androidSpecificSettings\x18\f \x01(\v22.signal.backup.AccountData.AndroidSpecificSettingsR\x17androidSpecificSettings\x12\x18\n" + + "\abioText\x18\r \x01(\tR\abioText\x12\x1a\n" + + "\bbioEmoji\x18\x0e \x01(\tR\bbioEmoji\x125\n" + + "\x13keyTransparencyData\x18\x0f \x01(\fH\x01R\x13keyTransparencyData\x88\x01\x01\x1a\xf6\x01\n" + "\fUsernameLink\x12\x18\n" + "\aentropy\x18\x01 \x01(\fR\aentropy\x12\x1a\n" + "\bserverId\x18\x02 \x01(\fR\bserverId\x12C\n" + @@ -11414,8 +12078,17 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x06ORANGE\x10\x06\x12\b\n" + "\x04PINK\x10\a\x12\n" + "\n" + - "\x06PURPLE\x10\b\x1a\xa2\n" + - "\n" + + "\x06PURPLE\x10\b\x1a\xd7\x03\n" + + "\x14AutoDownloadSettings\x12Z\n" + + "\x06images\x18\x01 \x01(\x0e2B.signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOptionR\x06images\x12X\n" + + "\x05audio\x18\x02 \x01(\x0e2B.signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOptionR\x05audio\x12X\n" + + "\x05video\x18\x03 \x01(\x0e2B.signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOptionR\x05video\x12`\n" + + "\tdocuments\x18\x04 \x01(\x0e2B.signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOptionR\tdocuments\"M\n" + + "\x12AutoDownloadOption\x12\v\n" + + "\aUNKNOWN\x10\x00\x12\t\n" + + "\x05NEVER\x10\x01\x12\b\n" + + "\x04WIFI\x10\x02\x12\x15\n" + + "\x11WIFI_AND_CELLULAR\x10\x03\x1a\xc9\x0f\n" + "\x0fAccountSettings\x12\"\n" + "\freadReceipts\x18\x01 \x01(\bR\freadReceipts\x126\n" + "\x16sealedSenderIndicators\x18\x02 \x01(\bR\x16sealedSenderIndicators\x12*\n" + @@ -11440,9 +12113,19 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x17optimizeOnDeviceStorage\x18\x14 \x01(\bR\x17optimizeOnDeviceStorage\x12#\n" + "\n" + "backupTier\x18\x15 \x01(\x04H\x01R\n" + - "backupTier\x88\x01\x01B\x1b\n" + + "backupTier\x88\x01\x01\x12e\n" + + "\x17defaultSentMediaQuality\x18\x17 \x01(\x0e2+.signal.backup.AccountData.SentMediaQualityR\x17defaultSentMediaQuality\x12c\n" + + "\x14autoDownloadSettings\x18\x18 \x01(\v2/.signal.backup.AccountData.AutoDownloadSettingsR\x14autoDownloadSettings\x12?\n" + + "\x18screenLockTimeoutMinutes\x18\x1a \x01(\rH\x02R\x18screenLockTimeoutMinutes\x88\x01\x01\x12'\n" + + "\fpinReminders\x18\x1b \x01(\bH\x03R\fpinReminders\x88\x01\x01\x12?\n" + + "\bappTheme\x18\x1c \x01(\x0e2#.signal.backup.AccountData.AppThemeR\bappTheme\x12l\n" + + "\x17callsUseLessDataSetting\x18\x1d \x01(\x0e22.signal.backup.AccountData.CallsUseLessDataSettingR\x17callsUseLessDataSetting\x12@\n" + + "\x1ballowSealedSenderFromAnyone\x18\x1e \x01(\bR\x1ballowSealedSenderFromAnyone\x12D\n" + + "\x1dallowAutomaticKeyVerification\x18\x1f \x01(\bR\x1dallowAutomaticKeyVerificationB\x1b\n" + "\x19_storyViewReceiptsEnabledB\r\n" + - "\v_backupTier\x1a\x86\x01\n" + + "\v_backupTierB\x1b\n" + + "\x19_screenLockTimeoutMinutesB\x0f\n" + + "\r_pinRemindersJ\x04\b\x16\x10\x17J\x04\b\x19\x10\x1a\x1a\x86\x01\n" + "\x0eSubscriberData\x12\"\n" + "\fsubscriberId\x18\x01 \x01(\fR\fsubscriberId\x12\"\n" + "\fcurrencyCode\x18\x02 \x01(\tR\fcurrencyCode\x12,\n" + @@ -11451,13 +12134,38 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\fsubscriberId\x18\x01 \x01(\fR\fsubscriberId\x12&\n" + "\rpurchaseToken\x18\x02 \x01(\tH\x00R\rpurchaseToken\x126\n" + "\x15originalTransactionId\x18\x03 \x01(\x04H\x00R\x15originalTransactionIdB\x13\n" + - "\x11iapSubscriptionId\"@\n" + + "\x11iapSubscriptionId\x1a\xa9\x02\n" + + "\x17AndroidSpecificSettings\x12&\n" + + "\x0euseSystemEmoji\x18\x01 \x01(\bR\x0euseSystemEmoji\x12.\n" + + "\x12screenshotSecurity\x18\x02 \x01(\bR\x12screenshotSecurity\x12r\n" + + "\x11navigationBarSize\x18\x03 \x01(\x0e2D.signal.backup.AccountData.AndroidSpecificSettings.NavigationBarSizeR\x11navigationBarSize\"B\n" + + "\x11NavigationBarSize\x12\x14\n" + + "\x10UNKNOWN_BAR_SIZE\x10\x00\x12\n" + + "\n" + + "\x06NORMAL\x10\x01\x12\v\n" + + "\aCOMPACT\x10\x02\"@\n" + "\x16PhoneNumberSharingMode\x12\v\n" + "\aUNKNOWN\x10\x00\x12\r\n" + "\tEVERYBODY\x10\x01\x12\n" + "\n" + - "\x06NOBODY\x10\x02B\v\n" + - "\t_usernameJ\x04\b\b\x10\t\"\x84\x03\n" + + "\x06NOBODY\x10\x02\"?\n" + + "\x10SentMediaQuality\x12\x13\n" + + "\x0fUNKNOWN_QUALITY\x10\x00\x12\f\n" + + "\bSTANDARD\x10\x01\x12\b\n" + + "\x04HIGH\x10\x02\"B\n" + + "\bAppTheme\x12\x15\n" + + "\x11UNKNOWN_APP_THEME\x10\x00\x12\n" + + "\n" + + "\x06SYSTEM\x10\x01\x12\t\n" + + "\x05LIGHT\x10\x02\x12\b\n" + + "\x04DARK\x10\x03\"s\n" + + "\x17CallsUseLessDataSetting\x12\x1d\n" + + "\x19UNKNOWN_CALL_DATA_SETTING\x10\x00\x12\t\n" + + "\x05NEVER\x10\x01\x12\x14\n" + + "\x10MOBILE_DATA_ONLY\x10\x02\x12\x18\n" + + "\x14WIFI_AND_MOBILE_DATA\x10\x03B\v\n" + + "\t_usernameB\x16\n" + + "\x14_keyTransparencyDataJ\x04\b\b\x10\t\"\x84\x03\n" + "\tRecipient\x12\x0e\n" + "\x02id\x18\x01 \x01(\x04R\x02id\x122\n" + "\acontact\x18\x02 \x01(\v2\x16.signal.backup.ContactH\x00R\acontact\x12,\n" + @@ -11466,8 +12174,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x04self\x18\x05 \x01(\v2\x13.signal.backup.SelfH\x00R\x04self\x12A\n" + "\freleaseNotes\x18\x06 \x01(\v2\x1b.signal.backup.ReleaseNotesH\x00R\freleaseNotes\x125\n" + "\bcallLink\x18\a \x01(\v2\x17.signal.backup.CallLinkH\x00R\bcallLinkB\r\n" + - "\vdestination\"\xcb\n" + - "\n" + + "\vdestination\"\x9a\v\n" + "\aContact\x12\x15\n" + "\x03aci\x18\x01 \x01(\fH\x01R\x03aci\x88\x01\x01\x12\x15\n" + "\x03pni\x18\x02 \x01(\fH\x02R\x03pni\x88\x01\x01\x12\x1f\n" + @@ -11496,7 +12203,9 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x0fsystemGivenName\x18\x12 \x01(\tR\x0fsystemGivenName\x12*\n" + "\x10systemFamilyName\x18\x13 \x01(\tR\x10systemFamilyName\x12&\n" + "\x0esystemNickname\x18\x14 \x01(\tR\x0esystemNickname\x12A\n" + - "\vavatarColor\x18\x15 \x01(\x0e2\x1a.signal.backup.AvatarColorH\tR\vavatarColor\x88\x01\x01\x1a\f\n" + + "\vavatarColor\x18\x15 \x01(\x0e2\x1a.signal.backup.AvatarColorH\tR\vavatarColor\x88\x01\x01\x125\n" + + "\x13keyTransparencyData\x18\x16 \x01(\fH\n" + + "R\x13keyTransparencyData\x88\x01\x01\x1a\f\n" + "\n" + "Registered\x1aE\n" + "\rNotRegistered\x124\n" + @@ -11524,7 +12233,8 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x11_profileGivenNameB\x14\n" + "\x12_profileFamilyNameB\x0e\n" + "\f_identityKeyB\x0e\n" + - "\f_avatarColor\"\x8f\x12\n" + + "\f_avatarColorB\x16\n" + + "\x14_keyTransparencyData\"\x8f\x12\n" + "\x05Group\x12\x1c\n" + "\tmasterKey\x18\x01 \x01(\fR\tmasterKey\x12 \n" + "\vwhitelisted\x18\x02 \x01(\bR\vwhitelisted\x12\x1c\n" + @@ -11644,7 +12354,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\tONLY_WITH\x10\x01\x12\x0e\n" + "\n" + "ALL_EXCEPT\x10\x02\x12\a\n" + - "\x03ALL\x10\x03\"\xf3\f\n" + + "\x03ALL\x10\x03\"\xe5\x0e\n" + "\bChatItem\x12\x16\n" + "\x06chatId\x18\x01 \x01(\x04R\x06chatId\x12\x1a\n" + "\bauthorId\x18\x02 \x01(\x04R\bauthorId\x12\x1a\n" + @@ -11666,7 +12376,10 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\tgiftBadge\x18\x11 \x01(\v2\x18.signal.backup.GiftBadgeH\x01R\tgiftBadge\x12J\n" + "\x0fviewOnceMessage\x18\x12 \x01(\v2\x1e.signal.backup.ViewOnceMessageH\x01R\x0fviewOnceMessage\x12b\n" + "\x17directStoryReplyMessage\x18\x13 \x01(\v2&.signal.backup.DirectStoryReplyMessageH\x01R\x17directStoryReplyMessage\x12)\n" + - "\x04poll\x18\x14 \x01(\v2\x13.signal.backup.PollH\x01R\x04poll\x1a\xb4\x01\n" + + "\x04poll\x18\x14 \x01(\v2\x13.signal.backup.PollH\x01R\x04poll\x12B\n" + + "\n" + + "pinDetails\x18\x15 \x01(\v2\".signal.backup.ChatItem.PinDetailsR\n" + + "pinDetails\x1a\xb4\x01\n" + "\x16IncomingMessageDetails\x12\"\n" + "\fdateReceived\x18\x01 \x01(\x04R\fdateReceived\x12+\n" + "\x0edateServerSent\x18\x02 \x01(\x04H\x00R\x0edateServerSent\x88\x01\x01\x12\x12\n" + @@ -11678,7 +12391,13 @@ const file_backuppb_Backup_proto_rawDesc = "" + "sendStatus\x18\x01 \x03(\v2\x19.signal.backup.SendStatusR\n" + "sendStatus\x12\"\n" + "\fdateReceived\x18\x02 \x01(\x04R\fdateReceived\x1a\x1d\n" + - "\x1bDirectionlessMessageDetailsB\x14\n" + + "\x1bDirectionlessMessageDetails\x1a\xab\x01\n" + + "\n" + + "PinDetails\x12,\n" + + "\x11pinnedAtTimestamp\x18\x01 \x01(\x04R\x11pinnedAtTimestamp\x126\n" + + "\x15pinExpiresAtTimestamp\x18\x02 \x01(\x04H\x00R\x15pinExpiresAtTimestamp\x12*\n" + + "\x0fpinNeverExpires\x18\x03 \x01(\bH\x00R\x0fpinNeverExpiresB\v\n" + + "\tpinExpiryB\x14\n" + "\x12directionalDetailsB\x06\n" + "\x04itemB\x12\n" + "\x10_expireStartDateB\x0e\n" + @@ -11974,19 +12693,20 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x05emoji\x18\x01 \x01(\tR\x05emoji\x12\x1a\n" + "\bauthorId\x18\x02 \x01(\x04R\bauthorId\x12$\n" + "\rsentTimestamp\x18\x03 \x01(\x04R\rsentTimestamp\x12\x1c\n" + - "\tsortOrder\x18\x04 \x01(\x04R\tsortOrder\"\xc8\x02\n" + + "\tsortOrder\x18\x04 \x01(\x04R\tsortOrder\"\xff\x02\n" + "\x04Poll\x12\x1a\n" + "\bquestion\x18\x01 \x01(\tR\bquestion\x12$\n" + "\rallowMultiple\x18\x02 \x01(\bR\rallowMultiple\x128\n" + "\aoptions\x18\x03 \x03(\v2\x1e.signal.backup.Poll.PollOptionR\aoptions\x12\x1a\n" + - "\bhasEnded\x18\x04 \x01(\bR\bhasEnded\x1a\xa7\x01\n" + + "\bhasEnded\x18\x04 \x01(\bR\bhasEnded\x125\n" + + "\treactions\x18\x05 \x03(\v2\x17.signal.backup.ReactionR\treactions\x1a\xa7\x01\n" + "\n" + "PollOption\x12\x16\n" + "\x06option\x18\x01 \x01(\tR\x06option\x12=\n" + "\x05votes\x18\x02 \x03(\v2'.signal.backup.Poll.PollOption.PollVoteR\x05votes\x1aB\n" + "\bPollVote\x12\x18\n" + "\avoterId\x18\x01 \x01(\x04R\avoterId\x12\x1c\n" + - "\tvoteCount\x18\x02 \x01(\rR\tvoteCount\"\xb4\x06\n" + + "\tvoteCount\x18\x02 \x01(\rR\tvoteCount\"\xf7\x06\n" + "\x11ChatUpdateMessage\x12E\n" + "\fsimpleUpdate\x18\x01 \x01(\v2\x1f.signal.backup.SimpleChatUpdateH\x00R\fsimpleUpdate\x12H\n" + "\vgroupChange\x18\x02 \x01(\v2$.signal.backup.GroupChangeChatUpdateH\x00R\vgroupChange\x12`\n" + @@ -11998,7 +12718,10 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\tgroupCall\x18\b \x01(\v2\x18.signal.backup.GroupCallH\x00R\tgroupCall\x12]\n" + "\x14learnedProfileChange\x18\t \x01(\v2'.signal.backup.LearnedProfileChatUpdateH\x00R\x14learnedProfileChange\x12J\n" + "\rpollTerminate\x18\n" + - " \x01(\v2\".signal.backup.PollTerminateUpdateH\x00R\rpollTerminateB\b\n" + + " \x01(\v2\".signal.backup.PollTerminateUpdateH\x00R\rpollTerminate\x12A\n" + + "\n" + + "pinMessage\x18\v \x01(\v2\x1f.signal.backup.PinMessageUpdateH\x00R\n" + + "pinMessageB\b\n" + "\x06update\"\x9d\x04\n" + "\x0eIndividualCall\x12\x1b\n" + "\x06callId\x18\x01 \x01(\x04H\x00R\x06callId\x88\x01\x01\x126\n" + @@ -12306,7 +13029,10 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\v_updaterAci\"c\n" + "\x13PollTerminateUpdate\x120\n" + "\x13targetSentTimestamp\x18\x01 \x01(\x04R\x13targetSentTimestamp\x12\x1a\n" + - "\bquestion\x18\x02 \x01(\tR\bquestion\"?\n" + + "\bquestion\x18\x02 \x01(\tR\bquestion\"`\n" + + "\x10PinMessageUpdate\x120\n" + + "\x13targetSentTimestamp\x18\x01 \x01(\x04R\x13targetSentTimestamp\x12\x1a\n" + + "\bauthorId\x18\x02 \x01(\x04R\bauthorId\"?\n" + "\vStickerPack\x12\x16\n" + "\x06packId\x18\x01 \x01(\fR\x06packId\x12\x18\n" + "\apackKey\x18\x02 \x01(\fR\apackKey\"\x80\r\n" + @@ -12465,348 +13191,370 @@ func file_backuppb_Backup_proto_rawDescGZIP() []byte { return file_backuppb_Backup_proto_rawDescData } -var file_backuppb_Backup_proto_enumTypes = make([]protoimpl.EnumInfo, 31) -var file_backuppb_Backup_proto_msgTypes = make([]protoimpl.MessageInfo, 124) +var file_backuppb_Backup_proto_enumTypes = make([]protoimpl.EnumInfo, 36) +var file_backuppb_Backup_proto_msgTypes = make([]protoimpl.MessageInfo, 128) var file_backuppb_Backup_proto_goTypes = []any{ - (AvatarColor)(0), // 0: signal.backup.AvatarColor - (GroupV2AccessLevel)(0), // 1: signal.backup.GroupV2AccessLevel - (AccountData_PhoneNumberSharingMode)(0), // 2: signal.backup.AccountData.PhoneNumberSharingMode - (AccountData_UsernameLink_Color)(0), // 3: signal.backup.AccountData.UsernameLink.Color - (Contact_IdentityState)(0), // 4: signal.backup.Contact.IdentityState - (Contact_Visibility)(0), // 5: signal.backup.Contact.Visibility - (Group_StorySendMode)(0), // 6: signal.backup.Group.StorySendMode - (Group_Member_Role)(0), // 7: signal.backup.Group.Member.Role - (Group_AccessControl_AccessRequired)(0), // 8: signal.backup.Group.AccessControl.AccessRequired - (CallLink_Restrictions)(0), // 9: signal.backup.CallLink.Restrictions - (AdHocCall_State)(0), // 10: signal.backup.AdHocCall.State - (DistributionList_PrivacyMode)(0), // 11: signal.backup.DistributionList.PrivacyMode - (SendStatus_Failed_FailureReason)(0), // 12: signal.backup.SendStatus.Failed.FailureReason - (PaymentNotification_TransactionDetails_FailedTransaction_FailureReason)(0), // 13: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason - (PaymentNotification_TransactionDetails_Transaction_Status)(0), // 14: signal.backup.PaymentNotification.TransactionDetails.Transaction.Status - (GiftBadge_State)(0), // 15: signal.backup.GiftBadge.State - (ContactAttachment_Phone_Type)(0), // 16: signal.backup.ContactAttachment.Phone.Type - (ContactAttachment_Email_Type)(0), // 17: signal.backup.ContactAttachment.Email.Type - (ContactAttachment_PostalAddress_Type)(0), // 18: signal.backup.ContactAttachment.PostalAddress.Type - (MessageAttachment_Flag)(0), // 19: signal.backup.MessageAttachment.Flag - (Quote_Type)(0), // 20: signal.backup.Quote.Type - (BodyRange_Style)(0), // 21: signal.backup.BodyRange.Style - (IndividualCall_Type)(0), // 22: signal.backup.IndividualCall.Type - (IndividualCall_Direction)(0), // 23: signal.backup.IndividualCall.Direction - (IndividualCall_State)(0), // 24: signal.backup.IndividualCall.State - (GroupCall_State)(0), // 25: signal.backup.GroupCall.State - (SimpleChatUpdate_Type)(0), // 26: signal.backup.SimpleChatUpdate.Type - (ChatStyle_WallpaperPreset)(0), // 27: signal.backup.ChatStyle.WallpaperPreset - (ChatStyle_BubbleColorPreset)(0), // 28: signal.backup.ChatStyle.BubbleColorPreset - (NotificationProfile_DayOfWeek)(0), // 29: signal.backup.NotificationProfile.DayOfWeek - (ChatFolder_FolderType)(0), // 30: signal.backup.ChatFolder.FolderType - (*BackupInfo)(nil), // 31: signal.backup.BackupInfo - (*Frame)(nil), // 32: signal.backup.Frame - (*AccountData)(nil), // 33: signal.backup.AccountData - (*Recipient)(nil), // 34: signal.backup.Recipient - (*Contact)(nil), // 35: signal.backup.Contact - (*Group)(nil), // 36: signal.backup.Group - (*Self)(nil), // 37: signal.backup.Self - (*ReleaseNotes)(nil), // 38: signal.backup.ReleaseNotes - (*Chat)(nil), // 39: signal.backup.Chat - (*CallLink)(nil), // 40: signal.backup.CallLink - (*AdHocCall)(nil), // 41: signal.backup.AdHocCall - (*DistributionListItem)(nil), // 42: signal.backup.DistributionListItem - (*DistributionList)(nil), // 43: signal.backup.DistributionList - (*ChatItem)(nil), // 44: signal.backup.ChatItem - (*SendStatus)(nil), // 45: signal.backup.SendStatus - (*Text)(nil), // 46: signal.backup.Text - (*StandardMessage)(nil), // 47: signal.backup.StandardMessage - (*ContactMessage)(nil), // 48: signal.backup.ContactMessage - (*DirectStoryReplyMessage)(nil), // 49: signal.backup.DirectStoryReplyMessage - (*PaymentNotification)(nil), // 50: signal.backup.PaymentNotification - (*GiftBadge)(nil), // 51: signal.backup.GiftBadge - (*ViewOnceMessage)(nil), // 52: signal.backup.ViewOnceMessage - (*ContactAttachment)(nil), // 53: signal.backup.ContactAttachment - (*StickerMessage)(nil), // 54: signal.backup.StickerMessage - (*RemoteDeletedMessage)(nil), // 55: signal.backup.RemoteDeletedMessage - (*Sticker)(nil), // 56: signal.backup.Sticker - (*LinkPreview)(nil), // 57: signal.backup.LinkPreview - (*MessageAttachment)(nil), // 58: signal.backup.MessageAttachment - (*FilePointer)(nil), // 59: signal.backup.FilePointer - (*Quote)(nil), // 60: signal.backup.Quote - (*BodyRange)(nil), // 61: signal.backup.BodyRange - (*Reaction)(nil), // 62: signal.backup.Reaction - (*Poll)(nil), // 63: signal.backup.Poll - (*ChatUpdateMessage)(nil), // 64: signal.backup.ChatUpdateMessage - (*IndividualCall)(nil), // 65: signal.backup.IndividualCall - (*GroupCall)(nil), // 66: signal.backup.GroupCall - (*SimpleChatUpdate)(nil), // 67: signal.backup.SimpleChatUpdate - (*ExpirationTimerChatUpdate)(nil), // 68: signal.backup.ExpirationTimerChatUpdate - (*ProfileChangeChatUpdate)(nil), // 69: signal.backup.ProfileChangeChatUpdate - (*LearnedProfileChatUpdate)(nil), // 70: signal.backup.LearnedProfileChatUpdate - (*ThreadMergeChatUpdate)(nil), // 71: signal.backup.ThreadMergeChatUpdate - (*SessionSwitchoverChatUpdate)(nil), // 72: signal.backup.SessionSwitchoverChatUpdate - (*GroupChangeChatUpdate)(nil), // 73: signal.backup.GroupChangeChatUpdate - (*GenericGroupUpdate)(nil), // 74: signal.backup.GenericGroupUpdate - (*GroupCreationUpdate)(nil), // 75: signal.backup.GroupCreationUpdate - (*GroupNameUpdate)(nil), // 76: signal.backup.GroupNameUpdate - (*GroupAvatarUpdate)(nil), // 77: signal.backup.GroupAvatarUpdate - (*GroupDescriptionUpdate)(nil), // 78: signal.backup.GroupDescriptionUpdate - (*GroupMembershipAccessLevelChangeUpdate)(nil), // 79: signal.backup.GroupMembershipAccessLevelChangeUpdate - (*GroupAttributesAccessLevelChangeUpdate)(nil), // 80: signal.backup.GroupAttributesAccessLevelChangeUpdate - (*GroupAnnouncementOnlyChangeUpdate)(nil), // 81: signal.backup.GroupAnnouncementOnlyChangeUpdate - (*GroupAdminStatusUpdate)(nil), // 82: signal.backup.GroupAdminStatusUpdate - (*GroupMemberLeftUpdate)(nil), // 83: signal.backup.GroupMemberLeftUpdate - (*GroupMemberRemovedUpdate)(nil), // 84: signal.backup.GroupMemberRemovedUpdate - (*SelfInvitedToGroupUpdate)(nil), // 85: signal.backup.SelfInvitedToGroupUpdate - (*SelfInvitedOtherUserToGroupUpdate)(nil), // 86: signal.backup.SelfInvitedOtherUserToGroupUpdate - (*GroupUnknownInviteeUpdate)(nil), // 87: signal.backup.GroupUnknownInviteeUpdate - (*GroupInvitationAcceptedUpdate)(nil), // 88: signal.backup.GroupInvitationAcceptedUpdate - (*GroupInvitationDeclinedUpdate)(nil), // 89: signal.backup.GroupInvitationDeclinedUpdate - (*GroupMemberJoinedUpdate)(nil), // 90: signal.backup.GroupMemberJoinedUpdate - (*GroupMemberAddedUpdate)(nil), // 91: signal.backup.GroupMemberAddedUpdate - (*GroupSelfInvitationRevokedUpdate)(nil), // 92: signal.backup.GroupSelfInvitationRevokedUpdate - (*GroupInvitationRevokedUpdate)(nil), // 93: signal.backup.GroupInvitationRevokedUpdate - (*GroupJoinRequestUpdate)(nil), // 94: signal.backup.GroupJoinRequestUpdate - (*GroupJoinRequestApprovalUpdate)(nil), // 95: signal.backup.GroupJoinRequestApprovalUpdate - (*GroupJoinRequestCanceledUpdate)(nil), // 96: signal.backup.GroupJoinRequestCanceledUpdate - (*GroupSequenceOfRequestsAndCancelsUpdate)(nil), // 97: signal.backup.GroupSequenceOfRequestsAndCancelsUpdate - (*GroupInviteLinkResetUpdate)(nil), // 98: signal.backup.GroupInviteLinkResetUpdate - (*GroupInviteLinkEnabledUpdate)(nil), // 99: signal.backup.GroupInviteLinkEnabledUpdate - (*GroupInviteLinkAdminApprovalUpdate)(nil), // 100: signal.backup.GroupInviteLinkAdminApprovalUpdate - (*GroupInviteLinkDisabledUpdate)(nil), // 101: signal.backup.GroupInviteLinkDisabledUpdate - (*GroupMemberJoinedByLinkUpdate)(nil), // 102: signal.backup.GroupMemberJoinedByLinkUpdate - (*GroupV2MigrationUpdate)(nil), // 103: signal.backup.GroupV2MigrationUpdate - (*GroupV2MigrationSelfInvitedUpdate)(nil), // 104: signal.backup.GroupV2MigrationSelfInvitedUpdate - (*GroupV2MigrationInvitedMembersUpdate)(nil), // 105: signal.backup.GroupV2MigrationInvitedMembersUpdate - (*GroupV2MigrationDroppedMembersUpdate)(nil), // 106: signal.backup.GroupV2MigrationDroppedMembersUpdate - (*GroupExpirationTimerUpdate)(nil), // 107: signal.backup.GroupExpirationTimerUpdate - (*PollTerminateUpdate)(nil), // 108: signal.backup.PollTerminateUpdate - (*StickerPack)(nil), // 109: signal.backup.StickerPack - (*ChatStyle)(nil), // 110: signal.backup.ChatStyle - (*NotificationProfile)(nil), // 111: signal.backup.NotificationProfile - (*ChatFolder)(nil), // 112: signal.backup.ChatFolder - (*AccountData_UsernameLink)(nil), // 113: signal.backup.AccountData.UsernameLink - (*AccountData_AccountSettings)(nil), // 114: signal.backup.AccountData.AccountSettings - (*AccountData_SubscriberData)(nil), // 115: signal.backup.AccountData.SubscriberData - (*AccountData_IAPSubscriberData)(nil), // 116: signal.backup.AccountData.IAPSubscriberData - (*Contact_Registered)(nil), // 117: signal.backup.Contact.Registered - (*Contact_NotRegistered)(nil), // 118: signal.backup.Contact.NotRegistered - (*Contact_Name)(nil), // 119: signal.backup.Contact.Name - (*Group_GroupSnapshot)(nil), // 120: signal.backup.Group.GroupSnapshot - (*Group_GroupAttributeBlob)(nil), // 121: signal.backup.Group.GroupAttributeBlob - (*Group_Member)(nil), // 122: signal.backup.Group.Member - (*Group_MemberPendingProfileKey)(nil), // 123: signal.backup.Group.MemberPendingProfileKey - (*Group_MemberPendingAdminApproval)(nil), // 124: signal.backup.Group.MemberPendingAdminApproval - (*Group_MemberBanned)(nil), // 125: signal.backup.Group.MemberBanned - (*Group_AccessControl)(nil), // 126: signal.backup.Group.AccessControl - (*ChatItem_IncomingMessageDetails)(nil), // 127: signal.backup.ChatItem.IncomingMessageDetails - (*ChatItem_OutgoingMessageDetails)(nil), // 128: signal.backup.ChatItem.OutgoingMessageDetails - (*ChatItem_DirectionlessMessageDetails)(nil), // 129: signal.backup.ChatItem.DirectionlessMessageDetails - (*SendStatus_Pending)(nil), // 130: signal.backup.SendStatus.Pending - (*SendStatus_Sent)(nil), // 131: signal.backup.SendStatus.Sent - (*SendStatus_Delivered)(nil), // 132: signal.backup.SendStatus.Delivered - (*SendStatus_Read)(nil), // 133: signal.backup.SendStatus.Read - (*SendStatus_Viewed)(nil), // 134: signal.backup.SendStatus.Viewed - (*SendStatus_Skipped)(nil), // 135: signal.backup.SendStatus.Skipped - (*SendStatus_Failed)(nil), // 136: signal.backup.SendStatus.Failed - (*DirectStoryReplyMessage_TextReply)(nil), // 137: signal.backup.DirectStoryReplyMessage.TextReply - (*PaymentNotification_TransactionDetails)(nil), // 138: signal.backup.PaymentNotification.TransactionDetails - (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification)(nil), // 139: signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification - (*PaymentNotification_TransactionDetails_FailedTransaction)(nil), // 140: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction - (*PaymentNotification_TransactionDetails_Transaction)(nil), // 141: signal.backup.PaymentNotification.TransactionDetails.Transaction - (*ContactAttachment_Name)(nil), // 142: signal.backup.ContactAttachment.Name - (*ContactAttachment_Phone)(nil), // 143: signal.backup.ContactAttachment.Phone - (*ContactAttachment_Email)(nil), // 144: signal.backup.ContactAttachment.Email - (*ContactAttachment_PostalAddress)(nil), // 145: signal.backup.ContactAttachment.PostalAddress - (*FilePointer_LocatorInfo)(nil), // 146: signal.backup.FilePointer.LocatorInfo - (*Quote_QuotedAttachment)(nil), // 147: signal.backup.Quote.QuotedAttachment - (*Poll_PollOption)(nil), // 148: signal.backup.Poll.PollOption - (*Poll_PollOption_PollVote)(nil), // 149: signal.backup.Poll.PollOption.PollVote - (*GroupChangeChatUpdate_Update)(nil), // 150: signal.backup.GroupChangeChatUpdate.Update - (*GroupInvitationRevokedUpdate_Invitee)(nil), // 151: signal.backup.GroupInvitationRevokedUpdate.Invitee - (*ChatStyle_Gradient)(nil), // 152: signal.backup.ChatStyle.Gradient - (*ChatStyle_CustomChatColor)(nil), // 153: signal.backup.ChatStyle.CustomChatColor - (*ChatStyle_AutomaticBubbleColor)(nil), // 154: signal.backup.ChatStyle.AutomaticBubbleColor + (AvatarColor)(0), // 0: signal.backup.AvatarColor + (GroupV2AccessLevel)(0), // 1: signal.backup.GroupV2AccessLevel + (AccountData_PhoneNumberSharingMode)(0), // 2: signal.backup.AccountData.PhoneNumberSharingMode + (AccountData_SentMediaQuality)(0), // 3: signal.backup.AccountData.SentMediaQuality + (AccountData_AppTheme)(0), // 4: signal.backup.AccountData.AppTheme + (AccountData_CallsUseLessDataSetting)(0), // 5: signal.backup.AccountData.CallsUseLessDataSetting + (AccountData_UsernameLink_Color)(0), // 6: signal.backup.AccountData.UsernameLink.Color + (AccountData_AutoDownloadSettings_AutoDownloadOption)(0), // 7: signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + (AccountData_AndroidSpecificSettings_NavigationBarSize)(0), // 8: signal.backup.AccountData.AndroidSpecificSettings.NavigationBarSize + (Contact_IdentityState)(0), // 9: signal.backup.Contact.IdentityState + (Contact_Visibility)(0), // 10: signal.backup.Contact.Visibility + (Group_StorySendMode)(0), // 11: signal.backup.Group.StorySendMode + (Group_Member_Role)(0), // 12: signal.backup.Group.Member.Role + (Group_AccessControl_AccessRequired)(0), // 13: signal.backup.Group.AccessControl.AccessRequired + (CallLink_Restrictions)(0), // 14: signal.backup.CallLink.Restrictions + (AdHocCall_State)(0), // 15: signal.backup.AdHocCall.State + (DistributionList_PrivacyMode)(0), // 16: signal.backup.DistributionList.PrivacyMode + (SendStatus_Failed_FailureReason)(0), // 17: signal.backup.SendStatus.Failed.FailureReason + (PaymentNotification_TransactionDetails_FailedTransaction_FailureReason)(0), // 18: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason + (PaymentNotification_TransactionDetails_Transaction_Status)(0), // 19: signal.backup.PaymentNotification.TransactionDetails.Transaction.Status + (GiftBadge_State)(0), // 20: signal.backup.GiftBadge.State + (ContactAttachment_Phone_Type)(0), // 21: signal.backup.ContactAttachment.Phone.Type + (ContactAttachment_Email_Type)(0), // 22: signal.backup.ContactAttachment.Email.Type + (ContactAttachment_PostalAddress_Type)(0), // 23: signal.backup.ContactAttachment.PostalAddress.Type + (MessageAttachment_Flag)(0), // 24: signal.backup.MessageAttachment.Flag + (Quote_Type)(0), // 25: signal.backup.Quote.Type + (BodyRange_Style)(0), // 26: signal.backup.BodyRange.Style + (IndividualCall_Type)(0), // 27: signal.backup.IndividualCall.Type + (IndividualCall_Direction)(0), // 28: signal.backup.IndividualCall.Direction + (IndividualCall_State)(0), // 29: signal.backup.IndividualCall.State + (GroupCall_State)(0), // 30: signal.backup.GroupCall.State + (SimpleChatUpdate_Type)(0), // 31: signal.backup.SimpleChatUpdate.Type + (ChatStyle_WallpaperPreset)(0), // 32: signal.backup.ChatStyle.WallpaperPreset + (ChatStyle_BubbleColorPreset)(0), // 33: signal.backup.ChatStyle.BubbleColorPreset + (NotificationProfile_DayOfWeek)(0), // 34: signal.backup.NotificationProfile.DayOfWeek + (ChatFolder_FolderType)(0), // 35: signal.backup.ChatFolder.FolderType + (*BackupInfo)(nil), // 36: signal.backup.BackupInfo + (*Frame)(nil), // 37: signal.backup.Frame + (*AccountData)(nil), // 38: signal.backup.AccountData + (*Recipient)(nil), // 39: signal.backup.Recipient + (*Contact)(nil), // 40: signal.backup.Contact + (*Group)(nil), // 41: signal.backup.Group + (*Self)(nil), // 42: signal.backup.Self + (*ReleaseNotes)(nil), // 43: signal.backup.ReleaseNotes + (*Chat)(nil), // 44: signal.backup.Chat + (*CallLink)(nil), // 45: signal.backup.CallLink + (*AdHocCall)(nil), // 46: signal.backup.AdHocCall + (*DistributionListItem)(nil), // 47: signal.backup.DistributionListItem + (*DistributionList)(nil), // 48: signal.backup.DistributionList + (*ChatItem)(nil), // 49: signal.backup.ChatItem + (*SendStatus)(nil), // 50: signal.backup.SendStatus + (*Text)(nil), // 51: signal.backup.Text + (*StandardMessage)(nil), // 52: signal.backup.StandardMessage + (*ContactMessage)(nil), // 53: signal.backup.ContactMessage + (*DirectStoryReplyMessage)(nil), // 54: signal.backup.DirectStoryReplyMessage + (*PaymentNotification)(nil), // 55: signal.backup.PaymentNotification + (*GiftBadge)(nil), // 56: signal.backup.GiftBadge + (*ViewOnceMessage)(nil), // 57: signal.backup.ViewOnceMessage + (*ContactAttachment)(nil), // 58: signal.backup.ContactAttachment + (*StickerMessage)(nil), // 59: signal.backup.StickerMessage + (*RemoteDeletedMessage)(nil), // 60: signal.backup.RemoteDeletedMessage + (*Sticker)(nil), // 61: signal.backup.Sticker + (*LinkPreview)(nil), // 62: signal.backup.LinkPreview + (*MessageAttachment)(nil), // 63: signal.backup.MessageAttachment + (*FilePointer)(nil), // 64: signal.backup.FilePointer + (*Quote)(nil), // 65: signal.backup.Quote + (*BodyRange)(nil), // 66: signal.backup.BodyRange + (*Reaction)(nil), // 67: signal.backup.Reaction + (*Poll)(nil), // 68: signal.backup.Poll + (*ChatUpdateMessage)(nil), // 69: signal.backup.ChatUpdateMessage + (*IndividualCall)(nil), // 70: signal.backup.IndividualCall + (*GroupCall)(nil), // 71: signal.backup.GroupCall + (*SimpleChatUpdate)(nil), // 72: signal.backup.SimpleChatUpdate + (*ExpirationTimerChatUpdate)(nil), // 73: signal.backup.ExpirationTimerChatUpdate + (*ProfileChangeChatUpdate)(nil), // 74: signal.backup.ProfileChangeChatUpdate + (*LearnedProfileChatUpdate)(nil), // 75: signal.backup.LearnedProfileChatUpdate + (*ThreadMergeChatUpdate)(nil), // 76: signal.backup.ThreadMergeChatUpdate + (*SessionSwitchoverChatUpdate)(nil), // 77: signal.backup.SessionSwitchoverChatUpdate + (*GroupChangeChatUpdate)(nil), // 78: signal.backup.GroupChangeChatUpdate + (*GenericGroupUpdate)(nil), // 79: signal.backup.GenericGroupUpdate + (*GroupCreationUpdate)(nil), // 80: signal.backup.GroupCreationUpdate + (*GroupNameUpdate)(nil), // 81: signal.backup.GroupNameUpdate + (*GroupAvatarUpdate)(nil), // 82: signal.backup.GroupAvatarUpdate + (*GroupDescriptionUpdate)(nil), // 83: signal.backup.GroupDescriptionUpdate + (*GroupMembershipAccessLevelChangeUpdate)(nil), // 84: signal.backup.GroupMembershipAccessLevelChangeUpdate + (*GroupAttributesAccessLevelChangeUpdate)(nil), // 85: signal.backup.GroupAttributesAccessLevelChangeUpdate + (*GroupAnnouncementOnlyChangeUpdate)(nil), // 86: signal.backup.GroupAnnouncementOnlyChangeUpdate + (*GroupAdminStatusUpdate)(nil), // 87: signal.backup.GroupAdminStatusUpdate + (*GroupMemberLeftUpdate)(nil), // 88: signal.backup.GroupMemberLeftUpdate + (*GroupMemberRemovedUpdate)(nil), // 89: signal.backup.GroupMemberRemovedUpdate + (*SelfInvitedToGroupUpdate)(nil), // 90: signal.backup.SelfInvitedToGroupUpdate + (*SelfInvitedOtherUserToGroupUpdate)(nil), // 91: signal.backup.SelfInvitedOtherUserToGroupUpdate + (*GroupUnknownInviteeUpdate)(nil), // 92: signal.backup.GroupUnknownInviteeUpdate + (*GroupInvitationAcceptedUpdate)(nil), // 93: signal.backup.GroupInvitationAcceptedUpdate + (*GroupInvitationDeclinedUpdate)(nil), // 94: signal.backup.GroupInvitationDeclinedUpdate + (*GroupMemberJoinedUpdate)(nil), // 95: signal.backup.GroupMemberJoinedUpdate + (*GroupMemberAddedUpdate)(nil), // 96: signal.backup.GroupMemberAddedUpdate + (*GroupSelfInvitationRevokedUpdate)(nil), // 97: signal.backup.GroupSelfInvitationRevokedUpdate + (*GroupInvitationRevokedUpdate)(nil), // 98: signal.backup.GroupInvitationRevokedUpdate + (*GroupJoinRequestUpdate)(nil), // 99: signal.backup.GroupJoinRequestUpdate + (*GroupJoinRequestApprovalUpdate)(nil), // 100: signal.backup.GroupJoinRequestApprovalUpdate + (*GroupJoinRequestCanceledUpdate)(nil), // 101: signal.backup.GroupJoinRequestCanceledUpdate + (*GroupSequenceOfRequestsAndCancelsUpdate)(nil), // 102: signal.backup.GroupSequenceOfRequestsAndCancelsUpdate + (*GroupInviteLinkResetUpdate)(nil), // 103: signal.backup.GroupInviteLinkResetUpdate + (*GroupInviteLinkEnabledUpdate)(nil), // 104: signal.backup.GroupInviteLinkEnabledUpdate + (*GroupInviteLinkAdminApprovalUpdate)(nil), // 105: signal.backup.GroupInviteLinkAdminApprovalUpdate + (*GroupInviteLinkDisabledUpdate)(nil), // 106: signal.backup.GroupInviteLinkDisabledUpdate + (*GroupMemberJoinedByLinkUpdate)(nil), // 107: signal.backup.GroupMemberJoinedByLinkUpdate + (*GroupV2MigrationUpdate)(nil), // 108: signal.backup.GroupV2MigrationUpdate + (*GroupV2MigrationSelfInvitedUpdate)(nil), // 109: signal.backup.GroupV2MigrationSelfInvitedUpdate + (*GroupV2MigrationInvitedMembersUpdate)(nil), // 110: signal.backup.GroupV2MigrationInvitedMembersUpdate + (*GroupV2MigrationDroppedMembersUpdate)(nil), // 111: signal.backup.GroupV2MigrationDroppedMembersUpdate + (*GroupExpirationTimerUpdate)(nil), // 112: signal.backup.GroupExpirationTimerUpdate + (*PollTerminateUpdate)(nil), // 113: signal.backup.PollTerminateUpdate + (*PinMessageUpdate)(nil), // 114: signal.backup.PinMessageUpdate + (*StickerPack)(nil), // 115: signal.backup.StickerPack + (*ChatStyle)(nil), // 116: signal.backup.ChatStyle + (*NotificationProfile)(nil), // 117: signal.backup.NotificationProfile + (*ChatFolder)(nil), // 118: signal.backup.ChatFolder + (*AccountData_UsernameLink)(nil), // 119: signal.backup.AccountData.UsernameLink + (*AccountData_AutoDownloadSettings)(nil), // 120: signal.backup.AccountData.AutoDownloadSettings + (*AccountData_AccountSettings)(nil), // 121: signal.backup.AccountData.AccountSettings + (*AccountData_SubscriberData)(nil), // 122: signal.backup.AccountData.SubscriberData + (*AccountData_IAPSubscriberData)(nil), // 123: signal.backup.AccountData.IAPSubscriberData + (*AccountData_AndroidSpecificSettings)(nil), // 124: signal.backup.AccountData.AndroidSpecificSettings + (*Contact_Registered)(nil), // 125: signal.backup.Contact.Registered + (*Contact_NotRegistered)(nil), // 126: signal.backup.Contact.NotRegistered + (*Contact_Name)(nil), // 127: signal.backup.Contact.Name + (*Group_GroupSnapshot)(nil), // 128: signal.backup.Group.GroupSnapshot + (*Group_GroupAttributeBlob)(nil), // 129: signal.backup.Group.GroupAttributeBlob + (*Group_Member)(nil), // 130: signal.backup.Group.Member + (*Group_MemberPendingProfileKey)(nil), // 131: signal.backup.Group.MemberPendingProfileKey + (*Group_MemberPendingAdminApproval)(nil), // 132: signal.backup.Group.MemberPendingAdminApproval + (*Group_MemberBanned)(nil), // 133: signal.backup.Group.MemberBanned + (*Group_AccessControl)(nil), // 134: signal.backup.Group.AccessControl + (*ChatItem_IncomingMessageDetails)(nil), // 135: signal.backup.ChatItem.IncomingMessageDetails + (*ChatItem_OutgoingMessageDetails)(nil), // 136: signal.backup.ChatItem.OutgoingMessageDetails + (*ChatItem_DirectionlessMessageDetails)(nil), // 137: signal.backup.ChatItem.DirectionlessMessageDetails + (*ChatItem_PinDetails)(nil), // 138: signal.backup.ChatItem.PinDetails + (*SendStatus_Pending)(nil), // 139: signal.backup.SendStatus.Pending + (*SendStatus_Sent)(nil), // 140: signal.backup.SendStatus.Sent + (*SendStatus_Delivered)(nil), // 141: signal.backup.SendStatus.Delivered + (*SendStatus_Read)(nil), // 142: signal.backup.SendStatus.Read + (*SendStatus_Viewed)(nil), // 143: signal.backup.SendStatus.Viewed + (*SendStatus_Skipped)(nil), // 144: signal.backup.SendStatus.Skipped + (*SendStatus_Failed)(nil), // 145: signal.backup.SendStatus.Failed + (*DirectStoryReplyMessage_TextReply)(nil), // 146: signal.backup.DirectStoryReplyMessage.TextReply + (*PaymentNotification_TransactionDetails)(nil), // 147: signal.backup.PaymentNotification.TransactionDetails + (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification)(nil), // 148: signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification + (*PaymentNotification_TransactionDetails_FailedTransaction)(nil), // 149: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction + (*PaymentNotification_TransactionDetails_Transaction)(nil), // 150: signal.backup.PaymentNotification.TransactionDetails.Transaction + (*ContactAttachment_Name)(nil), // 151: signal.backup.ContactAttachment.Name + (*ContactAttachment_Phone)(nil), // 152: signal.backup.ContactAttachment.Phone + (*ContactAttachment_Email)(nil), // 153: signal.backup.ContactAttachment.Email + (*ContactAttachment_PostalAddress)(nil), // 154: signal.backup.ContactAttachment.PostalAddress + (*FilePointer_LocatorInfo)(nil), // 155: signal.backup.FilePointer.LocatorInfo + (*Quote_QuotedAttachment)(nil), // 156: signal.backup.Quote.QuotedAttachment + (*Poll_PollOption)(nil), // 157: signal.backup.Poll.PollOption + (*Poll_PollOption_PollVote)(nil), // 158: signal.backup.Poll.PollOption.PollVote + (*GroupChangeChatUpdate_Update)(nil), // 159: signal.backup.GroupChangeChatUpdate.Update + (*GroupInvitationRevokedUpdate_Invitee)(nil), // 160: signal.backup.GroupInvitationRevokedUpdate.Invitee + (*ChatStyle_Gradient)(nil), // 161: signal.backup.ChatStyle.Gradient + (*ChatStyle_CustomChatColor)(nil), // 162: signal.backup.ChatStyle.CustomChatColor + (*ChatStyle_AutomaticBubbleColor)(nil), // 163: signal.backup.ChatStyle.AutomaticBubbleColor } var file_backuppb_Backup_proto_depIdxs = []int32{ - 33, // 0: signal.backup.Frame.account:type_name -> signal.backup.AccountData - 34, // 1: signal.backup.Frame.recipient:type_name -> signal.backup.Recipient - 39, // 2: signal.backup.Frame.chat:type_name -> signal.backup.Chat - 44, // 3: signal.backup.Frame.chatItem:type_name -> signal.backup.ChatItem - 109, // 4: signal.backup.Frame.stickerPack:type_name -> signal.backup.StickerPack - 41, // 5: signal.backup.Frame.adHocCall:type_name -> signal.backup.AdHocCall - 111, // 6: signal.backup.Frame.notificationProfile:type_name -> signal.backup.NotificationProfile - 112, // 7: signal.backup.Frame.chatFolder:type_name -> signal.backup.ChatFolder - 113, // 8: signal.backup.AccountData.usernameLink:type_name -> signal.backup.AccountData.UsernameLink - 115, // 9: signal.backup.AccountData.donationSubscriberData:type_name -> signal.backup.AccountData.SubscriberData - 114, // 10: signal.backup.AccountData.accountSettings:type_name -> signal.backup.AccountData.AccountSettings - 116, // 11: signal.backup.AccountData.backupsSubscriberData:type_name -> signal.backup.AccountData.IAPSubscriberData - 35, // 12: signal.backup.Recipient.contact:type_name -> signal.backup.Contact - 36, // 13: signal.backup.Recipient.group:type_name -> signal.backup.Group - 42, // 14: signal.backup.Recipient.distributionList:type_name -> signal.backup.DistributionListItem - 37, // 15: signal.backup.Recipient.self:type_name -> signal.backup.Self - 38, // 16: signal.backup.Recipient.releaseNotes:type_name -> signal.backup.ReleaseNotes - 40, // 17: signal.backup.Recipient.callLink:type_name -> signal.backup.CallLink - 5, // 18: signal.backup.Contact.visibility:type_name -> signal.backup.Contact.Visibility - 117, // 19: signal.backup.Contact.registered:type_name -> signal.backup.Contact.Registered - 118, // 20: signal.backup.Contact.notRegistered:type_name -> signal.backup.Contact.NotRegistered - 4, // 21: signal.backup.Contact.identityState:type_name -> signal.backup.Contact.IdentityState - 119, // 22: signal.backup.Contact.nickname:type_name -> signal.backup.Contact.Name - 0, // 23: signal.backup.Contact.avatarColor:type_name -> signal.backup.AvatarColor - 6, // 24: signal.backup.Group.storySendMode:type_name -> signal.backup.Group.StorySendMode - 120, // 25: signal.backup.Group.snapshot:type_name -> signal.backup.Group.GroupSnapshot - 0, // 26: signal.backup.Group.avatarColor:type_name -> signal.backup.AvatarColor - 0, // 27: signal.backup.Self.avatarColor:type_name -> signal.backup.AvatarColor - 110, // 28: signal.backup.Chat.style:type_name -> signal.backup.ChatStyle - 9, // 29: signal.backup.CallLink.restrictions:type_name -> signal.backup.CallLink.Restrictions - 10, // 30: signal.backup.AdHocCall.state:type_name -> signal.backup.AdHocCall.State - 43, // 31: signal.backup.DistributionListItem.distributionList:type_name -> signal.backup.DistributionList - 11, // 32: signal.backup.DistributionList.privacyMode:type_name -> signal.backup.DistributionList.PrivacyMode - 44, // 33: signal.backup.ChatItem.revisions:type_name -> signal.backup.ChatItem - 127, // 34: signal.backup.ChatItem.incoming:type_name -> signal.backup.ChatItem.IncomingMessageDetails - 128, // 35: signal.backup.ChatItem.outgoing:type_name -> signal.backup.ChatItem.OutgoingMessageDetails - 129, // 36: signal.backup.ChatItem.directionless:type_name -> signal.backup.ChatItem.DirectionlessMessageDetails - 47, // 37: signal.backup.ChatItem.standardMessage:type_name -> signal.backup.StandardMessage - 48, // 38: signal.backup.ChatItem.contactMessage:type_name -> signal.backup.ContactMessage - 54, // 39: signal.backup.ChatItem.stickerMessage:type_name -> signal.backup.StickerMessage - 55, // 40: signal.backup.ChatItem.remoteDeletedMessage:type_name -> signal.backup.RemoteDeletedMessage - 64, // 41: signal.backup.ChatItem.updateMessage:type_name -> signal.backup.ChatUpdateMessage - 50, // 42: signal.backup.ChatItem.paymentNotification:type_name -> signal.backup.PaymentNotification - 51, // 43: signal.backup.ChatItem.giftBadge:type_name -> signal.backup.GiftBadge - 52, // 44: signal.backup.ChatItem.viewOnceMessage:type_name -> signal.backup.ViewOnceMessage - 49, // 45: signal.backup.ChatItem.directStoryReplyMessage:type_name -> signal.backup.DirectStoryReplyMessage - 63, // 46: signal.backup.ChatItem.poll:type_name -> signal.backup.Poll - 130, // 47: signal.backup.SendStatus.pending:type_name -> signal.backup.SendStatus.Pending - 131, // 48: signal.backup.SendStatus.sent:type_name -> signal.backup.SendStatus.Sent - 132, // 49: signal.backup.SendStatus.delivered:type_name -> signal.backup.SendStatus.Delivered - 133, // 50: signal.backup.SendStatus.read:type_name -> signal.backup.SendStatus.Read - 134, // 51: signal.backup.SendStatus.viewed:type_name -> signal.backup.SendStatus.Viewed - 135, // 52: signal.backup.SendStatus.skipped:type_name -> signal.backup.SendStatus.Skipped - 136, // 53: signal.backup.SendStatus.failed:type_name -> signal.backup.SendStatus.Failed - 61, // 54: signal.backup.Text.bodyRanges:type_name -> signal.backup.BodyRange - 60, // 55: signal.backup.StandardMessage.quote:type_name -> signal.backup.Quote - 46, // 56: signal.backup.StandardMessage.text:type_name -> signal.backup.Text - 58, // 57: signal.backup.StandardMessage.attachments:type_name -> signal.backup.MessageAttachment - 57, // 58: signal.backup.StandardMessage.linkPreview:type_name -> signal.backup.LinkPreview - 59, // 59: signal.backup.StandardMessage.longText:type_name -> signal.backup.FilePointer - 62, // 60: signal.backup.StandardMessage.reactions:type_name -> signal.backup.Reaction - 53, // 61: signal.backup.ContactMessage.contact:type_name -> signal.backup.ContactAttachment - 62, // 62: signal.backup.ContactMessage.reactions:type_name -> signal.backup.Reaction - 137, // 63: signal.backup.DirectStoryReplyMessage.textReply:type_name -> signal.backup.DirectStoryReplyMessage.TextReply - 62, // 64: signal.backup.DirectStoryReplyMessage.reactions:type_name -> signal.backup.Reaction - 138, // 65: signal.backup.PaymentNotification.transactionDetails:type_name -> signal.backup.PaymentNotification.TransactionDetails - 15, // 66: signal.backup.GiftBadge.state:type_name -> signal.backup.GiftBadge.State - 58, // 67: signal.backup.ViewOnceMessage.attachment:type_name -> signal.backup.MessageAttachment - 62, // 68: signal.backup.ViewOnceMessage.reactions:type_name -> signal.backup.Reaction - 142, // 69: signal.backup.ContactAttachment.name:type_name -> signal.backup.ContactAttachment.Name - 143, // 70: signal.backup.ContactAttachment.number:type_name -> signal.backup.ContactAttachment.Phone - 144, // 71: signal.backup.ContactAttachment.email:type_name -> signal.backup.ContactAttachment.Email - 145, // 72: signal.backup.ContactAttachment.address:type_name -> signal.backup.ContactAttachment.PostalAddress - 59, // 73: signal.backup.ContactAttachment.avatar:type_name -> signal.backup.FilePointer - 56, // 74: signal.backup.StickerMessage.sticker:type_name -> signal.backup.Sticker - 62, // 75: signal.backup.StickerMessage.reactions:type_name -> signal.backup.Reaction - 59, // 76: signal.backup.Sticker.data:type_name -> signal.backup.FilePointer - 59, // 77: signal.backup.LinkPreview.image:type_name -> signal.backup.FilePointer - 59, // 78: signal.backup.MessageAttachment.pointer:type_name -> signal.backup.FilePointer - 19, // 79: signal.backup.MessageAttachment.flag:type_name -> signal.backup.MessageAttachment.Flag - 146, // 80: signal.backup.FilePointer.locatorInfo:type_name -> signal.backup.FilePointer.LocatorInfo - 46, // 81: signal.backup.Quote.text:type_name -> signal.backup.Text - 147, // 82: signal.backup.Quote.attachments:type_name -> signal.backup.Quote.QuotedAttachment - 20, // 83: signal.backup.Quote.type:type_name -> signal.backup.Quote.Type - 21, // 84: signal.backup.BodyRange.style:type_name -> signal.backup.BodyRange.Style - 148, // 85: signal.backup.Poll.options:type_name -> signal.backup.Poll.PollOption - 67, // 86: signal.backup.ChatUpdateMessage.simpleUpdate:type_name -> signal.backup.SimpleChatUpdate - 73, // 87: signal.backup.ChatUpdateMessage.groupChange:type_name -> signal.backup.GroupChangeChatUpdate - 68, // 88: signal.backup.ChatUpdateMessage.expirationTimerChange:type_name -> signal.backup.ExpirationTimerChatUpdate - 69, // 89: signal.backup.ChatUpdateMessage.profileChange:type_name -> signal.backup.ProfileChangeChatUpdate - 71, // 90: signal.backup.ChatUpdateMessage.threadMerge:type_name -> signal.backup.ThreadMergeChatUpdate - 72, // 91: signal.backup.ChatUpdateMessage.sessionSwitchover:type_name -> signal.backup.SessionSwitchoverChatUpdate - 65, // 92: signal.backup.ChatUpdateMessage.individualCall:type_name -> signal.backup.IndividualCall - 66, // 93: signal.backup.ChatUpdateMessage.groupCall:type_name -> signal.backup.GroupCall - 70, // 94: signal.backup.ChatUpdateMessage.learnedProfileChange:type_name -> signal.backup.LearnedProfileChatUpdate - 108, // 95: signal.backup.ChatUpdateMessage.pollTerminate:type_name -> signal.backup.PollTerminateUpdate - 22, // 96: signal.backup.IndividualCall.type:type_name -> signal.backup.IndividualCall.Type - 23, // 97: signal.backup.IndividualCall.direction:type_name -> signal.backup.IndividualCall.Direction - 24, // 98: signal.backup.IndividualCall.state:type_name -> signal.backup.IndividualCall.State - 25, // 99: signal.backup.GroupCall.state:type_name -> signal.backup.GroupCall.State - 26, // 100: signal.backup.SimpleChatUpdate.type:type_name -> signal.backup.SimpleChatUpdate.Type - 150, // 101: signal.backup.GroupChangeChatUpdate.updates:type_name -> signal.backup.GroupChangeChatUpdate.Update - 1, // 102: signal.backup.GroupMembershipAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel - 1, // 103: signal.backup.GroupAttributesAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel - 151, // 104: signal.backup.GroupInvitationRevokedUpdate.invitees:type_name -> signal.backup.GroupInvitationRevokedUpdate.Invitee - 27, // 105: signal.backup.ChatStyle.wallpaperPreset:type_name -> signal.backup.ChatStyle.WallpaperPreset - 59, // 106: signal.backup.ChatStyle.wallpaperPhoto:type_name -> signal.backup.FilePointer - 154, // 107: signal.backup.ChatStyle.autoBubbleColor:type_name -> signal.backup.ChatStyle.AutomaticBubbleColor - 28, // 108: signal.backup.ChatStyle.bubbleColorPreset:type_name -> signal.backup.ChatStyle.BubbleColorPreset - 29, // 109: signal.backup.NotificationProfile.scheduleDaysEnabled:type_name -> signal.backup.NotificationProfile.DayOfWeek - 30, // 110: signal.backup.ChatFolder.folderType:type_name -> signal.backup.ChatFolder.FolderType - 3, // 111: signal.backup.AccountData.UsernameLink.color:type_name -> signal.backup.AccountData.UsernameLink.Color - 2, // 112: signal.backup.AccountData.AccountSettings.phoneNumberSharingMode:type_name -> signal.backup.AccountData.PhoneNumberSharingMode - 110, // 113: signal.backup.AccountData.AccountSettings.defaultChatStyle:type_name -> signal.backup.ChatStyle - 153, // 114: signal.backup.AccountData.AccountSettings.customChatColors:type_name -> signal.backup.ChatStyle.CustomChatColor - 121, // 115: signal.backup.Group.GroupSnapshot.title:type_name -> signal.backup.Group.GroupAttributeBlob - 121, // 116: signal.backup.Group.GroupSnapshot.description:type_name -> signal.backup.Group.GroupAttributeBlob - 121, // 117: signal.backup.Group.GroupSnapshot.disappearingMessagesTimer:type_name -> signal.backup.Group.GroupAttributeBlob - 126, // 118: signal.backup.Group.GroupSnapshot.accessControl:type_name -> signal.backup.Group.AccessControl - 122, // 119: signal.backup.Group.GroupSnapshot.members:type_name -> signal.backup.Group.Member - 123, // 120: signal.backup.Group.GroupSnapshot.membersPendingProfileKey:type_name -> signal.backup.Group.MemberPendingProfileKey - 124, // 121: signal.backup.Group.GroupSnapshot.membersPendingAdminApproval:type_name -> signal.backup.Group.MemberPendingAdminApproval - 125, // 122: signal.backup.Group.GroupSnapshot.members_banned:type_name -> signal.backup.Group.MemberBanned - 7, // 123: signal.backup.Group.Member.role:type_name -> signal.backup.Group.Member.Role - 122, // 124: signal.backup.Group.MemberPendingProfileKey.member:type_name -> signal.backup.Group.Member - 8, // 125: signal.backup.Group.AccessControl.attributes:type_name -> signal.backup.Group.AccessControl.AccessRequired - 8, // 126: signal.backup.Group.AccessControl.members:type_name -> signal.backup.Group.AccessControl.AccessRequired - 8, // 127: signal.backup.Group.AccessControl.addFromInviteLink:type_name -> signal.backup.Group.AccessControl.AccessRequired - 45, // 128: signal.backup.ChatItem.OutgoingMessageDetails.sendStatus:type_name -> signal.backup.SendStatus - 12, // 129: signal.backup.SendStatus.Failed.reason:type_name -> signal.backup.SendStatus.Failed.FailureReason - 46, // 130: signal.backup.DirectStoryReplyMessage.TextReply.text:type_name -> signal.backup.Text - 59, // 131: signal.backup.DirectStoryReplyMessage.TextReply.longText:type_name -> signal.backup.FilePointer - 141, // 132: signal.backup.PaymentNotification.TransactionDetails.transaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction - 140, // 133: signal.backup.PaymentNotification.TransactionDetails.failedTransaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction - 13, // 134: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.reason:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason - 14, // 135: signal.backup.PaymentNotification.TransactionDetails.Transaction.status:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction.Status - 139, // 136: signal.backup.PaymentNotification.TransactionDetails.Transaction.mobileCoinIdentification:type_name -> signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification - 16, // 137: signal.backup.ContactAttachment.Phone.type:type_name -> signal.backup.ContactAttachment.Phone.Type - 17, // 138: signal.backup.ContactAttachment.Email.type:type_name -> signal.backup.ContactAttachment.Email.Type - 18, // 139: signal.backup.ContactAttachment.PostalAddress.type:type_name -> signal.backup.ContactAttachment.PostalAddress.Type - 58, // 140: signal.backup.Quote.QuotedAttachment.thumbnail:type_name -> signal.backup.MessageAttachment - 149, // 141: signal.backup.Poll.PollOption.votes:type_name -> signal.backup.Poll.PollOption.PollVote - 74, // 142: signal.backup.GroupChangeChatUpdate.Update.genericGroupUpdate:type_name -> signal.backup.GenericGroupUpdate - 75, // 143: signal.backup.GroupChangeChatUpdate.Update.groupCreationUpdate:type_name -> signal.backup.GroupCreationUpdate - 76, // 144: signal.backup.GroupChangeChatUpdate.Update.groupNameUpdate:type_name -> signal.backup.GroupNameUpdate - 77, // 145: signal.backup.GroupChangeChatUpdate.Update.groupAvatarUpdate:type_name -> signal.backup.GroupAvatarUpdate - 78, // 146: signal.backup.GroupChangeChatUpdate.Update.groupDescriptionUpdate:type_name -> signal.backup.GroupDescriptionUpdate - 79, // 147: signal.backup.GroupChangeChatUpdate.Update.groupMembershipAccessLevelChangeUpdate:type_name -> signal.backup.GroupMembershipAccessLevelChangeUpdate - 80, // 148: signal.backup.GroupChangeChatUpdate.Update.groupAttributesAccessLevelChangeUpdate:type_name -> signal.backup.GroupAttributesAccessLevelChangeUpdate - 81, // 149: signal.backup.GroupChangeChatUpdate.Update.groupAnnouncementOnlyChangeUpdate:type_name -> signal.backup.GroupAnnouncementOnlyChangeUpdate - 82, // 150: signal.backup.GroupChangeChatUpdate.Update.groupAdminStatusUpdate:type_name -> signal.backup.GroupAdminStatusUpdate - 83, // 151: signal.backup.GroupChangeChatUpdate.Update.groupMemberLeftUpdate:type_name -> signal.backup.GroupMemberLeftUpdate - 84, // 152: signal.backup.GroupChangeChatUpdate.Update.groupMemberRemovedUpdate:type_name -> signal.backup.GroupMemberRemovedUpdate - 85, // 153: signal.backup.GroupChangeChatUpdate.Update.selfInvitedToGroupUpdate:type_name -> signal.backup.SelfInvitedToGroupUpdate - 86, // 154: signal.backup.GroupChangeChatUpdate.Update.selfInvitedOtherUserToGroupUpdate:type_name -> signal.backup.SelfInvitedOtherUserToGroupUpdate - 87, // 155: signal.backup.GroupChangeChatUpdate.Update.groupUnknownInviteeUpdate:type_name -> signal.backup.GroupUnknownInviteeUpdate - 88, // 156: signal.backup.GroupChangeChatUpdate.Update.groupInvitationAcceptedUpdate:type_name -> signal.backup.GroupInvitationAcceptedUpdate - 89, // 157: signal.backup.GroupChangeChatUpdate.Update.groupInvitationDeclinedUpdate:type_name -> signal.backup.GroupInvitationDeclinedUpdate - 90, // 158: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedUpdate:type_name -> signal.backup.GroupMemberJoinedUpdate - 91, // 159: signal.backup.GroupChangeChatUpdate.Update.groupMemberAddedUpdate:type_name -> signal.backup.GroupMemberAddedUpdate - 92, // 160: signal.backup.GroupChangeChatUpdate.Update.groupSelfInvitationRevokedUpdate:type_name -> signal.backup.GroupSelfInvitationRevokedUpdate - 93, // 161: signal.backup.GroupChangeChatUpdate.Update.groupInvitationRevokedUpdate:type_name -> signal.backup.GroupInvitationRevokedUpdate - 94, // 162: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestUpdate:type_name -> signal.backup.GroupJoinRequestUpdate - 95, // 163: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestApprovalUpdate:type_name -> signal.backup.GroupJoinRequestApprovalUpdate - 96, // 164: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestCanceledUpdate:type_name -> signal.backup.GroupJoinRequestCanceledUpdate - 98, // 165: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkResetUpdate:type_name -> signal.backup.GroupInviteLinkResetUpdate - 99, // 166: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkEnabledUpdate:type_name -> signal.backup.GroupInviteLinkEnabledUpdate - 100, // 167: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkAdminApprovalUpdate:type_name -> signal.backup.GroupInviteLinkAdminApprovalUpdate - 101, // 168: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkDisabledUpdate:type_name -> signal.backup.GroupInviteLinkDisabledUpdate - 102, // 169: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedByLinkUpdate:type_name -> signal.backup.GroupMemberJoinedByLinkUpdate - 103, // 170: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationUpdate:type_name -> signal.backup.GroupV2MigrationUpdate - 104, // 171: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationSelfInvitedUpdate:type_name -> signal.backup.GroupV2MigrationSelfInvitedUpdate - 105, // 172: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationInvitedMembersUpdate:type_name -> signal.backup.GroupV2MigrationInvitedMembersUpdate - 106, // 173: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationDroppedMembersUpdate:type_name -> signal.backup.GroupV2MigrationDroppedMembersUpdate - 97, // 174: signal.backup.GroupChangeChatUpdate.Update.groupSequenceOfRequestsAndCancelsUpdate:type_name -> signal.backup.GroupSequenceOfRequestsAndCancelsUpdate - 107, // 175: signal.backup.GroupChangeChatUpdate.Update.groupExpirationTimerUpdate:type_name -> signal.backup.GroupExpirationTimerUpdate - 152, // 176: signal.backup.ChatStyle.CustomChatColor.gradient:type_name -> signal.backup.ChatStyle.Gradient - 177, // [177:177] is the sub-list for method output_type - 177, // [177:177] is the sub-list for method input_type - 177, // [177:177] is the sub-list for extension type_name - 177, // [177:177] is the sub-list for extension extendee - 0, // [0:177] is the sub-list for field type_name + 38, // 0: signal.backup.Frame.account:type_name -> signal.backup.AccountData + 39, // 1: signal.backup.Frame.recipient:type_name -> signal.backup.Recipient + 44, // 2: signal.backup.Frame.chat:type_name -> signal.backup.Chat + 49, // 3: signal.backup.Frame.chatItem:type_name -> signal.backup.ChatItem + 115, // 4: signal.backup.Frame.stickerPack:type_name -> signal.backup.StickerPack + 46, // 5: signal.backup.Frame.adHocCall:type_name -> signal.backup.AdHocCall + 117, // 6: signal.backup.Frame.notificationProfile:type_name -> signal.backup.NotificationProfile + 118, // 7: signal.backup.Frame.chatFolder:type_name -> signal.backup.ChatFolder + 119, // 8: signal.backup.AccountData.usernameLink:type_name -> signal.backup.AccountData.UsernameLink + 122, // 9: signal.backup.AccountData.donationSubscriberData:type_name -> signal.backup.AccountData.SubscriberData + 121, // 10: signal.backup.AccountData.accountSettings:type_name -> signal.backup.AccountData.AccountSettings + 123, // 11: signal.backup.AccountData.backupsSubscriberData:type_name -> signal.backup.AccountData.IAPSubscriberData + 124, // 12: signal.backup.AccountData.androidSpecificSettings:type_name -> signal.backup.AccountData.AndroidSpecificSettings + 40, // 13: signal.backup.Recipient.contact:type_name -> signal.backup.Contact + 41, // 14: signal.backup.Recipient.group:type_name -> signal.backup.Group + 47, // 15: signal.backup.Recipient.distributionList:type_name -> signal.backup.DistributionListItem + 42, // 16: signal.backup.Recipient.self:type_name -> signal.backup.Self + 43, // 17: signal.backup.Recipient.releaseNotes:type_name -> signal.backup.ReleaseNotes + 45, // 18: signal.backup.Recipient.callLink:type_name -> signal.backup.CallLink + 10, // 19: signal.backup.Contact.visibility:type_name -> signal.backup.Contact.Visibility + 125, // 20: signal.backup.Contact.registered:type_name -> signal.backup.Contact.Registered + 126, // 21: signal.backup.Contact.notRegistered:type_name -> signal.backup.Contact.NotRegistered + 9, // 22: signal.backup.Contact.identityState:type_name -> signal.backup.Contact.IdentityState + 127, // 23: signal.backup.Contact.nickname:type_name -> signal.backup.Contact.Name + 0, // 24: signal.backup.Contact.avatarColor:type_name -> signal.backup.AvatarColor + 11, // 25: signal.backup.Group.storySendMode:type_name -> signal.backup.Group.StorySendMode + 128, // 26: signal.backup.Group.snapshot:type_name -> signal.backup.Group.GroupSnapshot + 0, // 27: signal.backup.Group.avatarColor:type_name -> signal.backup.AvatarColor + 0, // 28: signal.backup.Self.avatarColor:type_name -> signal.backup.AvatarColor + 116, // 29: signal.backup.Chat.style:type_name -> signal.backup.ChatStyle + 14, // 30: signal.backup.CallLink.restrictions:type_name -> signal.backup.CallLink.Restrictions + 15, // 31: signal.backup.AdHocCall.state:type_name -> signal.backup.AdHocCall.State + 48, // 32: signal.backup.DistributionListItem.distributionList:type_name -> signal.backup.DistributionList + 16, // 33: signal.backup.DistributionList.privacyMode:type_name -> signal.backup.DistributionList.PrivacyMode + 49, // 34: signal.backup.ChatItem.revisions:type_name -> signal.backup.ChatItem + 135, // 35: signal.backup.ChatItem.incoming:type_name -> signal.backup.ChatItem.IncomingMessageDetails + 136, // 36: signal.backup.ChatItem.outgoing:type_name -> signal.backup.ChatItem.OutgoingMessageDetails + 137, // 37: signal.backup.ChatItem.directionless:type_name -> signal.backup.ChatItem.DirectionlessMessageDetails + 52, // 38: signal.backup.ChatItem.standardMessage:type_name -> signal.backup.StandardMessage + 53, // 39: signal.backup.ChatItem.contactMessage:type_name -> signal.backup.ContactMessage + 59, // 40: signal.backup.ChatItem.stickerMessage:type_name -> signal.backup.StickerMessage + 60, // 41: signal.backup.ChatItem.remoteDeletedMessage:type_name -> signal.backup.RemoteDeletedMessage + 69, // 42: signal.backup.ChatItem.updateMessage:type_name -> signal.backup.ChatUpdateMessage + 55, // 43: signal.backup.ChatItem.paymentNotification:type_name -> signal.backup.PaymentNotification + 56, // 44: signal.backup.ChatItem.giftBadge:type_name -> signal.backup.GiftBadge + 57, // 45: signal.backup.ChatItem.viewOnceMessage:type_name -> signal.backup.ViewOnceMessage + 54, // 46: signal.backup.ChatItem.directStoryReplyMessage:type_name -> signal.backup.DirectStoryReplyMessage + 68, // 47: signal.backup.ChatItem.poll:type_name -> signal.backup.Poll + 138, // 48: signal.backup.ChatItem.pinDetails:type_name -> signal.backup.ChatItem.PinDetails + 139, // 49: signal.backup.SendStatus.pending:type_name -> signal.backup.SendStatus.Pending + 140, // 50: signal.backup.SendStatus.sent:type_name -> signal.backup.SendStatus.Sent + 141, // 51: signal.backup.SendStatus.delivered:type_name -> signal.backup.SendStatus.Delivered + 142, // 52: signal.backup.SendStatus.read:type_name -> signal.backup.SendStatus.Read + 143, // 53: signal.backup.SendStatus.viewed:type_name -> signal.backup.SendStatus.Viewed + 144, // 54: signal.backup.SendStatus.skipped:type_name -> signal.backup.SendStatus.Skipped + 145, // 55: signal.backup.SendStatus.failed:type_name -> signal.backup.SendStatus.Failed + 66, // 56: signal.backup.Text.bodyRanges:type_name -> signal.backup.BodyRange + 65, // 57: signal.backup.StandardMessage.quote:type_name -> signal.backup.Quote + 51, // 58: signal.backup.StandardMessage.text:type_name -> signal.backup.Text + 63, // 59: signal.backup.StandardMessage.attachments:type_name -> signal.backup.MessageAttachment + 62, // 60: signal.backup.StandardMessage.linkPreview:type_name -> signal.backup.LinkPreview + 64, // 61: signal.backup.StandardMessage.longText:type_name -> signal.backup.FilePointer + 67, // 62: signal.backup.StandardMessage.reactions:type_name -> signal.backup.Reaction + 58, // 63: signal.backup.ContactMessage.contact:type_name -> signal.backup.ContactAttachment + 67, // 64: signal.backup.ContactMessage.reactions:type_name -> signal.backup.Reaction + 146, // 65: signal.backup.DirectStoryReplyMessage.textReply:type_name -> signal.backup.DirectStoryReplyMessage.TextReply + 67, // 66: signal.backup.DirectStoryReplyMessage.reactions:type_name -> signal.backup.Reaction + 147, // 67: signal.backup.PaymentNotification.transactionDetails:type_name -> signal.backup.PaymentNotification.TransactionDetails + 20, // 68: signal.backup.GiftBadge.state:type_name -> signal.backup.GiftBadge.State + 63, // 69: signal.backup.ViewOnceMessage.attachment:type_name -> signal.backup.MessageAttachment + 67, // 70: signal.backup.ViewOnceMessage.reactions:type_name -> signal.backup.Reaction + 151, // 71: signal.backup.ContactAttachment.name:type_name -> signal.backup.ContactAttachment.Name + 152, // 72: signal.backup.ContactAttachment.number:type_name -> signal.backup.ContactAttachment.Phone + 153, // 73: signal.backup.ContactAttachment.email:type_name -> signal.backup.ContactAttachment.Email + 154, // 74: signal.backup.ContactAttachment.address:type_name -> signal.backup.ContactAttachment.PostalAddress + 64, // 75: signal.backup.ContactAttachment.avatar:type_name -> signal.backup.FilePointer + 61, // 76: signal.backup.StickerMessage.sticker:type_name -> signal.backup.Sticker + 67, // 77: signal.backup.StickerMessage.reactions:type_name -> signal.backup.Reaction + 64, // 78: signal.backup.Sticker.data:type_name -> signal.backup.FilePointer + 64, // 79: signal.backup.LinkPreview.image:type_name -> signal.backup.FilePointer + 64, // 80: signal.backup.MessageAttachment.pointer:type_name -> signal.backup.FilePointer + 24, // 81: signal.backup.MessageAttachment.flag:type_name -> signal.backup.MessageAttachment.Flag + 155, // 82: signal.backup.FilePointer.locatorInfo:type_name -> signal.backup.FilePointer.LocatorInfo + 51, // 83: signal.backup.Quote.text:type_name -> signal.backup.Text + 156, // 84: signal.backup.Quote.attachments:type_name -> signal.backup.Quote.QuotedAttachment + 25, // 85: signal.backup.Quote.type:type_name -> signal.backup.Quote.Type + 26, // 86: signal.backup.BodyRange.style:type_name -> signal.backup.BodyRange.Style + 157, // 87: signal.backup.Poll.options:type_name -> signal.backup.Poll.PollOption + 67, // 88: signal.backup.Poll.reactions:type_name -> signal.backup.Reaction + 72, // 89: signal.backup.ChatUpdateMessage.simpleUpdate:type_name -> signal.backup.SimpleChatUpdate + 78, // 90: signal.backup.ChatUpdateMessage.groupChange:type_name -> signal.backup.GroupChangeChatUpdate + 73, // 91: signal.backup.ChatUpdateMessage.expirationTimerChange:type_name -> signal.backup.ExpirationTimerChatUpdate + 74, // 92: signal.backup.ChatUpdateMessage.profileChange:type_name -> signal.backup.ProfileChangeChatUpdate + 76, // 93: signal.backup.ChatUpdateMessage.threadMerge:type_name -> signal.backup.ThreadMergeChatUpdate + 77, // 94: signal.backup.ChatUpdateMessage.sessionSwitchover:type_name -> signal.backup.SessionSwitchoverChatUpdate + 70, // 95: signal.backup.ChatUpdateMessage.individualCall:type_name -> signal.backup.IndividualCall + 71, // 96: signal.backup.ChatUpdateMessage.groupCall:type_name -> signal.backup.GroupCall + 75, // 97: signal.backup.ChatUpdateMessage.learnedProfileChange:type_name -> signal.backup.LearnedProfileChatUpdate + 113, // 98: signal.backup.ChatUpdateMessage.pollTerminate:type_name -> signal.backup.PollTerminateUpdate + 114, // 99: signal.backup.ChatUpdateMessage.pinMessage:type_name -> signal.backup.PinMessageUpdate + 27, // 100: signal.backup.IndividualCall.type:type_name -> signal.backup.IndividualCall.Type + 28, // 101: signal.backup.IndividualCall.direction:type_name -> signal.backup.IndividualCall.Direction + 29, // 102: signal.backup.IndividualCall.state:type_name -> signal.backup.IndividualCall.State + 30, // 103: signal.backup.GroupCall.state:type_name -> signal.backup.GroupCall.State + 31, // 104: signal.backup.SimpleChatUpdate.type:type_name -> signal.backup.SimpleChatUpdate.Type + 159, // 105: signal.backup.GroupChangeChatUpdate.updates:type_name -> signal.backup.GroupChangeChatUpdate.Update + 1, // 106: signal.backup.GroupMembershipAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel + 1, // 107: signal.backup.GroupAttributesAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel + 160, // 108: signal.backup.GroupInvitationRevokedUpdate.invitees:type_name -> signal.backup.GroupInvitationRevokedUpdate.Invitee + 32, // 109: signal.backup.ChatStyle.wallpaperPreset:type_name -> signal.backup.ChatStyle.WallpaperPreset + 64, // 110: signal.backup.ChatStyle.wallpaperPhoto:type_name -> signal.backup.FilePointer + 163, // 111: signal.backup.ChatStyle.autoBubbleColor:type_name -> signal.backup.ChatStyle.AutomaticBubbleColor + 33, // 112: signal.backup.ChatStyle.bubbleColorPreset:type_name -> signal.backup.ChatStyle.BubbleColorPreset + 34, // 113: signal.backup.NotificationProfile.scheduleDaysEnabled:type_name -> signal.backup.NotificationProfile.DayOfWeek + 35, // 114: signal.backup.ChatFolder.folderType:type_name -> signal.backup.ChatFolder.FolderType + 6, // 115: signal.backup.AccountData.UsernameLink.color:type_name -> signal.backup.AccountData.UsernameLink.Color + 7, // 116: signal.backup.AccountData.AutoDownloadSettings.images:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + 7, // 117: signal.backup.AccountData.AutoDownloadSettings.audio:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + 7, // 118: signal.backup.AccountData.AutoDownloadSettings.video:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + 7, // 119: signal.backup.AccountData.AutoDownloadSettings.documents:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + 2, // 120: signal.backup.AccountData.AccountSettings.phoneNumberSharingMode:type_name -> signal.backup.AccountData.PhoneNumberSharingMode + 116, // 121: signal.backup.AccountData.AccountSettings.defaultChatStyle:type_name -> signal.backup.ChatStyle + 162, // 122: signal.backup.AccountData.AccountSettings.customChatColors:type_name -> signal.backup.ChatStyle.CustomChatColor + 3, // 123: signal.backup.AccountData.AccountSettings.defaultSentMediaQuality:type_name -> signal.backup.AccountData.SentMediaQuality + 120, // 124: signal.backup.AccountData.AccountSettings.autoDownloadSettings:type_name -> signal.backup.AccountData.AutoDownloadSettings + 4, // 125: signal.backup.AccountData.AccountSettings.appTheme:type_name -> signal.backup.AccountData.AppTheme + 5, // 126: signal.backup.AccountData.AccountSettings.callsUseLessDataSetting:type_name -> signal.backup.AccountData.CallsUseLessDataSetting + 8, // 127: signal.backup.AccountData.AndroidSpecificSettings.navigationBarSize:type_name -> signal.backup.AccountData.AndroidSpecificSettings.NavigationBarSize + 129, // 128: signal.backup.Group.GroupSnapshot.title:type_name -> signal.backup.Group.GroupAttributeBlob + 129, // 129: signal.backup.Group.GroupSnapshot.description:type_name -> signal.backup.Group.GroupAttributeBlob + 129, // 130: signal.backup.Group.GroupSnapshot.disappearingMessagesTimer:type_name -> signal.backup.Group.GroupAttributeBlob + 134, // 131: signal.backup.Group.GroupSnapshot.accessControl:type_name -> signal.backup.Group.AccessControl + 130, // 132: signal.backup.Group.GroupSnapshot.members:type_name -> signal.backup.Group.Member + 131, // 133: signal.backup.Group.GroupSnapshot.membersPendingProfileKey:type_name -> signal.backup.Group.MemberPendingProfileKey + 132, // 134: signal.backup.Group.GroupSnapshot.membersPendingAdminApproval:type_name -> signal.backup.Group.MemberPendingAdminApproval + 133, // 135: signal.backup.Group.GroupSnapshot.members_banned:type_name -> signal.backup.Group.MemberBanned + 12, // 136: signal.backup.Group.Member.role:type_name -> signal.backup.Group.Member.Role + 130, // 137: signal.backup.Group.MemberPendingProfileKey.member:type_name -> signal.backup.Group.Member + 13, // 138: signal.backup.Group.AccessControl.attributes:type_name -> signal.backup.Group.AccessControl.AccessRequired + 13, // 139: signal.backup.Group.AccessControl.members:type_name -> signal.backup.Group.AccessControl.AccessRequired + 13, // 140: signal.backup.Group.AccessControl.addFromInviteLink:type_name -> signal.backup.Group.AccessControl.AccessRequired + 50, // 141: signal.backup.ChatItem.OutgoingMessageDetails.sendStatus:type_name -> signal.backup.SendStatus + 17, // 142: signal.backup.SendStatus.Failed.reason:type_name -> signal.backup.SendStatus.Failed.FailureReason + 51, // 143: signal.backup.DirectStoryReplyMessage.TextReply.text:type_name -> signal.backup.Text + 64, // 144: signal.backup.DirectStoryReplyMessage.TextReply.longText:type_name -> signal.backup.FilePointer + 150, // 145: signal.backup.PaymentNotification.TransactionDetails.transaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction + 149, // 146: signal.backup.PaymentNotification.TransactionDetails.failedTransaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction + 18, // 147: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.reason:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason + 19, // 148: signal.backup.PaymentNotification.TransactionDetails.Transaction.status:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction.Status + 148, // 149: signal.backup.PaymentNotification.TransactionDetails.Transaction.mobileCoinIdentification:type_name -> signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification + 21, // 150: signal.backup.ContactAttachment.Phone.type:type_name -> signal.backup.ContactAttachment.Phone.Type + 22, // 151: signal.backup.ContactAttachment.Email.type:type_name -> signal.backup.ContactAttachment.Email.Type + 23, // 152: signal.backup.ContactAttachment.PostalAddress.type:type_name -> signal.backup.ContactAttachment.PostalAddress.Type + 63, // 153: signal.backup.Quote.QuotedAttachment.thumbnail:type_name -> signal.backup.MessageAttachment + 158, // 154: signal.backup.Poll.PollOption.votes:type_name -> signal.backup.Poll.PollOption.PollVote + 79, // 155: signal.backup.GroupChangeChatUpdate.Update.genericGroupUpdate:type_name -> signal.backup.GenericGroupUpdate + 80, // 156: signal.backup.GroupChangeChatUpdate.Update.groupCreationUpdate:type_name -> signal.backup.GroupCreationUpdate + 81, // 157: signal.backup.GroupChangeChatUpdate.Update.groupNameUpdate:type_name -> signal.backup.GroupNameUpdate + 82, // 158: signal.backup.GroupChangeChatUpdate.Update.groupAvatarUpdate:type_name -> signal.backup.GroupAvatarUpdate + 83, // 159: signal.backup.GroupChangeChatUpdate.Update.groupDescriptionUpdate:type_name -> signal.backup.GroupDescriptionUpdate + 84, // 160: signal.backup.GroupChangeChatUpdate.Update.groupMembershipAccessLevelChangeUpdate:type_name -> signal.backup.GroupMembershipAccessLevelChangeUpdate + 85, // 161: signal.backup.GroupChangeChatUpdate.Update.groupAttributesAccessLevelChangeUpdate:type_name -> signal.backup.GroupAttributesAccessLevelChangeUpdate + 86, // 162: signal.backup.GroupChangeChatUpdate.Update.groupAnnouncementOnlyChangeUpdate:type_name -> signal.backup.GroupAnnouncementOnlyChangeUpdate + 87, // 163: signal.backup.GroupChangeChatUpdate.Update.groupAdminStatusUpdate:type_name -> signal.backup.GroupAdminStatusUpdate + 88, // 164: signal.backup.GroupChangeChatUpdate.Update.groupMemberLeftUpdate:type_name -> signal.backup.GroupMemberLeftUpdate + 89, // 165: signal.backup.GroupChangeChatUpdate.Update.groupMemberRemovedUpdate:type_name -> signal.backup.GroupMemberRemovedUpdate + 90, // 166: signal.backup.GroupChangeChatUpdate.Update.selfInvitedToGroupUpdate:type_name -> signal.backup.SelfInvitedToGroupUpdate + 91, // 167: signal.backup.GroupChangeChatUpdate.Update.selfInvitedOtherUserToGroupUpdate:type_name -> signal.backup.SelfInvitedOtherUserToGroupUpdate + 92, // 168: signal.backup.GroupChangeChatUpdate.Update.groupUnknownInviteeUpdate:type_name -> signal.backup.GroupUnknownInviteeUpdate + 93, // 169: signal.backup.GroupChangeChatUpdate.Update.groupInvitationAcceptedUpdate:type_name -> signal.backup.GroupInvitationAcceptedUpdate + 94, // 170: signal.backup.GroupChangeChatUpdate.Update.groupInvitationDeclinedUpdate:type_name -> signal.backup.GroupInvitationDeclinedUpdate + 95, // 171: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedUpdate:type_name -> signal.backup.GroupMemberJoinedUpdate + 96, // 172: signal.backup.GroupChangeChatUpdate.Update.groupMemberAddedUpdate:type_name -> signal.backup.GroupMemberAddedUpdate + 97, // 173: signal.backup.GroupChangeChatUpdate.Update.groupSelfInvitationRevokedUpdate:type_name -> signal.backup.GroupSelfInvitationRevokedUpdate + 98, // 174: signal.backup.GroupChangeChatUpdate.Update.groupInvitationRevokedUpdate:type_name -> signal.backup.GroupInvitationRevokedUpdate + 99, // 175: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestUpdate:type_name -> signal.backup.GroupJoinRequestUpdate + 100, // 176: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestApprovalUpdate:type_name -> signal.backup.GroupJoinRequestApprovalUpdate + 101, // 177: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestCanceledUpdate:type_name -> signal.backup.GroupJoinRequestCanceledUpdate + 103, // 178: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkResetUpdate:type_name -> signal.backup.GroupInviteLinkResetUpdate + 104, // 179: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkEnabledUpdate:type_name -> signal.backup.GroupInviteLinkEnabledUpdate + 105, // 180: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkAdminApprovalUpdate:type_name -> signal.backup.GroupInviteLinkAdminApprovalUpdate + 106, // 181: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkDisabledUpdate:type_name -> signal.backup.GroupInviteLinkDisabledUpdate + 107, // 182: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedByLinkUpdate:type_name -> signal.backup.GroupMemberJoinedByLinkUpdate + 108, // 183: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationUpdate:type_name -> signal.backup.GroupV2MigrationUpdate + 109, // 184: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationSelfInvitedUpdate:type_name -> signal.backup.GroupV2MigrationSelfInvitedUpdate + 110, // 185: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationInvitedMembersUpdate:type_name -> signal.backup.GroupV2MigrationInvitedMembersUpdate + 111, // 186: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationDroppedMembersUpdate:type_name -> signal.backup.GroupV2MigrationDroppedMembersUpdate + 102, // 187: signal.backup.GroupChangeChatUpdate.Update.groupSequenceOfRequestsAndCancelsUpdate:type_name -> signal.backup.GroupSequenceOfRequestsAndCancelsUpdate + 112, // 188: signal.backup.GroupChangeChatUpdate.Update.groupExpirationTimerUpdate:type_name -> signal.backup.GroupExpirationTimerUpdate + 161, // 189: signal.backup.ChatStyle.CustomChatColor.gradient:type_name -> signal.backup.ChatStyle.Gradient + 190, // [190:190] is the sub-list for method output_type + 190, // [190:190] is the sub-list for method input_type + 190, // [190:190] is the sub-list for extension type_name + 190, // [190:190] is the sub-list for extension extendee + 0, // [0:190] is the sub-list for field type_name } func init() { file_backuppb_Backup_proto_init() } @@ -12896,6 +13644,7 @@ func file_backuppb_Backup_proto_init() { (*ChatUpdateMessage_GroupCall)(nil), (*ChatUpdateMessage_LearnedProfileChange)(nil), (*ChatUpdateMessage_PollTerminate)(nil), + (*ChatUpdateMessage_PinMessage)(nil), } file_backuppb_Backup_proto_msgTypes[34].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[35].OneofWrappers = []any{} @@ -12926,37 +13675,41 @@ func file_backuppb_Backup_proto_init() { file_backuppb_Backup_proto_msgTypes[69].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[70].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[76].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[79].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[80].OneofWrappers = []any{ (*ChatStyle_WallpaperPreset_)(nil), (*ChatStyle_WallpaperPhoto)(nil), (*ChatStyle_AutoBubbleColor)(nil), (*ChatStyle_BubbleColorPreset_)(nil), (*ChatStyle_CustomColorId)(nil), } - file_backuppb_Backup_proto_msgTypes[80].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[83].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[85].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[81].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[85].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[87].OneofWrappers = []any{ (*AccountData_IAPSubscriberData_PurchaseToken)(nil), (*AccountData_IAPSubscriberData_OriginalTransactionId)(nil), } - file_backuppb_Backup_proto_msgTypes[90].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[93].OneofWrappers = []any{ (*Group_GroupAttributeBlob_Title)(nil), (*Group_GroupAttributeBlob_Avatar)(nil), (*Group_GroupAttributeBlob_DisappearingMessagesDuration)(nil), (*Group_GroupAttributeBlob_DescriptionText)(nil), } - file_backuppb_Backup_proto_msgTypes[96].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[107].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[99].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[102].OneofWrappers = []any{ + (*ChatItem_PinDetails_PinExpiresAtTimestamp)(nil), + (*ChatItem_PinDetails_PinNeverExpires)(nil), + } + file_backuppb_Backup_proto_msgTypes[111].OneofWrappers = []any{ (*PaymentNotification_TransactionDetails_Transaction_)(nil), (*PaymentNotification_TransactionDetails_FailedTransaction_)(nil), } - file_backuppb_Backup_proto_msgTypes[110].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[115].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[114].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[119].OneofWrappers = []any{ (*FilePointer_LocatorInfo_PlaintextHash)(nil), (*FilePointer_LocatorInfo_EncryptedDigest)(nil), } - file_backuppb_Backup_proto_msgTypes[116].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[119].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[120].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[123].OneofWrappers = []any{ (*GroupChangeChatUpdate_Update_GenericGroupUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupCreationUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupNameUpdate)(nil), @@ -12992,8 +13745,8 @@ func file_backuppb_Backup_proto_init() { (*GroupChangeChatUpdate_Update_GroupSequenceOfRequestsAndCancelsUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupExpirationTimerUpdate)(nil), } - file_backuppb_Backup_proto_msgTypes[120].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[122].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[124].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[126].OneofWrappers = []any{ (*ChatStyle_CustomChatColor_Solid)(nil), (*ChatStyle_CustomChatColor_Gradient)(nil), } @@ -13002,8 +13755,8 @@ func file_backuppb_Backup_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_backuppb_Backup_proto_rawDesc), len(file_backuppb_Backup_proto_rawDesc)), - NumEnums: 31, - NumMessages: 124, + NumEnums: 36, + NumMessages: 128, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/signalmeow/protobuf/backuppb/Backup.proto b/pkg/signalmeow/protobuf/backuppb/Backup.proto index 66125fc..1b70167 100644 --- a/pkg/signalmeow/protobuf/backuppb/Backup.proto +++ b/pkg/signalmeow/protobuf/backuppb/Backup.proto @@ -68,6 +68,40 @@ message AccountData { Color color = 3; } + enum SentMediaQuality { + UNKNOWN_QUALITY = 0; // Interpret as "Standard" + STANDARD = 1; + HIGH = 2; + } + + message AutoDownloadSettings { + enum AutoDownloadOption { + UNKNOWN = 0; // Interpret as "Never" + NEVER = 1; + WIFI = 2; + WIFI_AND_CELLULAR = 3; + } + + AutoDownloadOption images = 1; + AutoDownloadOption audio = 2; + AutoDownloadOption video = 3; + AutoDownloadOption documents = 4; + } + + enum AppTheme { + UNKNOWN_APP_THEME = 0; // Interpret as "System" + SYSTEM = 1; + LIGHT = 2; + DARK = 3; + } + + enum CallsUseLessDataSetting { + UNKNOWN_CALL_DATA_SETTING = 0; // Interpret as "Never" + NEVER = 1; + MOBILE_DATA_ONLY = 2; + WIFI_AND_MOBILE_DATA = 3; + } + message AccountSettings { bool readReceipts = 1; bool sealedSenderIndicators = 2; @@ -91,6 +125,16 @@ message AccountData { bool optimizeOnDeviceStorage = 20; // See zkgroup for integer particular values. Unset if backups are not enabled. optional uint64 backupTier = 21; + reserved /* showSealedSenderIndicators */ 22; + SentMediaQuality defaultSentMediaQuality = 23; + AutoDownloadSettings autoDownloadSettings = 24; + reserved /* wifiAutoDownloadSettings */ 25; + optional uint32 screenLockTimeoutMinutes = 26; // If unset, consider screen lock to be disabled. + optional bool pinReminders = 27; // If unset, consider pin reminders to be enabled. + AppTheme appTheme = 28; // If unset, treat the same as "Unknown" case + CallsUseLessDataSetting callsUseLessDataSetting = 29; // If unset, treat the same as "Unknown" case + bool allowSealedSenderFromAnyone = 30; + bool allowAutomaticKeyVerification = 31; } message SubscriberData { @@ -111,6 +155,18 @@ message AccountData { } } + message AndroidSpecificSettings { + enum NavigationBarSize { + UNKNOWN_BAR_SIZE = 0; // Intepret as "Normal" + NORMAL = 1; + COMPACT = 2; + } + + bool useSystemEmoji = 1; + bool screenshotSecurity = 2; + NavigationBarSize navigationBarSize = 3; // If unset, treat the same as "Unknown" case + } + bytes profileKey = 1; optional string username = 2; UsernameLink usernameLink = 3; @@ -122,6 +178,10 @@ message AccountData { AccountSettings accountSettings = 9; IAPSubscriberData backupsSubscriberData = 10; string svrPin = 11; + AndroidSpecificSettings androidSpecificSettings = 12; + string bioText = 13; + string bioEmoji = 14; + optional bytes keyTransparencyData = 15; } message Recipient { @@ -210,6 +270,7 @@ message Contact { string systemFamilyName = 19; string systemNickname = 20; optional AvatarColor avatarColor = 21; + optional bytes keyTransparencyData = 22; } message Group { @@ -402,6 +463,14 @@ message ChatItem { message DirectionlessMessageDetails { } + message PinDetails { + uint64 pinnedAtTimestamp = 1; + oneof pinExpiry { + uint64 pinExpiresAtTimestamp = 2; // timestamp when the pin should expire + bool pinNeverExpires = 3; + } + } + uint64 chatId = 1; // conversation id uint64 authorId = 2; // recipient id uint64 dateSent = 3; @@ -430,6 +499,8 @@ message ChatItem { DirectStoryReplyMessage directStoryReplyMessage = 19; // group story reply messages are not backed up Poll poll = 20; } + + PinDetails pinDetails = 21; // only set if message is pinned } message SendStatus { @@ -824,6 +895,7 @@ message Poll { bool allowMultiple = 2; repeated PollOption options = 3; // At least two bool hasEnded = 4; + repeated Reaction reactions = 5; } message ChatUpdateMessage { @@ -839,6 +911,7 @@ message ChatUpdateMessage { GroupCall groupCall = 8; LearnedProfileChatUpdate learnedProfileChange = 9; PollTerminateUpdate pollTerminate = 10; + PinMessageUpdate pinMessage = 11; } } @@ -1209,6 +1282,11 @@ message PollTerminateUpdate { string question = 2; // Between 1-100 characters } +message PinMessageUpdate { + uint64 targetSentTimestamp = 1; + uint64 authorId = 2; // recipient id +} + message StickerPack { bytes packId = 1; bytes packKey = 2; diff --git a/pkg/signalmeow/protobuf/update-protos.sh b/pkg/signalmeow/protobuf/update-protos.sh index d8fea17..d65567c 100755 --- a/pkg/signalmeow/protobuf/update-protos.sh +++ b/pkg/signalmeow/protobuf/update-protos.sh @@ -1,14 +1,14 @@ #!/bin/bash set -euo pipefail -ANDROID_GIT_REVISION=${1:-d261f3ebf51864da067b968ee3366ed3e7369c78} -DESKTOP_GIT_REVISION=${1:-fb566c48e0fa146dfe0bea077ecdb3ff846ef80a} +ANDROID_GIT_REVISION=${1:-bc6114f6e0d3a4b1dcdc472331505f2644185264} +DESKTOP_GIT_REVISION=${1:-a9063ec0c3c1079072c1e30e0749c1ae8be5500a} update_proto() { case "$1" in Signal-Android) REPO="Signal-Android" - prefix="libsignal-service/src/main/protowire/" + prefix="lib/libsignal-service/src/main/protowire/" GIT_REVISION=$ANDROID_GIT_REVISION ;; Signal-Android-App) From 28af2ed551dcd614be32a9e81b38bd34dbf661ef Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 13 Feb 2026 16:17:43 +0200 Subject: [PATCH 110/170] signalmeow/store: add missing signalmeow_device foreign keys --- pkg/signalmeow/store/upgrades/00-latest.sql | 10 ++++-- ...7-sender-key-info-foreign-key.postgres.sql | 10 ++++++ .../27-sender-key-info-foreign-key.sqlite.sql | 32 +++++++++++++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 pkg/signalmeow/store/upgrades/27-sender-key-info-foreign-key.postgres.sql create mode 100644 pkg/signalmeow/store/upgrades/27-sender-key-info-foreign-key.sqlite.sql diff --git a/pkg/signalmeow/store/upgrades/00-latest.sql b/pkg/signalmeow/store/upgrades/00-latest.sql index 8f54eac..fbb44ad 100644 --- a/pkg/signalmeow/store/upgrades/00-latest.sql +++ b/pkg/signalmeow/store/upgrades/00-latest.sql @@ -1,4 +1,4 @@ --- v0 -> v26 (compatible with v13+): Latest revision +-- v0 -> v27 (compatible with v13+): Latest revision CREATE TABLE signalmeow_device ( aci_uuid TEXT PRIMARY KEY, @@ -100,7 +100,9 @@ CREATE TABLE signalmeow_outbound_sender_key_info ( distribution_id TEXT NOT NULL, shared_with jsonb NOT NULL, - PRIMARY KEY (account_id, group_id) + PRIMARY KEY (account_id, group_id), + CONSTRAINT signalmeow_outbound_sender_key_info_device_fkey + FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE signalmeow_groups ( @@ -108,7 +110,9 @@ CREATE TABLE signalmeow_groups ( group_identifier TEXT NOT NULL, master_key TEXT NOT NULL, - PRIMARY KEY (account_id, group_identifier) + PRIMARY KEY (account_id, group_identifier), + CONSTRAINT signalmeow_groups_device_fkey + FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE signalmeow_recipients ( diff --git a/pkg/signalmeow/store/upgrades/27-sender-key-info-foreign-key.postgres.sql b/pkg/signalmeow/store/upgrades/27-sender-key-info-foreign-key.postgres.sql new file mode 100644 index 0000000..e9c0ee5 --- /dev/null +++ b/pkg/signalmeow/store/upgrades/27-sender-key-info-foreign-key.postgres.sql @@ -0,0 +1,10 @@ +-- v27 (compatible with v13+): Add missing foreign key for outbound sender key info and groups +DELETE FROM signalmeow_outbound_sender_key_info +WHERE NOT EXISTS(SELECT 1 FROM signalmeow_device WHERE aci_uuid=account_id); +ALTER TABLE signalmeow_outbound_sender_key_info ADD CONSTRAINT signalmeow_outbound_sender_key_info_device_fkey + FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE; + +DELETE FROM signalmeow_groups +WHERE NOT EXISTS(SELECT 1 FROM signalmeow_device WHERE aci_uuid=account_id); +ALTER TABLE signalmeow_groups ADD CONSTRAINT signalmeow_groups_device_fkey + FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/pkg/signalmeow/store/upgrades/27-sender-key-info-foreign-key.sqlite.sql b/pkg/signalmeow/store/upgrades/27-sender-key-info-foreign-key.sqlite.sql new file mode 100644 index 0000000..b6017ba --- /dev/null +++ b/pkg/signalmeow/store/upgrades/27-sender-key-info-foreign-key.sqlite.sql @@ -0,0 +1,32 @@ +-- v27 (compatible with v13+): Add missing foreign key for outbound sender key info and groups + +CREATE TABLE new_signalmeow_outbound_sender_key_info ( + account_id TEXT NOT NULL, + group_id TEXT NOT NULL, + distribution_id TEXT NOT NULL, + shared_with jsonb NOT NULL, + + PRIMARY KEY (account_id, group_id), + CONSTRAINT signalmeow_outbound_sender_key_info_device_fkey + FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE +); +INSERT INTO new_signalmeow_outbound_sender_key_info +SELECT * FROM signalmeow_outbound_sender_key_info +WHERE EXISTS(SELECT 1 FROM signalmeow_device WHERE aci_uuid=account_id); +DROP TABLE signalmeow_outbound_sender_key_info; +ALTER TABLE new_signalmeow_outbound_sender_key_info RENAME TO signalmeow_outbound_sender_key_info; + +CREATE TABLE new_signalmeow_groups ( + account_id TEXT NOT NULL, + group_identifier TEXT NOT NULL, + master_key TEXT NOT NULL, + + PRIMARY KEY (account_id, group_identifier), + CONSTRAINT signalmeow_groups_device_fkey + FOREIGN KEY (account_id) REFERENCES signalmeow_device (aci_uuid) ON DELETE CASCADE ON UPDATE CASCADE +); +INSERT INTO new_signalmeow_groups +SELECT * FROM signalmeow_groups +WHERE EXISTS(SELECT 1 FROM signalmeow_device WHERE aci_uuid=account_id); +DROP TABLE signalmeow_groups; +ALTER TABLE new_signalmeow_groups RENAME TO signalmeow_groups; From 3faa0d4f3091c462b447d9cc1f16d8a27d5c643e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 15 Feb 2026 13:08:11 +0200 Subject: [PATCH 111/170] main: bump minimum Go version to 1.25 --- .github/workflows/go.yml | 8 ++++---- go.mod | 4 ++-- pkg/signalmeow/groups.go | 3 +-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 767c119..ebd9186 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -11,8 +11,8 @@ jobs: strategy: fail-fast: false matrix: - go-version: ["1.24", "1.25"] - name: Lint ${{ matrix.go-version == '1.25' && '(latest)' || '(old)' }} + go-version: ["1.25", "1.26"] + name: Lint ${{ matrix.go-version == '1.26' && '(latest)' || '(old)' }} steps: - uses: actions/checkout@v6 @@ -40,8 +40,8 @@ jobs: strategy: fail-fast: false matrix: - go-version: ["1.24", "1.25"] - name: Test ${{ matrix.go-version == '1.25' && '(latest)' || '(old)' }} + go-version: ["1.25", "1.26"] + name: Test ${{ matrix.go-version == '1.26' && '(latest)' || '(old)' }} steps: - uses: actions/checkout@v6 diff --git a/go.mod b/go.mod index 728ffb7..340f05c 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module go.mau.fi/mautrix-signal -go 1.24.0 +go 1.25.0 -toolchain go1.25.6 +toolchain go1.26.0 tool go.mau.fi/util/cmd/maubuild diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index dcdfe7d..b02687b 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -226,8 +226,7 @@ func (groupChange *GroupChange) isEmpty() bool { len(groupChange.PromoteRequestingMembers) == 0 && groupChange.ModifyDescription == nil && groupChange.ModifyAnnouncementsOnly == nil && - len(groupChange.AddBannedMembers) == 0 && - len(groupChange.DeleteMembers) == 0 + len(groupChange.AddBannedMembers) == 0 } func (groupChange *GroupChange) resolveConflict(group *Group) { From 634f7c21caf96913a4b7cf93f5335d8ad25ecbb9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 16 Feb 2026 15:02:53 +0200 Subject: [PATCH 112/170] Bump version to v26.02 --- CHANGELOG.md | 7 +++++++ cmd/mautrix-signal/main.go | 2 +- go.mod | 20 +++++++++---------- go.sum | 40 +++++++++++++++++++------------------- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29f2299..f18590b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# v26.02 + +* Bumped minimum Go version to 1.25. +* Updated libsignal to v0.87.1. +* Added automatic recovery for the session not found error from libsignal. +* Fixed sender key state not being cleared on logout properly. + # v26.01 * Updated libsignal to v0.86.12. diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index 5391084..064b1e0 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -37,7 +37,7 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "26.01", + Version: "26.02", SemCalVer: true, Connector: &connector.SignalConnector{}, diff --git a/go.mod b/go.mod index 340f05c..3b6cc07 100644 --- a/go.mod +++ b/go.mod @@ -14,13 +14,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.5 - golang.org/x/crypto v0.47.0 - golang.org/x/exp v0.0.0-20260112195511-716be5621a96 - golang.org/x/net v0.49.0 + go.mau.fi/util v0.9.6 + golang.org/x/crypto v0.48.0 + golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a + golang.org/x/net v0.50.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.3-0.20260129174719-d2364b382275 + maunium.net/go/mautrix v0.26.3 ) require ( @@ -28,10 +28,10 @@ require ( github.com/coreos/go-systemd/v22 v22.6.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/lib/pq v1.10.9 // indirect + github.com/lib/pq v1.11.2 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.33 // indirect + github.com/mattn/go-sqlite3 v1.14.34 // indirect github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect @@ -42,10 +42,10 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/goldmark v1.7.16 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect - golang.org/x/mod v0.32.0 // indirect + golang.org/x/mod v0.33.0 // indirect golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.40.0 // indirect - golang.org/x/text v0.33.0 // indirect + golang.org/x/sys v0.41.0 // indirect + golang.org/x/text v0.34.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index 8dba58f..26c13e2 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.11.2 h1:x6gxUeu39V0BHZiugWe8LXZYZ+Utk7hSJGThs8sdzfs= +github.com/lib/pq v1.11.2/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= @@ -35,8 +35,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= -github.com/mattn/go-sqlite3 v1.14.33 h1:A5blZ5ulQo2AtayQ9/limgHEkFreKj1Dv226a1K73s0= -github.com/mattn/go-sqlite3 v1.14.33/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk= +github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 h1:KPpdlQLZcHfTMQRi6bFQ7ogNO0ltFT4PmtwTLW4W+14= github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -67,27 +67,27 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.5 h1:7AoWPCIZJGv4jvtFEuCe3GhAbI7uF9ckIooaXvwlIR4= -go.mau.fi/util v0.9.5/go.mod h1:g1uvZ03VQhtTt2BgaRGVytS/Zj67NV0YNIECch0sQCQ= +go.mau.fi/util v0.9.6 h1:2nsvxm49KhI3wrFltr0+wSUBlnQ4CMtykuELjpIU+ts= +go.mau.fi/util v0.9.6/go.mod h1:sIJpRH7Iy5Ad1SBuxQoatxtIeErgzxCtjd/2hCMkYMI= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= -golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= -golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= -golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= -golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= -golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= -golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= -golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= -golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a h1:ovFr6Z0MNmU7nH8VaX5xqw+05ST2uO1exVfZPVqRC5o= +golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= +golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= -golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= -golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -99,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.3-0.20260129174719-d2364b382275 h1:r8BL0+HW4Dar1xV7Fc7NV/LxGH6VCvffkCUGe9ZfJg8= -maunium.net/go/mautrix v0.26.3-0.20260129174719-d2364b382275/go.mod h1:CUxSZcjPtQNxsZLRQqETAxg2hiz7bjWT+L1HCYoMMKo= +maunium.net/go/mautrix v0.26.3 h1:tWZih6Vjw0qGTWuPmg9JUrQPzViTNDPGQLVc5UXC4nk= +maunium.net/go/mautrix v0.26.3/go.mod h1:v5ZdDoCwUpNqEj5OrhEoUa3L1kEddKPaAya9TgGXN38= From 375c51e7b884f742d526c167418c71750d827398 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 23 Feb 2026 15:11:56 +0200 Subject: [PATCH 113/170] handle*,msgconv,signalmeow: add support for binary ACI fields Fixes #635 --- pkg/connector/handlematrix.go | 20 ++++++++++++-------- pkg/connector/handlesignal.go | 28 ++++++++++++++++++++++------ pkg/libsignalgo/serviceid.go | 15 +++++++++++++++ pkg/msgconv/from-matrix.go | 4 +++- pkg/msgconv/from-signal.go | 2 +- pkg/signalmeow/misc.go | 28 ++++++++++++++++++++++++++++ pkg/signalmeow/receiving.go | 8 ++++++-- pkg/signalmeow/receiving_decrypt.go | 16 +++++----------- 8 files changed, 92 insertions(+), 29 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 610dd81..8819d69 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -205,9 +205,11 @@ func (s *SignalClient) HandleMatrixReaction(ctx context.Context, msg *bridgev2.M Timestamp: proto.Uint64(ts), RequiredProtocolVersion: proto.Uint32(uint32(signalpb.DataMessage_REACTIONS)), Reaction: &signalpb.DataMessage_Reaction{ - Emoji: proto.String(msg.PreHandleResp.Emoji), - Remove: proto.Bool(false), - TargetAuthorAci: proto.String(targetAuthorACI.String()), + Emoji: proto.String(msg.PreHandleResp.Emoji), + Remove: proto.Bool(false), + TargetAuthorAci: proto.String(targetAuthorACI.String()), + // TODO update aci format + //TargetAuthorAciBinary: targetAuthorACI[:], TargetSentTimestamp: proto.Uint64(targetSentTimestamp), }, }, @@ -230,9 +232,11 @@ func (s *SignalClient) HandleMatrixReactionRemove(ctx context.Context, msg *brid Timestamp: proto.Uint64(ts), RequiredProtocolVersion: proto.Uint32(uint32(signalpb.DataMessage_REACTIONS)), Reaction: &signalpb.DataMessage_Reaction{ - Emoji: proto.String(msg.TargetReaction.Emoji), - Remove: proto.Bool(true), - TargetAuthorAci: proto.String(targetAuthorACI.String()), + Emoji: proto.String(msg.TargetReaction.Emoji), + Remove: proto.Bool(true), + TargetAuthorAci: proto.String(targetAuthorACI.String()), + // TODO update aci format + //TargetAuthorAciBinary: targetAuthorACI[:], TargetSentTimestamp: proto.Uint64(targetSentTimestamp), }, }, @@ -760,8 +764,8 @@ func (s *SignalClient) HandleMatrixDeleteChat(ctx context.Context, msg *bridgev2 } mostRecentMessages = append(mostRecentMessages, &signalpb.AddressableMessage{ - Author: &signalpb.AddressableMessage_AuthorServiceId{ - AuthorServiceId: senderACI.String(), + Author: &signalpb.AddressableMessage_AuthorServiceIdBinary{ + AuthorServiceIdBinary: senderACI[:], }, SentTimestamp: proto.Uint64(timestamp), }) diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index fb1a3ce..f248d48 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -37,6 +37,7 @@ import ( "go.mau.fi/mautrix-signal/pkg/libsignalgo" "go.mau.fi/mautrix-signal/pkg/signalid" + "go.mau.fi/mautrix-signal/pkg/signalmeow" "go.mau.fi/mautrix-signal/pkg/signalmeow/events" signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" "go.mau.fi/mautrix-signal/pkg/signalmeow/types" @@ -292,13 +293,13 @@ func (evt *Bv2ChatEvent) GetTimestamp() time.Time { } func (evt *Bv2ChatEvent) GetTargetMessage() networkid.MessageID { - var targetAuthorACI string + var targetAuthorACI uuid.UUID var targetSentTS uint64 switch innerEvt := evt.Event.(type) { case *signalpb.DataMessage: switch { case innerEvt.Reaction != nil: - targetAuthorACI = innerEvt.Reaction.GetTargetAuthorAci() + targetAuthorACI, _ = signalmeow.ParseStringOrBinaryUUID(innerEvt.Reaction.GetTargetAuthorAci(), innerEvt.Reaction.GetTargetAuthorAciBinary()) targetSentTS = innerEvt.Reaction.GetTargetSentTimestamp() case innerEvt.Delete != nil: targetSentTS = innerEvt.Delete.GetTargetSentTimestamp() @@ -310,11 +311,10 @@ func (evt *Bv2ChatEvent) GetTargetMessage() networkid.MessageID { default: return "" } - targetAuthorUUID := evt.Info.Sender - if targetAuthorACI != "" { - targetAuthorUUID, _ = uuid.Parse(targetAuthorACI) + if targetAuthorACI == uuid.Nil { + targetAuthorACI = evt.Info.Sender } - return signalid.MakeMessageID(targetAuthorUUID, targetSentTS) + return signalid.MakeMessageID(targetAuthorACI, targetSentTS) } func (evt *Bv2ChatEvent) GetReactionEmoji() (string, networkid.EmojiID) { @@ -537,6 +537,22 @@ func (s *SignalClient) addressableMessageToID(ctx context.Context, portalKey net return "" } return signalid.MakeMessageID(serviceID.UUID, am.GetSentTimestamp()) + case *signalpb.AddressableMessage_AuthorServiceIdBinary: + serviceID, err := libsignalgo.ServiceIDFromBytes(typedAuthor.AuthorServiceIdBinary) + if err != nil { + log.Err(err). + Object("portal_key", portalKey). + Hex("author_service_id_binary", typedAuthor.AuthorServiceIdBinary). + Msg("Failed to parse delete for me message author service ID") + return "" + } else if serviceID.Type != libsignalgo.ServiceIDTypeACI { + log.Warn(). + Object("portal_key", portalKey). + Hex("author_service_id_binary", typedAuthor.AuthorServiceIdBinary). + Msg("Dropping delete for me message with unsupported service ID type") + return "" + } + return signalid.MakeMessageID(serviceID.UUID, am.GetSentTimestamp()) case *signalpb.AddressableMessage_AuthorE164: log.Warn(). Object("portal_key", portalKey). diff --git a/pkg/libsignalgo/serviceid.go b/pkg/libsignalgo/serviceid.go index ae7cea7..21d64b2 100644 --- a/pkg/libsignalgo/serviceid.go +++ b/pkg/libsignalgo/serviceid.go @@ -87,6 +87,9 @@ func (s ServiceID) IsEmpty() bool { } func (s ServiceID) Address(deviceID uint) (*Address, error) { + if s.IsEmpty() { + return nil, fmt.Errorf("cannot create address from empty ServiceID") + } return newAddress(s.String(), deviceID) } @@ -158,6 +161,18 @@ func ServiceIDFromString(val string) (ServiceID, error) { } } +func ServiceIDFromBytes(bytes []byte) (ServiceID, error) { + if len(bytes) == 16 { + return NewACIServiceID(uuid.UUID(bytes)), nil + } else if len(bytes) == 17 { + return ServiceID{ + Type: ServiceIDType(bytes[0]), + UUID: uuid.UUID(bytes[1:]), + }, nil + } + return EmptyServiceID, fmt.Errorf("invalid ServiceID byte length: %d (expected 16 or 17)", len(bytes)) +} + func ServiceIDFromCFixedBytes(serviceID *C.SignalServiceIdFixedWidthBinaryBytes) ServiceID { var id ServiceID fixedBytes := (*ServiceIDFixedBytes)(unsafe.Pointer(serviceID)) diff --git a/pkg/msgconv/from-matrix.go b/pkg/msgconv/from-matrix.go index 67352f1..fa5deb4 100644 --- a/pkg/msgconv/from-matrix.go +++ b/pkg/msgconv/from-matrix.go @@ -62,7 +62,9 @@ func (mc *MessageConverter) ToSignal( dm.Quote = &signalpb.DataMessage_Quote{ Id: proto.Uint64(messageID), AuthorAci: proto.String(authorACI.String()), - Type: signalpb.DataMessage_Quote_NORMAL.Enum(), + // TODO update aci format + //AuthorAciBinary: authorACI[:], + Type: signalpb.DataMessage_Quote_NORMAL.Enum(), } if replyTo.Metadata.(*signalid.MessageMetadata).ContainsAttachments { dm.Quote.Attachments = make([]*signalpb.DataMessage_Quote_QuotedAttachment, 1) diff --git a/pkg/msgconv/from-signal.go b/pkg/msgconv/from-signal.go index c8ac40e..dadfe3f 100644 --- a/pkg/msgconv/from-signal.go +++ b/pkg/msgconv/from-signal.go @@ -174,7 +174,7 @@ func (mc *MessageConverter) ToMatrix( } } if dm.Quote != nil { - authorACI, err := uuid.Parse(dm.Quote.GetAuthorAci()) + authorACI, err := signalmeow.ParseStringOrBinaryUUID(dm.Quote.GetAuthorAci(), dm.Quote.GetAuthorAciBinary()) if err != nil { zerolog.Ctx(ctx).Err(err).Str("author_aci", dm.Quote.GetAuthorAci()).Msg("Failed to parse quote author ACI") } else { diff --git a/pkg/signalmeow/misc.go b/pkg/signalmeow/misc.go index 1bf88a3..467f646 100644 --- a/pkg/signalmeow/misc.go +++ b/pkg/signalmeow/misc.go @@ -18,7 +18,10 @@ package signalmeow import ( _ "embed" + "errors" + "fmt" + "github.com/google/uuid" "github.com/rs/zerolog" "go.mau.fi/util/exerrors" @@ -76,3 +79,28 @@ var prodServerPublicParams *libsignalgo.ServerPublicParams func init() { prodServerPublicParams = exerrors.Must(libsignalgo.DeserializeServerPublicParams(prodServerPublicParamsSlice)) } + +var ErrEmptyUUIDInput = errors.New("both input variables are empty") + +func ParseStringOrBinaryServiceID(str string, bytes []byte) (libsignalgo.ServiceID, error) { + if str != "" { + return libsignalgo.ServiceIDFromString(str) + } + if bytes != nil { + return libsignalgo.ServiceIDFromBytes(bytes) + } + return libsignalgo.EmptyServiceID, ErrEmptyUUIDInput +} + +func ParseStringOrBinaryUUID(str string, bytes []byte) (uuid.UUID, error) { + if str != "" { + return uuid.Parse(str) + } + if bytes != nil { + if len(bytes) != 16 { + return uuid.Nil, fmt.Errorf("invalid UUID length %d (expected 16)", len(bytes)) + } + return uuid.UUID(bytes), nil + } + return uuid.Nil, ErrEmptyUUIDInput +} diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index b802e06..2dd1d64 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -361,17 +361,21 @@ func (cli *Client) incomingAPIMessageHandler(ctx context.Context, req *signalpb. Uint64("server_timestamp", envelope.GetServerTimestamp()). Logger() ctx = log.WithContext(ctx) - destinationServiceID, err := libsignalgo.ServiceIDFromString(envelope.GetDestinationServiceId()) + destinationServiceID, _ := ParseStringOrBinaryServiceID(envelope.GetDestinationServiceId(), envelope.GetDestinationServiceIdBinary()) + sourceServiceID, _ := ParseStringOrBinaryServiceID(envelope.GetSourceServiceId(), envelope.GetSourceServiceIdBinary()) log.Debug(). Str("destination_service_id", envelope.GetDestinationServiceId()). Str("source_service_id", envelope.GetSourceServiceId()). + Hex("destination_service_id_bytes", envelope.GetDestinationServiceIdBinary()). + Hex("source_service_id_bytes", envelope.GetSourceServiceIdBinary()). Uint32("source_device_id", envelope.GetSourceDevice()). Object("parsed_destination_service_id", destinationServiceID). + Object("parsed_source_service_id", sourceServiceID). Int32("envelope_type_id", int32(envelope.GetType())). Str("envelope_type", signalpb.Envelope_Type_name[int32(envelope.GetType())]). Msg("Received envelope") - result := cli.decryptEnvelope(ctx, envelope) + result := cli.decryptEnvelope(ctx, envelope, sourceServiceID, destinationServiceID) err = cli.handleDecryptedResult(ctx, result, envelope, destinationServiceID) if err != nil { diff --git a/pkg/signalmeow/receiving_decrypt.go b/pkg/signalmeow/receiving_decrypt.go index 5c8da08..958f84f 100644 --- a/pkg/signalmeow/receiving_decrypt.go +++ b/pkg/signalmeow/receiving_decrypt.go @@ -50,13 +50,10 @@ type DecryptionResult struct { func (cli *Client) decryptEnvelope( ctx context.Context, envelope *signalpb.Envelope, + sourceServiceID, destinationServiceID libsignalgo.ServiceID, ) DecryptionResult { - log := zerolog.Ctx(ctx) - - destinationServiceID, err := libsignalgo.ServiceIDFromString(envelope.GetDestinationServiceId()) - if err != nil { - log.Err(err).Str("destination_service_id", envelope.GetDestinationServiceId()).Msg("Failed to parse destination service ID") - return DecryptionResult{Err: fmt.Errorf("failed to parse destination service ID: %w", err)} + if destinationServiceID.IsEmpty() { + return DecryptionResult{Err: fmt.Errorf("envelope missing destination service ID")} } switch *envelope.Type { @@ -68,10 +65,7 @@ func (cli *Client) decryptEnvelope( return result case signalpb.Envelope_PREKEY_BUNDLE, signalpb.Envelope_CIPHERTEXT: - sender, err := libsignalgo.NewUUIDAddressFromString( - *envelope.SourceServiceId, - uint(*envelope.SourceDevice), - ) + sender, err := sourceServiceID.Address(uint(envelope.GetSourceDevice())) if err != nil { return DecryptionResult{Err: fmt.Errorf("failed to wrap address: %v", err)} } @@ -96,7 +90,7 @@ func (cli *Client) decryptEnvelope( return *result case signalpb.Envelope_PLAINTEXT_CONTENT: - addr, err := libsignalgo.NewUUIDAddressFromString(envelope.GetSourceServiceId(), uint(envelope.GetSourceDevice())) + addr, err := sourceServiceID.Address(uint(envelope.GetSourceDevice())) if err != nil { return DecryptionResult{Err: fmt.Errorf("failed to wrap address: %v", err)} } From af5f936d3e9de27f0d4e7091e10fdb855eb28ae7 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 24 Feb 2026 13:48:39 +0200 Subject: [PATCH 114/170] signalmeow: add support for binary ACI field in sync messages --- pkg/signalmeow/receiving.go | 24 +++++++++--------------- pkg/signalmeow/sending.go | 32 ++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 2dd1d64..d3d039c 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -714,21 +714,15 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess } syncSent := msg.GetSent() if syncSent.GetMessage() != nil || syncSent.GetEditMessage() != nil { - destination := syncSent.DestinationServiceId - var syncDestinationServiceID libsignalgo.ServiceID - if destination != nil { - var err error - syncDestinationServiceID, err = libsignalgo.ServiceIDFromString(*destination) + syncDestinationServiceID, err := ParseStringOrBinaryServiceID(syncSent.GetDestinationServiceId(), syncSent.GetDestinationServiceIdBinary()) + if err != nil && !errors.Is(err, ErrEmptyUUIDInput) { + log.Err(err).Msg("Sync message destination parse error") + } + if syncSent.GetDestinationE164() != "" && !syncDestinationServiceID.IsEmpty() { + aci, pni := syncDestinationServiceID.ToACIAndPNI() + _, err = cli.Store.RecipientStore.UpdateRecipientE164(ctx, aci, pni, syncSent.GetDestinationE164()) if err != nil { - log.Err(err).Msg("Sync message destination parse error") - return - } - if syncSent.GetDestinationE164() != "" { - aci, pni := syncDestinationServiceID.ToACIAndPNI() - _, err = cli.Store.RecipientStore.UpdateRecipientE164(ctx, aci, pni, syncSent.GetDestinationE164()) - if err != nil { - log.Err(err).Msg("Failed to update recipient E164 after receiving sync message") - } + log.Err(err).Msg("Failed to update recipient E164 after receiving sync message") } } for _, unident := range syncSent.GetUnidentifiedStatus() { @@ -744,7 +738,7 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess } } - if destination == nil && syncSent.GetMessage().GetGroupV2() == nil && syncSent.GetEditMessage().GetDataMessage().GetGroupV2() == nil { + if syncDestinationServiceID.IsEmpty() && syncSent.GetMessage().GetGroupV2() == nil && syncSent.GetEditMessage().GetDataMessage().GetGroupV2() == nil { log.Warn().Msg("sync message sent destination is nil") } else if msg.Sent.Message != nil { // TODO handle expiration start ts, and maybe the sync message ts? diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 8e6b892..86bc1db 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -307,7 +307,9 @@ func syncMessageFromGroupDataMessage(dataMessage *signalpb.DataMessage, results for _, result := range results { unidentifiedStatuses = append(unidentifiedStatuses, &signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ DestinationServiceId: proto.String(result.Recipient.String()), - Unidentified: &result.Unidentified, + // TODO update aci format + //DestinationServiceIdBinary: result.Recipient.Bytes(), + Unidentified: &result.Unidentified, }) } return &signalpb.Content{ @@ -326,7 +328,9 @@ func syncMessageFromGroupEditMessage(editMessage *signalpb.EditMessage, results for _, result := range results { unidentifiedStatuses = append(unidentifiedStatuses, &signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ DestinationServiceId: proto.String(result.Recipient.String()), - Unidentified: &result.Unidentified, + // TODO update aci format + //DestinationServiceIdBinary: result.Recipient.Bytes(), + Unidentified: &result.Unidentified, }) } return &signalpb.Content{ @@ -345,14 +349,18 @@ func syncMessageFromSoloDataMessage(dataMessage *signalpb.DataMessage, result Su return &signalpb.Content{ SyncMessage: &signalpb.SyncMessage{ Sent: &signalpb.SyncMessage_Sent{ - Message: dataMessage, - DestinationE164: result.RecipientE164, - DestinationServiceId: proto.String(result.Recipient.String()), + Message: dataMessage, + DestinationE164: result.RecipientE164, + DestinationServiceId: proto.String(result.Recipient.String()), + // TODO update aci format + //DestinationServiceIdBinary: result.Recipient.Bytes(), Timestamp: dataMessage.Timestamp, ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), UnidentifiedStatus: []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ { - DestinationServiceId: proto.String(result.Recipient.String()), + DestinationServiceId: proto.String(result.Recipient.String()), + // TODO update aci format + //DestinationServiceIdBinary: result.Recipient.Bytes(), Unidentified: &result.Unidentified, DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), }, @@ -366,14 +374,18 @@ func syncMessageFromSoloEditMessage(editMessage *signalpb.EditMessage, result Su return &signalpb.Content{ SyncMessage: &signalpb.SyncMessage{ Sent: &signalpb.SyncMessage_Sent{ - EditMessage: editMessage, - DestinationE164: result.RecipientE164, - DestinationServiceId: proto.String(result.Recipient.String()), + EditMessage: editMessage, + DestinationE164: result.RecipientE164, + DestinationServiceId: proto.String(result.Recipient.String()), + // TODO update aci format + //DestinationServiceIdBinary: result.Recipient.Bytes(), Timestamp: editMessage.DataMessage.Timestamp, ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), UnidentifiedStatus: []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ { - DestinationServiceId: proto.String(result.Recipient.String()), + DestinationServiceId: proto.String(result.Recipient.String()), + // TODO update aci format + //DestinationServiceIdBinary: result.Recipient.Bytes(), Unidentified: &result.Unidentified, DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), }, From 09ba9d04b2b1f9e6d44fa93cbabc009ec8851962 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 24 Feb 2026 14:05:11 +0200 Subject: [PATCH 115/170] signalmeow/receiving: add support for binary ACI field in unidentified send statuses --- pkg/signalmeow/receiving.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index d3d039c..3d81259 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -726,14 +726,22 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess } } for _, unident := range syncSent.GetUnidentifiedStatus() { - changed, err := cli.saveSyncPNIIdentityKey(ctx, unident.GetDestinationServiceId(), unident.GetDestinationPniIdentityKey()) + serviceID, err := ParseStringOrBinaryServiceID(unident.GetDestinationServiceId(), unident.GetDestinationServiceIdBinary()) if err != nil { log.Err(err). Str("destination_service_id", unident.GetDestinationServiceId()). + Hex("destination_service_id_bytes", unident.GetDestinationServiceIdBinary()). + Msg("Failed to parse destination service ID of unidentified send") + continue + } + changed, err := cli.saveSyncPNIIdentityKey(ctx, serviceID, unident.GetDestinationPniIdentityKey()) + if err != nil { + log.Err(err). + Stringer("destination_service_id", serviceID). Msg("Failed to save PNI identity key from sync message") } else if changed { log.Debug(). - Str("destination_service_id", unident.GetDestinationServiceId()). + Stringer("destination_service_id", serviceID). Msg("Saved new PNI identity key from sync message") } } @@ -828,20 +836,14 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess return } -func (cli *Client) saveSyncPNIIdentityKey(ctx context.Context, serviceIDString string, identityKeyBytes []byte) (bool, error) { - if identityKeyBytes == nil { +func (cli *Client) saveSyncPNIIdentityKey(ctx context.Context, serviceID libsignalgo.ServiceID, identityKeyBytes []byte) (bool, error) { + if identityKeyBytes == nil || serviceID.Type != libsignalgo.ServiceIDTypePNI { return false, nil } identityKey, err := libsignalgo.DeserializeIdentityKey(identityKeyBytes) if err != nil { return false, fmt.Errorf("failed to deserialize PNI identity key: %w", err) } - serviceID, err := libsignalgo.ServiceIDFromString(serviceIDString) - if err != nil { - return false, fmt.Errorf("failed to parse PNI service ID: %w", err) - } else if serviceID.Type != libsignalgo.ServiceIDTypePNI { - return false, nil - } changed, err := cli.Store.IdentityKeyStore.SaveIdentityKey(ctx, serviceID, identityKey) if err != nil { return false, fmt.Errorf("failed to save PNI identity key: %w", err) From ee306f5221ad9d259d94532c35b20dc372a8c82a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 27 Feb 2026 14:52:27 +0200 Subject: [PATCH 116/170] libsignal: update to v0.87.5 --- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/version.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index f08390b..ffaa9f0 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit f08390b0e2f67d5faf47bb9d1a3db191314db93c +Subproject commit ffaa9f0435569d6775d8be636f268f882ed67ce3 diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index 8f445ad..bb1774c 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.87.1" +const Version = "v0.87.5" From 2447903e036c1e77ccf0ccf8c5d541d931d7220a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 27 Feb 2026 15:26:42 +0200 Subject: [PATCH 117/170] libsignalgo: add -lstdc++ to cflags --- pkg/libsignalgo/cflags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/libsignalgo/cflags.go b/pkg/libsignalgo/cflags.go index 12c1e0c..e1bb7d5 100644 --- a/pkg/libsignalgo/cflags.go +++ b/pkg/libsignalgo/cflags.go @@ -1,6 +1,6 @@ package libsignalgo /* -#cgo LDFLAGS: -lsignal_ffi -ldl -lm -lz +#cgo LDFLAGS: -lsignal_ffi -ldl -lm -lz -lstdc++ */ import "C" From 6a6e5d50dfe7416cf56874baa41b5d76b053295b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 27 Feb 2026 17:36:33 +0200 Subject: [PATCH 118/170] Bump version to v26.02.1 --- CHANGELOG.md | 5 +++++ cmd/mautrix-signal/main.go | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f18590b..7c6869c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v26.02.1 + +* Updated libsignal to v0.87.5. +* Added support for new binary service ID fields that Signal 8.0 switched to. + # v26.02 * Bumped minimum Go version to 1.25. diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index 064b1e0..ab7fd46 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -37,7 +37,7 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "26.02", + Version: "26.02.1", SemCalVer: true, Connector: &connector.SignalConnector{}, From cc4b81da6c760f204df7dc57094b6d22c13b80bb Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 28 Feb 2026 12:08:26 +0200 Subject: [PATCH 119/170] handlesignal: add support for binary service IDs in delete for me events Fixes #638 --- pkg/connector/handlesignal.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index f248d48..843dd10 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -499,6 +499,13 @@ func (s *SignalClient) conversationIDToPortalKey(ctx context.Context, cid *signa return networkid.PortalKey{}, false } return s.makeDMPortalKey(serviceID), true + case *signalpb.ConversationIdentifier_ThreadServiceIdBinary: + serviceID, err := libsignalgo.ServiceIDFromBytes(ident.ThreadServiceIdBinary) + if err != nil { + log.Err(err).Hex("chat_id", ident.ThreadServiceIdBinary).Msg("Failed to parse delete for me conversation ID") + return networkid.PortalKey{}, false + } + return s.makeDMPortalKey(serviceID), true case *signalpb.ConversationIdentifier_ThreadGroupId: if len(ident.ThreadGroupId) != libsignalgo.GroupIdentifierLength { log.Error(). From 0442a32f6816cead7cc91f8f8d36c5b8f2006a47 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 28 Feb 2026 12:27:46 +0200 Subject: [PATCH 120/170] handlesignal,msgconv,signalmeow: add support for remaining binary ACI fields --- pkg/connector/handlesignal.go | 2 +- pkg/msgconv/msgconv.go | 4 ++-- pkg/msgconv/signalfmt/convert.go | 15 ++++++++++++--- pkg/signalmeow/contact.go | 2 +- pkg/signalmeow/receiving.go | 2 +- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index 843dd10..bc0dbe3 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -480,7 +480,7 @@ func (s *SignalClient) handleSignalReadSelf(evt *events.ReadSelf) bool { Logger() ctx := log.WithContext(context.TODO()) receipts := convertReceipts(ctx, evt.Messages, func(ctx context.Context, msgInfo *signalpb.SyncMessage_Read) (*database.Message, error) { - aciUUID, err := uuid.Parse(msgInfo.GetSenderAci()) + aciUUID, err := signalmeow.ParseStringOrBinaryUUID(msgInfo.GetSenderAci(), msgInfo.GetSenderAciBinary()) if err != nil { return nil, err } diff --git a/pkg/msgconv/msgconv.go b/pkg/msgconv/msgconv.go index 1b8564a..e312a1f 100644 --- a/pkg/msgconv/msgconv.go +++ b/pkg/msgconv/msgconv.go @@ -78,7 +78,7 @@ func NewMessageConverter(br *bridgev2.Bridge) *MessageConverter { GetUUIDFromMXID: func(ctx context.Context, userID id.UserID) uuid.UUID { parsed, ok := br.Matrix.ParseGhostMXID(userID) if ok { - u, _ := uuid.Parse(string(parsed)) + u, _ := signalid.ParseUserID(parsed) return u } user, _ := br.GetExistingUserByMXID(ctx, userID) @@ -86,7 +86,7 @@ func NewMessageConverter(br *bridgev2.Bridge) *MessageConverter { if user != nil { preferredLogin, _, _ := getPortal(ctx).FindPreferredLogin(ctx, user, true) if preferredLogin != nil { - u, _ := uuid.Parse(string(preferredLogin.ID)) + u, _ := signalid.ParseUserLoginID(preferredLogin.ID) return u } } diff --git a/pkg/msgconv/signalfmt/convert.go b/pkg/msgconv/signalfmt/convert.go index f950a59..5a9b520 100644 --- a/pkg/msgconv/signalfmt/convert.go +++ b/pkg/msgconv/signalfmt/convert.go @@ -85,15 +85,24 @@ func Parse(ctx context.Context, message string, ranges []*signalpb.BodyRange, pa Start: int(*r.Start), Length: int(*r.Length), }.TruncateEnd(maxLength) + var mentionACI uuid.UUID switch rv := r.GetAssociatedValue().(type) { case *signalpb.BodyRange_Style_: br.Value = Style(rv.Style) case *signalpb.BodyRange_MentionAci: - parsed, err := uuid.Parse(rv.MentionAci) + var err error + mentionACI, err = uuid.Parse(rv.MentionAci) if err != nil { continue } - userInfo := params.GetUserInfo(ctx, parsed) + case *signalpb.BodyRange_MentionAciBinary: + if len(rv.MentionAciBinary) != 16 { + continue + } + mentionACI = uuid.UUID(rv.MentionAciBinary) + } + if mentionACI != uuid.Nil { + userInfo := params.GetUserInfo(ctx, mentionACI) if userInfo.MXID == "" { continue } @@ -102,7 +111,7 @@ func Parse(ctx context.Context, message string, ranges []*signalpb.BodyRange, pa // Maybe use NewUTF16String and do index replacements for the plaintext body too, // or just replace the plaintext body by parsing the generated HTML. content.Body = strings.Replace(content.Body, "\uFFFC", userInfo.Name, 1) - br.Value = Mention{UserInfo: userInfo, UUID: parsed} + br.Value = Mention{UserInfo: userInfo, UUID: mentionACI} } lrt.Add(br) } diff --git a/pkg/signalmeow/contact.go b/pkg/signalmeow/contact.go index 8407b74..f30f54f 100644 --- a/pkg/signalmeow/contact.go +++ b/pkg/signalmeow/contact.go @@ -36,7 +36,7 @@ import ( ) func (cli *Client) StoreContactDetailsAsContact(ctx context.Context, contactDetails *signalpb.ContactDetails, avatar *[]byte) (*types.Recipient, error) { - parsedUUID, err := uuid.Parse(contactDetails.GetAci()) + parsedUUID, err := ParseStringOrBinaryUUID(contactDetails.GetAci(), contactDetails.GetAciBinary()) if err != nil { return nil, err } diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 3d81259..142bc0f 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -809,7 +809,7 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess }) } if msg.MessageRequestResponse != nil { - aciUUID, _ := uuid.Parse(msg.MessageRequestResponse.GetThreadAci()) + aciUUID, _ := ParseStringOrBinaryUUID(msg.MessageRequestResponse.GetThreadAci(), msg.MessageRequestResponse.GetThreadAciBinary()) if aciUUID != uuid.Nil && msg.MessageRequestResponse.GetType() == signalpb.SyncMessage_MessageRequestResponse_ACCEPT { _, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aciUUID, uuid.Nil, func(recipient *types.Recipient) (changed bool, err error) { changed = !ptr.Val(recipient.Whitelisted) || recipient.NeedsPNISignature From d9dc134b9640bd1ec432f43254e7afcfcf635287 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 28 Feb 2026 12:35:29 +0200 Subject: [PATCH 121/170] login: fix context used for background connection --- pkg/connector/login.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/connector/login.go b/pkg/connector/login.go index 5cfdae1..9116390 100644 --- a/pkg/connector/login.go +++ b/pkg/connector/login.go @@ -75,7 +75,7 @@ func (qr *QRLogin) Start(ctx context.Context) (*bridgev2.LoginStep, error) { Str("action", "login"). Stringer("user_id", qr.User.MXID). Logger() - provCtx, cancel := context.WithCancel(log.WithContext(context.Background())) + provCtx, cancel := context.WithCancel(log.WithContext(qr.Main.Bridge.BackgroundCtx)) qr.cancelChan = cancel // Don't use the start context here: the channel will outlive the start request. qr.ProvChan = signalmeow.PerformProvisioning( From 7e72153efb6cb26f8bf2b3c3a434a0927fdc0717 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 2 Mar 2026 14:25:40 +0200 Subject: [PATCH 122/170] msgconv/signalfmt: ignore unsupported body ranges --- pkg/msgconv/signalfmt/convert.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/msgconv/signalfmt/convert.go b/pkg/msgconv/signalfmt/convert.go index 5a9b520..412af36 100644 --- a/pkg/msgconv/signalfmt/convert.go +++ b/pkg/msgconv/signalfmt/convert.go @@ -23,6 +23,7 @@ import ( "strings" "github.com/google/uuid" + "github.com/rs/zerolog" "golang.org/x/exp/maps" "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" @@ -100,6 +101,9 @@ func Parse(ctx context.Context, message string, ranges []*signalpb.BodyRange, pa continue } mentionACI = uuid.UUID(rv.MentionAciBinary) + default: + zerolog.Ctx(ctx).Warn().Type("value_type", rv).Msg("Unsupported body range type") + continue } if mentionACI != uuid.Nil { userInfo := params.GetUserInfo(ctx, mentionACI) From 509dfbde0a96813d837bd7bb54140dc84ce893d6 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 2 Mar 2026 14:30:01 +0200 Subject: [PATCH 123/170] Bump version to v26.02.2 --- CHANGELOG.md | 4 ++++ cmd/mautrix-signal/main.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c6869c..dd0a2d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v26.02.2 + +* Added support for more new binary service ID fields. + # v26.02.1 * Updated libsignal to v0.87.5. diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index ab7fd46..7f1d5fe 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -37,7 +37,7 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "26.02.1", + Version: "26.02.2", SemCalVer: true, Connector: &connector.SignalConnector{}, From cb7849efd6b1918f07faf4129b58588160941b46 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 6 Mar 2026 00:12:23 +0200 Subject: [PATCH 124/170] signalmeow,msgconv/from-signal: add support for transferring attachments via disk --- go.mod | 6 +- go.sum | 12 +-- pkg/connector/directmedia.go | 16 ++-- pkg/msgconv/from-signal.go | 108 +++++++++++++++++-------- pkg/signalmeow/attachments.go | 143 ++++++++++++++++++++++++++++++++-- pkg/signalmeow/receiving.go | 3 +- 6 files changed, 229 insertions(+), 59 deletions(-) diff --git a/go.mod b/go.mod index 3b6cc07..6758d92 100644 --- a/go.mod +++ b/go.mod @@ -16,15 +16,15 @@ require ( github.com/tidwall/gjson v1.18.0 go.mau.fi/util v0.9.6 golang.org/x/crypto v0.48.0 - golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a + golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa golang.org/x/net v0.50.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.3 + maunium.net/go/mautrix v0.26.4-0.20260305215735-7836f35a1a74 ) require ( - filippo.io/edwards25519 v1.1.0 // indirect + filippo.io/edwards25519 v1.2.0 // indirect github.com/coreos/go-systemd/v22 v22.6.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/pretty v0.3.1 // indirect diff --git a/go.sum b/go.sum index 26c13e2..78bfb4e 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= +filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= @@ -73,8 +73,8 @@ go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a h1:ovFr6Z0MNmU7nH8VaX5xqw+05ST2uO1exVfZPVqRC5o= -golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= @@ -99,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.3 h1:tWZih6Vjw0qGTWuPmg9JUrQPzViTNDPGQLVc5UXC4nk= -maunium.net/go/mautrix v0.26.3/go.mod h1:v5ZdDoCwUpNqEj5OrhEoUa3L1kEddKPaAya9TgGXN38= +maunium.net/go/mautrix v0.26.4-0.20260305215735-7836f35a1a74 h1:kHlana4CKRoAzPGbagU82y+uN4k5Tvfwt1nyj3cJHEw= +maunium.net/go/mautrix v0.26.4-0.20260305215735-7836f35a1a74/go.mod h1:lJvXCZya2dGT2KW7LUO7Ucna7Ohs6hl2+7v8Ji6R3iM= diff --git a/pkg/connector/directmedia.go b/pkg/connector/directmedia.go index 6f31e15..0877d66 100644 --- a/pkg/connector/directmedia.go +++ b/pkg/connector/directmedia.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "fmt" "io" + "os" "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/networkid" @@ -41,18 +42,15 @@ func (s *SignalConnector) Download(ctx context.Context, mediaID networkid.MediaI Uint32("size", info.Size). Msg("Direct downloading attachment") - return &mediaproxy.GetMediaResponseCallback{ - Callback: func(w io.Writer) (int64, error) { - data, err := signalmeow.DownloadAttachment( - ctx, info.CDNID, info.CDNKey, info.CDNNumber, info.Key, info.Digest, info.PlaintextDigest, info.Size, + return &mediaproxy.GetMediaResponseFile{ + Callback: func(w *os.File) (*mediaproxy.FileMeta, error) { + _, err := signalmeow.DownloadAttachment( + ctx, info.CDNID, info.CDNKey, info.CDNNumber, info.Key, info.Digest, info.PlaintextDigest, info.Size, w, ) if err != nil { - log.Err(err).Msg("Direct download failed") - return 0, err + return nil, err } - - _, err = w.Write(data) - return int64(info.Size), err + return &mediaproxy.FileMeta{}, nil }, }, nil case *signalid.DirectMediaGroupAvatar: diff --git a/pkg/msgconv/from-signal.go b/pkg/msgconv/from-signal.go index dadfe3f..4119cc5 100644 --- a/pkg/msgconv/from-signal.go +++ b/pkg/msgconv/from-signal.go @@ -22,7 +22,9 @@ import ( "encoding/base64" "errors" "fmt" + "io" "net/http" + "os" "strconv" "strings" "time" @@ -76,6 +78,7 @@ func CanConvertSignal(dm *signalpb.DataMessage) bool { } const ViewOnceDisappearTimer = 5 * time.Minute +const matrixTextMaxLength = 30000 // approximate value to avoid hitting 64 KiB PDU size limit with HTML duplication func (mc *MessageConverter) ToMatrix( ctx context.Context, @@ -123,7 +126,7 @@ func (mc *MessageConverter) ToMatrix( return cm } for i, att := range dm.GetAttachments() { - if att.GetContentType() != "text/x-signal-plain" { + if att.GetContentType() != "text/x-signal-plain" || att.GetSize() > matrixTextMaxLength { cm.Parts = append(cm.Parts, mc.convertAttachmentToMatrix(ctx, i, att, attMap)) } else { longBody, err := mc.downloadSignalLongText(ctx, att, attMap) @@ -337,7 +340,7 @@ func (mc *MessageConverter) convertContactToVCard(ctx context.Context, contact * card.Add(vcard.FieldTelephone, &field) } if contact.GetAvatar().GetAvatar() != nil { - avatarData, err := mc.downloadAttachment(ctx, contact.GetAvatar().GetAvatar(), attMap) + avatarData, err := mc.downloadAttachment(ctx, contact.GetAvatar().GetAvatar(), attMap, nil) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to download contact avatar") } else { @@ -480,7 +483,7 @@ func (mc *MessageConverter) convertStickerToMatrix(ctx context.Context, sticker } func (mc *MessageConverter) downloadSignalLongText(ctx context.Context, att *signalpb.AttachmentPointer, attMap AttachmentMap) (*string, error) { - data, err := mc.downloadAttachment(ctx, att, attMap) + data, err := mc.downloadAttachment(ctx, att, attMap, nil) if err != nil { return nil, err } @@ -506,7 +509,9 @@ func checkIfAttachmentExists(att *signalpb.AttachmentPointer, attMap AttachmentM return nil } -func (mc *MessageConverter) downloadAttachment(ctx context.Context, att *signalpb.AttachmentPointer, attMap AttachmentMap) ([]byte, error) { +func (mc *MessageConverter) downloadAttachment( + ctx context.Context, att *signalpb.AttachmentPointer, attMap AttachmentMap, into *os.File, +) ([]byte, error) { if err := checkIfAttachmentExists(att, attMap); err != nil { return nil, err } @@ -517,19 +522,19 @@ func (mc *MessageConverter) downloadAttachment(ctx context.Context, att *signalp plaintextHash = target.GetPlaintextHash() } } - return signalmeow.DownloadAttachmentWithPointer(ctx, att, plaintextHash) + return signalmeow.DownloadAttachmentWithPointer(ctx, att, plaintextHash, into) } func (mc *MessageConverter) reuploadAttachment(ctx context.Context, att *signalpb.AttachmentPointer, attMap AttachmentMap) (*bridgev2.ConvertedMessagePart, error) { - fileName := att.GetFileName() content := &event.MessageEventContent{ + Body: att.GetFileName(), Info: &event.FileInfo{ - Width: int(att.GetWidth()), - Height: int(att.GetHeight()), - Size: int(att.GetSize()), + MimeType: att.GetContentType(), + Width: int(att.GetWidth()), + Height: int(att.GetHeight()), + Size: int(att.GetSize()), }, } - mimeType := att.GetContentType() if err := checkIfAttachmentExists(att, attMap); err != nil { return nil, err } else if mc.DirectMedia { @@ -556,25 +561,7 @@ func (mc *MessageConverter) reuploadAttachment(ctx context.Context, att *signalp } content.URL, err = mc.Bridge.Matrix.GenerateContentURI(ctx, mediaID) } else { - data, err := mc.downloadAttachment(ctx, att, attMap) - if err != nil { - return nil, err - } - if mimeType == "" { - mimeType = http.DetectContentType(data) - } - if att.GetFlags()&uint32(signalpb.AttachmentPointer_VOICE_MESSAGE) != 0 && ffmpeg.Supported() { - data, err = ffmpeg.ConvertBytes(ctx, data, ".ogg", []string{}, []string{"-c:a", "libopus"}, mimeType) - if err != nil { - return nil, fmt.Errorf("failed to convert audio to ogg/opus: %w", err) - } - fileName += ".ogg" - mimeType = "audio/ogg" - content.MSC3245Voice = &event.MSC3245Voice{} - // TODO include duration here (and in info) if there's some easy way to extract it with ffmpeg - //content.MSC1767Audio = &event.MSC1767Audio{} - } - content.URL, content.File, err = getIntent(ctx).UploadMedia(ctx, getPortal(ctx).MXID, data, fileName, mimeType) + err = mc.actuallyReuploadAttachment(ctx, content, att, attMap) if err != nil { return nil, err } @@ -583,7 +570,7 @@ func (mc *MessageConverter) reuploadAttachment(ctx context.Context, att *signalp content.Info.Blurhash = att.GetBlurHash() content.Info.AnoaBlurhash = att.GetBlurHash() } - switch strings.Split(mimeType, "/")[0] { + switch strings.Split(content.Info.MimeType, "/")[0] { case "image": content.MsgType = event.MsgImage case "video": @@ -605,10 +592,8 @@ func (mc *MessageConverter) reuploadAttachment(ctx context.Context, att *signalp }, } } - content.Body = fileName - content.Info.MimeType = mimeType if content.Body == "" { - content.Body = strings.TrimPrefix(string(content.MsgType), "m.") + exmime.ExtensionFromMimetype(mimeType) + content.Body = strings.TrimPrefix(string(content.MsgType), "m.") + exmime.ExtensionFromMimetype(content.Info.MimeType) } return &bridgev2.ConvertedMessagePart{ Type: event.EventMessage, @@ -617,6 +602,63 @@ func (mc *MessageConverter) reuploadAttachment(ctx context.Context, att *signalp }, nil } +func (mc *MessageConverter) actuallyReuploadAttachment( + ctx context.Context, + content *event.MessageEventContent, + att *signalpb.AttachmentPointer, + attMap AttachmentMap, +) (err error) { + convertVoice := att.GetFlags()&uint32(signalpb.AttachmentPointer_VOICE_MESSAGE) != 0 && ffmpeg.Supported() + requireFile := convertVoice + content.URL, content.File, err = getIntent(ctx).UploadMediaStream(ctx, getPortal(ctx).MXID, int64(att.GetSize()), requireFile, func(file io.Writer) (*bridgev2.FileStreamResult, error) { + osFile, ok := file.(*os.File) + inMemData, err := mc.downloadAttachment(ctx, att, attMap, osFile) + if err != nil { + return nil, err + } else if !ok { + if content.Info.MimeType == "" { + content.Info.MimeType = http.DetectContentType(inMemData) + } + _, err = file.Write(inMemData) + return &bridgev2.FileStreamResult{ + FileName: content.Body, + MimeType: content.Info.MimeType, + }, err + } + if content.Info.MimeType == "" { + header := make([]byte, 512) + _, err = osFile.ReadAt(header, 0) + if err != nil { + return nil, fmt.Errorf("failed to read file header for MIME type detection: %w", err) + } else { + content.Info.MimeType = http.DetectContentType(header) + } + } + var replFile string + if att.GetFlags()&uint32(signalpb.AttachmentPointer_VOICE_MESSAGE) != 0 && ffmpeg.Supported() { + replFile, err = ffmpeg.ConvertPath(ctx, osFile.Name(), ".ogg", []string{}, []string{"-c:a", "libopus"}, true) + if err != nil { + return nil, fmt.Errorf("failed to convert audio to ogg/opus: %w", err) + } + if content.Body == "" { + content.Body = "Voice message.ogg" + } else { + content.Body += ".ogg" + } + content.Info.MimeType = "audio/ogg" + content.MSC3245Voice = &event.MSC3245Voice{} + // TODO include duration here (and in info) if there's some easy way to extract it with ffmpeg + //content.MSC1767Audio = &event.MSC1767Audio{} + } + return &bridgev2.FileStreamResult{ + ReplacementFile: replFile, + FileName: content.Body, + MimeType: content.Info.MimeType, + }, nil + }) + return +} + func (mc *MessageConverter) convertPollCreateToMatrix(create *signalpb.DataMessage_PollCreate) *bridgev2.ConvertedMessagePart { evtType := event.EventMessage if mc.ExtEvPolls { diff --git a/pkg/signalmeow/attachments.go b/pkg/signalmeow/attachments.go index 6b78c68..2c8f1ea 100644 --- a/pkg/signalmeow/attachments.go +++ b/pkg/signalmeow/attachments.go @@ -31,8 +31,10 @@ import ( "math" "mime/multipart" "net/http" + "os" "github.com/rs/zerolog" + "go.mau.fi/util/fallocate" "go.mau.fi/util/random" "google.golang.org/protobuf/proto" @@ -59,25 +61,48 @@ var ErrInvalidMACForAttachment = errors.New("invalid MAC for attachment") var ErrInvalidDigestForAttachment = errors.New("invalid digest for attachment") var ErrAttachmentNotFound = errors.New("attachment not found on server") -func DownloadAttachmentWithPointer(ctx context.Context, a *signalpb.AttachmentPointer, plaintextHash []byte) ([]byte, error) { +func DownloadAttachmentWithPointer(ctx context.Context, a *signalpb.AttachmentPointer, plaintextHash []byte, into *os.File) ([]byte, error) { digest := a.GetDigest() plaintextDigest := false if digest == nil && plaintextHash != nil { digest = plaintextHash plaintextDigest = true } - return DownloadAttachment(ctx, a.GetCdnId(), a.GetCdnKey(), a.GetCdnNumber(), a.Key, digest, plaintextDigest, a.GetSize()) + return DownloadAttachment( + ctx, a.GetCdnId(), a.GetCdnKey(), a.GetCdnNumber(), a.Key, digest, plaintextDigest, a.GetSize(), into, + ) } -func DownloadAttachment(ctx context.Context, cdnID uint64, cdnKey string, cdnNumber uint32, key, digest []byte, plaintextDigest bool, size uint32) ([]byte, error) { +func DownloadAttachment( + ctx context.Context, + cdnID uint64, + cdnKey string, + cdnNumber uint32, + key, digest []byte, + plaintextDigest bool, + size uint32, + into *os.File, +) ([]byte, error) { resp, err := web.GetAttachment(ctx, getAttachmentPath(cdnID, cdnKey), cdnNumber) if err != nil { return nil, err } - bodyReader := resp.Body - defer bodyReader.Close() + defer func() { + _ = resp.Body.Close() + }() - body, err := io.ReadAll(bodyReader) + var body []byte + var downloadedSize int64 + if into == nil || resp.StatusCode > 400 { + body = make([]byte, resp.ContentLength) + _, err = io.ReadFull(resp.Body, body) + } else { + err = fallocate.Fallocate(into, int(resp.ContentLength)) + if err != nil { + return nil, fmt.Errorf("failed to pre-allocate file for attachment: %w", err) + } + downloadedSize, err = io.Copy(into, resp.Body) + } if err != nil { return nil, err } @@ -93,6 +118,12 @@ func DownloadAttachment(ctx context.Context, cdnID uint64, cdnKey string, cdnNum return nil, fmt.Errorf("unexpected status code %d", resp.StatusCode) } + if into != nil { + if _, err = into.Seek(0, io.SeekStart); err != nil { + return nil, fmt.Errorf("failed to seek attachment file after downloading: %w", err) + } + return nil, decryptAttachmentFile(into, downloadedSize, key, digest, plaintextDigest, size) + } return decryptAttachment(body, key, digest, plaintextDigest, size) } @@ -128,6 +159,59 @@ func decryptAttachment(body, key, digest []byte, plaintextDigest bool, size uint return decrypted, nil } +func decryptAttachmentFile(file *os.File, downloadedSize int64, key, digest []byte, plaintextDigest bool, size uint32) error { + if !plaintextDigest { + hasher := sha256.New() + if _, err := io.Copy(hasher, file); err != nil { + return fmt.Errorf("failed to hash attachment file: %w", err) + } else if !hmac.Equal(hasher.Sum(nil), digest) { + return ErrInvalidDigestForAttachment + } else if _, err = file.Seek(0, io.SeekStart); err != nil { + return fmt.Errorf("failed to seek attachment file after hashing: %w", err) + } + } + mac := make([]byte, MACLength) + n, err := file.ReadAt(mac, downloadedSize-MACLength) + if err != nil { + return fmt.Errorf("failed to read MAC from attachment file: %w", err) + } else if n != MACLength { + return fmt.Errorf("unexpected MAC length read from attachment file: %d", n) + } + hasher := hmac.New(sha256.New, key[MACLength:]) + _, err = io.CopyN(hasher, file, downloadedSize-MACLength) + if err != nil { + return fmt.Errorf("failed to hash attachment file for MAC verification: %w", err) + } else if !hmac.Equal(hasher.Sum(nil), mac) { + return ErrInvalidMACForAttachment + } else if _, err = file.Seek(0, io.SeekStart); err != nil { + return fmt.Errorf("failed to seek attachment file after verifying mac: %w", err) + } + + decryptedSize, err := aesDecryptFile(key[:MACLength], file, downloadedSize-MACLength) + if err != nil { + return err + } else if decryptedSize < int64(size) { + return fmt.Errorf("decrypted attachment length %d < expected %d", decryptedSize, size) + } else if _, err = file.Seek(0, io.SeekStart); err != nil { + return fmt.Errorf("failed to seek attachment file after decrypting: %w", err) + } + err = file.Truncate(int64(size)) + if err != nil { + return fmt.Errorf("failed to truncate attachment file to expected size: %w", err) + } + if plaintextDigest { + hasher = sha256.New() + if _, err = io.Copy(hasher, file); err != nil { + return fmt.Errorf("failed to hash decrypted attachment file: %w", err) + } else if !hmac.Equal(hasher.Sum(nil), digest) { + return fmt.Errorf("%w (plaintext hash)", ErrInvalidDigestForAttachment) + } else if _, err = file.Seek(0, io.SeekStart); err != nil { + return fmt.Errorf("failed to seek attachment file after hashing plaintext: %w", err) + } + } + return nil +} + type attachmentV4UploadAttributes struct { Cdn uint32 `json:"cdn"` Key string `json:"key"` @@ -371,7 +455,7 @@ func aesDecrypt(key, ciphertext []byte) ([]byte, error) { return nil, fmt.Errorf("ciphertext not multiple of AES blocksize (%d extra bytes)", len(ciphertext)%aes.BlockSize) } - iv := ciphertext[:aes.BlockSize] + iv := ciphertext[:IVLength] mode := cipher.NewCBCDecrypter(block, iv) mode.CryptBlocks(ciphertext, ciphertext) pad := ciphertext[len(ciphertext)-1] @@ -381,6 +465,51 @@ func aesDecrypt(key, ciphertext []byte) ([]byte, error) { return ciphertext[aes.BlockSize : len(ciphertext)-int(pad)], nil } +func aesDecryptFile(key []byte, file *os.File, downloadedSize int64) (int64, error) { + block, err := aes.NewCipher(key) + if err != nil { + return 0, err + } + fileReader := io.LimitReader(file, downloadedSize) + + if downloadedSize%aes.BlockSize != 0 { + return 0, fmt.Errorf("ciphertext not multiple of AES blocksize (%d extra bytes)", downloadedSize%aes.BlockSize) + } + + iv := make([]byte, IVLength) + n, err := fileReader.Read(iv) + if err != nil { + return 0, fmt.Errorf("failed to read IV from attachment file: %w", err) + } else if n != IVLength { + return 0, fmt.Errorf("unexpected IV length read from attachment file: %d", n) + } + mode := cipher.NewCBCDecrypter(block, iv) + buf := make([]byte, 4096) + var offset int64 + var pad byte + for { + n, err = fileReader.Read(buf) + if err != nil && !errors.Is(err, io.EOF) { + return 0, fmt.Errorf("failed to read from attachment file: %w", err) + } + if n > 0 { + mode.CryptBlocks(buf[:n], buf[:n]) + if _, err = file.WriteAt(buf[:n], offset); err != nil { + return 0, fmt.Errorf("failed to write decrypted data to attachment file: %w", err) + } + offset += int64(n) + pad = buf[n-1] + } + if errors.Is(err, io.EOF) { + break + } + } + if pad > aes.BlockSize { + return 0, fmt.Errorf("pad value (%d) larger than AES blocksize (%d)", pad, aes.BlockSize) + } + return downloadedSize - int64(pad), nil +} + func appendMAC(key, body []byte) []byte { m := hmac.New(sha256.New, key) m.Write(body) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 142bc0f..45fafa5 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -759,7 +759,8 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess log.Debug().Msg("Recieved sync message contacts") blob := msg.Contacts.Blob if blob != nil { - contactsBytes, err := DownloadAttachmentWithPointer(ctx, blob, nil) + // TODO roundtrip via disk to save memory + contactsBytes, err := DownloadAttachmentWithPointer(ctx, blob, nil, nil) if err != nil { log.Err(err).Msg("Contacts Sync DownloadAttachment error") } From 37a0199f79781ea1f4ba0427383e2dcc10e64fea Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 28 Feb 2026 12:33:08 +0200 Subject: [PATCH 125/170] handlematrix,msgconv,signalmeow: switch to sending binary ID fields --- pkg/connector/handlematrix.go | 26 +++++++--------- pkg/msgconv/from-matrix.go | 8 ++--- pkg/msgconv/from-signal-backup.go | 6 +--- pkg/msgconv/signalfmt/tags.go | 4 +-- pkg/signalmeow/sending.go | 52 ++++++++++++------------------- 5 files changed, 37 insertions(+), 59 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 8819d69..0ef84f6 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -205,12 +205,10 @@ func (s *SignalClient) HandleMatrixReaction(ctx context.Context, msg *bridgev2.M Timestamp: proto.Uint64(ts), RequiredProtocolVersion: proto.Uint32(uint32(signalpb.DataMessage_REACTIONS)), Reaction: &signalpb.DataMessage_Reaction{ - Emoji: proto.String(msg.PreHandleResp.Emoji), - Remove: proto.Bool(false), - TargetAuthorAci: proto.String(targetAuthorACI.String()), - // TODO update aci format - //TargetAuthorAciBinary: targetAuthorACI[:], - TargetSentTimestamp: proto.Uint64(targetSentTimestamp), + Emoji: proto.String(msg.PreHandleResp.Emoji), + Remove: proto.Bool(false), + TargetAuthorAciBinary: targetAuthorACI[:], + TargetSentTimestamp: proto.Uint64(targetSentTimestamp), }, }, } @@ -232,12 +230,10 @@ func (s *SignalClient) HandleMatrixReactionRemove(ctx context.Context, msg *brid Timestamp: proto.Uint64(ts), RequiredProtocolVersion: proto.Uint32(uint32(signalpb.DataMessage_REACTIONS)), Reaction: &signalpb.DataMessage_Reaction{ - Emoji: proto.String(msg.TargetReaction.Emoji), - Remove: proto.Bool(true), - TargetAuthorAci: proto.String(targetAuthorACI.String()), - // TODO update aci format - //TargetAuthorAciBinary: targetAuthorACI[:], - TargetSentTimestamp: proto.Uint64(targetSentTimestamp), + Emoji: proto.String(msg.TargetReaction.Emoji), + Remove: proto.Bool(true), + TargetAuthorAciBinary: targetAuthorACI[:], + TargetSentTimestamp: proto.Uint64(targetSentTimestamp), }, }, } @@ -722,8 +718,8 @@ func (s *SignalClient) HandleMatrixDeleteChat(ctx context.Context, msg *bridgev2 var conversationID *signalpb.ConversationIdentifier if groupID == "" { conversationID = &signalpb.ConversationIdentifier{ - Identifier: &signalpb.ConversationIdentifier_ThreadServiceId{ - ThreadServiceId: userID.String(), + Identifier: &signalpb.ConversationIdentifier_ThreadServiceIdBinary{ + ThreadServiceIdBinary: userID.Bytes(), }, } } else { @@ -865,7 +861,7 @@ func (s *SignalClient) syncMessageRequestResponse( } accept.GroupId = gidBytes[:] } else if userID.Type == libsignalgo.ServiceIDTypeACI { - accept.ThreadAci = ptr.Ptr(userID.UUID.String()) + accept.ThreadAciBinary = userID.UUID[:] } else { return fmt.Errorf("invalid portal ID for message request response: %s", portal.ID) } diff --git a/pkg/msgconv/from-matrix.go b/pkg/msgconv/from-matrix.go index fa5deb4..89b0181 100644 --- a/pkg/msgconv/from-matrix.go +++ b/pkg/msgconv/from-matrix.go @@ -60,11 +60,9 @@ func (mc *MessageConverter) ToSignal( authorACI, messageID, err := signalid.ParseMessageID(replyTo.ID) if err == nil { dm.Quote = &signalpb.DataMessage_Quote{ - Id: proto.Uint64(messageID), - AuthorAci: proto.String(authorACI.String()), - // TODO update aci format - //AuthorAciBinary: authorACI[:], - Type: signalpb.DataMessage_Quote_NORMAL.Enum(), + Id: proto.Uint64(messageID), + AuthorAciBinary: authorACI[:], + Type: signalpb.DataMessage_Quote_NORMAL.Enum(), } if replyTo.Metadata.(*signalid.MessageMetadata).ContainsAttachments { dm.Quote.Attachments = make([]*signalpb.DataMessage_Quote_QuotedAttachment, 1) diff --git a/pkg/msgconv/from-signal-backup.go b/pkg/msgconv/from-signal-backup.go index 97f756c..978c6a6 100644 --- a/pkg/msgconv/from-signal-backup.go +++ b/pkg/msgconv/from-signal-backup.go @@ -248,11 +248,7 @@ func backupToSignalBodyRange(from *backuppb.BodyRange) *signalpb.BodyRange { out.Length = &from.Length switch av := from.AssociatedValue.(type) { case *backuppb.BodyRange_MentionAci: - // TODO confirm this is correct - if len(av.MentionAci) != 16 { - return nil - } - out.AssociatedValue = &signalpb.BodyRange_MentionAci{MentionAci: uuid.UUID(av.MentionAci).String()} + out.AssociatedValue = &signalpb.BodyRange_MentionAciBinary{MentionAciBinary: av.MentionAci} case *backuppb.BodyRange_Style_: out.AssociatedValue = &signalpb.BodyRange_Style_{Style: signalpb.BodyRange_Style(av.Style)} } diff --git a/pkg/msgconv/signalfmt/tags.go b/pkg/msgconv/signalfmt/tags.go index 043bb43..b273e0e 100644 --- a/pkg/msgconv/signalfmt/tags.go +++ b/pkg/msgconv/signalfmt/tags.go @@ -40,8 +40,8 @@ func (m Mention) String() string { } func (m Mention) Proto() signalpb.BodyRangeAssociatedValue { - return &signalpb.BodyRange_MentionAci{ - MentionAci: m.UUID.String(), + return &signalpb.BodyRange_MentionAciBinary{ + MentionAciBinary: m.UUID[:], } } diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 86bc1db..568b4d4 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -306,10 +306,8 @@ func syncMessageFromGroupDataMessage(dataMessage *signalpb.DataMessage, results unidentifiedStatuses := []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{} for _, result := range results { unidentifiedStatuses = append(unidentifiedStatuses, &signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ - DestinationServiceId: proto.String(result.Recipient.String()), - // TODO update aci format - //DestinationServiceIdBinary: result.Recipient.Bytes(), - Unidentified: &result.Unidentified, + DestinationServiceIdBinary: result.Recipient.Bytes(), + Unidentified: &result.Unidentified, }) } return &signalpb.Content{ @@ -327,10 +325,8 @@ func syncMessageFromGroupEditMessage(editMessage *signalpb.EditMessage, results unidentifiedStatuses := []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{} for _, result := range results { unidentifiedStatuses = append(unidentifiedStatuses, &signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ - DestinationServiceId: proto.String(result.Recipient.String()), - // TODO update aci format - //DestinationServiceIdBinary: result.Recipient.Bytes(), - Unidentified: &result.Unidentified, + DestinationServiceIdBinary: result.Recipient.Bytes(), + Unidentified: &result.Unidentified, }) } return &signalpb.Content{ @@ -349,20 +345,16 @@ func syncMessageFromSoloDataMessage(dataMessage *signalpb.DataMessage, result Su return &signalpb.Content{ SyncMessage: &signalpb.SyncMessage{ Sent: &signalpb.SyncMessage_Sent{ - Message: dataMessage, - DestinationE164: result.RecipientE164, - DestinationServiceId: proto.String(result.Recipient.String()), - // TODO update aci format - //DestinationServiceIdBinary: result.Recipient.Bytes(), - Timestamp: dataMessage.Timestamp, - ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), + Message: dataMessage, + DestinationE164: result.RecipientE164, + DestinationServiceIdBinary: result.Recipient.Bytes(), + Timestamp: dataMessage.Timestamp, + ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), UnidentifiedStatus: []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ { - DestinationServiceId: proto.String(result.Recipient.String()), - // TODO update aci format - //DestinationServiceIdBinary: result.Recipient.Bytes(), - Unidentified: &result.Unidentified, - DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), + DestinationServiceIdBinary: result.Recipient.Bytes(), + Unidentified: &result.Unidentified, + DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), }, }, }, @@ -374,20 +366,16 @@ func syncMessageFromSoloEditMessage(editMessage *signalpb.EditMessage, result Su return &signalpb.Content{ SyncMessage: &signalpb.SyncMessage{ Sent: &signalpb.SyncMessage_Sent{ - EditMessage: editMessage, - DestinationE164: result.RecipientE164, - DestinationServiceId: proto.String(result.Recipient.String()), - // TODO update aci format - //DestinationServiceIdBinary: result.Recipient.Bytes(), - Timestamp: editMessage.DataMessage.Timestamp, - ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), + EditMessage: editMessage, + DestinationE164: result.RecipientE164, + DestinationServiceIdBinary: result.Recipient.Bytes(), + Timestamp: editMessage.DataMessage.Timestamp, + ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), UnidentifiedStatus: []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ { - DestinationServiceId: proto.String(result.Recipient.String()), - // TODO update aci format - //DestinationServiceIdBinary: result.Recipient.Bytes(), - Unidentified: &result.Unidentified, - DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), + DestinationServiceIdBinary: result.Recipient.Bytes(), + Unidentified: &result.Unidentified, + DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), }, }, }, From 01b06408ab5d36a1fc2e69a370acfe13251ccf07 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 9 Mar 2026 11:48:10 +0200 Subject: [PATCH 126/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6758d92..a97408d 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.50.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.4-0.20260305215735-7836f35a1a74 + maunium.net/go/mautrix v0.26.4-0.20260307142642-c107c25d078e ) require ( diff --git a/go.sum b/go.sum index 78bfb4e..239a198 100644 --- a/go.sum +++ b/go.sum @@ -99,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.4-0.20260305215735-7836f35a1a74 h1:kHlana4CKRoAzPGbagU82y+uN4k5Tvfwt1nyj3cJHEw= -maunium.net/go/mautrix v0.26.4-0.20260305215735-7836f35a1a74/go.mod h1:lJvXCZya2dGT2KW7LUO7Ucna7Ohs6hl2+7v8Ji6R3iM= +maunium.net/go/mautrix v0.26.4-0.20260307142642-c107c25d078e h1:R1ebuJojcAFo14HKB6Kz2q6FWWIQPc2XRMkuRUq7BVY= +maunium.net/go/mautrix v0.26.4-0.20260307142642-c107c25d078e/go.mod h1:lJvXCZya2dGT2KW7LUO7Ucna7Ohs6hl2+7v8Ji6R3iM= From f4b6d0641ffef16e0d79a8ba17c6ec4ca29de821 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 16 Mar 2026 17:32:08 +0200 Subject: [PATCH 127/170] Bump version to v26.03 --- CHANGELOG.md | 6 ++++++ cmd/mautrix-signal/main.go | 2 +- go.mod | 22 ++++++++++----------- go.sum | 40 +++++++++++++++++++------------------- 4 files changed, 38 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd0a2d4..d992cab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v26.03 + +* Switched to sending binary service ID fields in outgoing messages. +* Added support for roundtripping large attachments via disk to avoid keeping + the entire file in memory during en/decryption. + # v26.02.2 * Added support for more new binary service ID fields. diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index 7f1d5fe..cc1ec10 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -37,7 +37,7 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "26.02.2", + Version: "26.03", SemCalVer: true, Connector: &connector.SignalConnector{}, diff --git a/go.mod b/go.mod index a97408d..b0be4f5 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-signal go 1.25.0 -toolchain go1.26.0 +toolchain go1.26.1 tool go.mau.fi/util/cmd/maubuild @@ -14,13 +14,13 @@ require ( github.com/rs/zerolog v1.34.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.6 - golang.org/x/crypto v0.48.0 - golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa - golang.org/x/net v0.50.0 + go.mau.fi/util v0.9.7 + golang.org/x/crypto v0.49.0 + golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 + golang.org/x/net v0.52.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.4-0.20260307142642-c107c25d078e + maunium.net/go/mautrix v0.26.4 ) require ( @@ -32,7 +32,7 @@ require ( github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-sqlite3 v1.14.34 // indirect - github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 // indirect + github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/rs/xid v1.6.0 // indirect @@ -42,10 +42,10 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/goldmark v1.7.16 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect - golang.org/x/mod v0.33.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.41.0 // indirect - golang.org/x/text v0.34.0 // indirect + golang.org/x/mod v0.34.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/text v0.35.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index 239a198..ec06d77 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,8 @@ github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk= github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 h1:KPpdlQLZcHfTMQRi6bFQ7ogNO0ltFT4PmtwTLW4W+14= -github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6 h1:rh2lKw/P/EqHa724vYH2+VVQ1YnW4u6EOXl0PMAovZE= +github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -67,27 +67,27 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.6 h1:2nsvxm49KhI3wrFltr0+wSUBlnQ4CMtykuELjpIU+ts= -go.mau.fi/util v0.9.6/go.mod h1:sIJpRH7Iy5Ad1SBuxQoatxtIeErgzxCtjd/2hCMkYMI= +go.mau.fi/util v0.9.7 h1:AWGNbJfz1zRcQOKeOEYhKUG2fT+/26Gy6kyqcH8tnBg= +go.mau.fi/util v0.9.7/go.mod h1:5T2f3ZWZFAGgmFwg3dGw7YK6kIsb9lryDzvynoR98pE= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= -golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= -golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= -golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= -golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= +golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= +golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= +golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -99,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.4-0.20260307142642-c107c25d078e h1:R1ebuJojcAFo14HKB6Kz2q6FWWIQPc2XRMkuRUq7BVY= -maunium.net/go/mautrix v0.26.4-0.20260307142642-c107c25d078e/go.mod h1:lJvXCZya2dGT2KW7LUO7Ucna7Ohs6hl2+7v8Ji6R3iM= +maunium.net/go/mautrix v0.26.4 h1:enHSnkf0L2V9+VnfJfNhKSReSW6pBKS/x3Su+v+Vovs= +maunium.net/go/mautrix v0.26.4/go.mod h1:YWw8NWTszsbyFAznboicBObwHPgTSLcuTbVX2kY7U2M= From 09bb6d71608cde2e3781b827a1a20aad5f50f279 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 19 Mar 2026 17:58:19 +0200 Subject: [PATCH 128/170] libsignal: update to v0.89.1 --- pkg/libsignalgo/identitykeystore.go | 41 ++++++++++-------- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 66 +++++++++++++++++++++++++---- pkg/libsignalgo/version.go | 2 +- 4 files changed, 83 insertions(+), 28 deletions(-) diff --git a/pkg/libsignalgo/identitykeystore.go b/pkg/libsignalgo/identitykeystore.go index 6a425e8..43941da 100644 --- a/pkg/libsignalgo/identitykeystore.go +++ b/pkg/libsignalgo/identitykeystore.go @@ -20,7 +20,7 @@ package libsignalgo /* #include "./libsignal-ffi.h" -extern int signal_get_identity_key_pair_callback(void *store_ctx, SignalMutPointerPrivateKey *keyp); +extern int signal_get_identity_key_pair_callback(void *store_ctx, SignalPairOfMutPointerPrivateKeyMutPointerPublicKey *keyp); extern int signal_get_local_registration_id_callback(void *store_ctx, uint32_t *idp); extern int signal_save_identity_key_callback(void *store_ctx, uint8_t *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key); extern int signal_get_identity_key_callback(void *store_ctx, SignalMutPointerPublicKey *public_keyp, SignalMutPointerProtocolAddress address); @@ -49,22 +49,29 @@ type IdentityKeyStore interface { } //export signal_get_identity_key_pair_callback -func signal_get_identity_key_pair_callback(storeCtx unsafe.Pointer, keyp *C.SignalMutPointerPrivateKey) C.int { +func signal_get_identity_key_pair_callback(storeCtx unsafe.Pointer, keyp *C.SignalPairOfMutPointerPrivateKeyMutPointerPublicKey) C.int { return wrapStoreCallback(storeCtx, func(store IdentityKeyStore, ctx context.Context) error { key, err := store.GetIdentityKeyPair(ctx) if err != nil { return err } if key == nil { - keyp.raw = nil - } else { - clone, err := key.privateKey.Clone() - if err != nil { - return err - } - clone.CancelFinalizer() - keyp.raw = clone.ptr + keyp.first.raw = nil + keyp.second.raw = nil + return nil } + privClone, err := key.privateKey.Clone() + if err != nil { + return err + } + pubClone, err := key.publicKey.Clone() + if err != nil { + return err + } + privClone.CancelFinalizer() + pubClone.CancelFinalizer() + keyp.first.raw = privClone.ptr + keyp.second.raw = pubClone.ptr return err }) } @@ -151,12 +158,12 @@ func signal_destroy_identity_key_store_callback(storeCtx unsafe.Pointer) { func (ctx *CallbackContext) wrapIdentityKeyStore(store IdentityKeyStore) C.SignalConstPointerFfiIdentityKeyStoreStruct { return C.SignalConstPointerFfiIdentityKeyStoreStruct{&C.SignalIdentityKeyStore{ - ctx: wrapStore(ctx, store), - get_local_identity_private_key: C.SignalFfiBridgeIdentityKeyStoreGetLocalIdentityPrivateKey(C.signal_get_identity_key_pair_callback), - get_local_registration_id: C.SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId(C.signal_get_local_registration_id_callback), - get_identity_key: C.SignalFfiBridgeIdentityKeyStoreGetIdentityKey(C.signal_get_identity_key_callback), - save_identity_key: C.SignalFfiBridgeIdentityKeyStoreSaveIdentityKey(C.signal_save_identity_key_callback), - is_trusted_identity: C.SignalFfiBridgeIdentityKeyStoreIsTrustedIdentity(C.signal_is_trusted_identity_callback), - destroy: C.SignalFfiBridgeIdentityKeyStoreDestroy(C.signal_destroy_identity_key_store_callback), + ctx: wrapStore(ctx, store), + get_local_identity_key_pair: C.SignalFfiBridgeIdentityKeyStoreGetLocalIdentityKeyPair(C.signal_get_identity_key_pair_callback), + get_local_registration_id: C.SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId(C.signal_get_local_registration_id_callback), + get_identity_key: C.SignalFfiBridgeIdentityKeyStoreGetIdentityKey(C.signal_get_identity_key_callback), + save_identity_key: C.SignalFfiBridgeIdentityKeyStoreSaveIdentityKey(C.signal_save_identity_key_callback), + is_trusted_identity: C.SignalFfiBridgeIdentityKeyStoreIsTrustedIdentity(C.signal_is_trusted_identity_callback), + destroy: C.SignalFfiBridgeIdentityKeyStoreDestroy(C.signal_destroy_identity_key_store_callback), }} } diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index ffaa9f0..a5e7667 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit ffaa9f0435569d6775d8be636f268f882ed67ce3 +Subproject commit a5e76674882a89bac1ed3f4a982120652966d21e diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index deb72cd..59409c8 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -260,6 +260,7 @@ typedef enum { SignalErrorCodeKeyTransparencyVerificationFailed = 211, SignalErrorCodeRequestUnauthorized = 220, SignalErrorCodeMismatchedDevices = 221, + SignalErrorCodeServiceIdNotFound = 222, } SignalErrorCode; enum SignalSvr2CredentialsResult { @@ -776,14 +777,19 @@ typedef struct { const SignalSessionStore *raw; } SignalConstPointerFfiSessionStoreStruct; -typedef int (*SignalFfiBridgeIdentityKeyStoreGetLocalIdentityPrivateKey)(void *ctx, SignalMutPointerPrivateKey *out); - -typedef int (*SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId)(void *ctx, uint32_t *out); - typedef struct { SignalPublicKey *raw; } SignalMutPointerPublicKey; +typedef struct { + SignalMutPointerPrivateKey first; + SignalMutPointerPublicKey second; +} SignalPairOfMutPointerPrivateKeyMutPointerPublicKey; + +typedef int (*SignalFfiBridgeIdentityKeyStoreGetLocalIdentityKeyPair)(void *ctx, SignalPairOfMutPointerPrivateKeyMutPointerPublicKey *out); + +typedef int (*SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId)(void *ctx, uint32_t *out); + typedef int (*SignalFfiBridgeIdentityKeyStoreGetIdentityKey)(void *ctx, SignalMutPointerPublicKey *out, SignalMutPointerProtocolAddress address); typedef int (*SignalFfiBridgeIdentityKeyStoreSaveIdentityKey)(void *ctx, uint8_t *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key); @@ -794,7 +800,7 @@ typedef void (*SignalFfiBridgeIdentityKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalFfiBridgeIdentityKeyStoreGetLocalIdentityPrivateKey get_local_identity_private_key; + SignalFfiBridgeIdentityKeyStoreGetLocalIdentityKeyPair get_local_identity_key_pair; SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId get_local_registration_id; SignalFfiBridgeIdentityKeyStoreGetIdentityKey get_identity_key; SignalFfiBridgeIdentityKeyStoreSaveIdentityKey save_identity_key; @@ -993,6 +999,21 @@ typedef struct { size_t length; } SignalOwnedBufferOfServiceIdFixedWidthBinaryBytes; +typedef struct { + SignalPreKeyBundle *raw; +} SignalMutPointerPreKeyBundle; + +/** + * A representation of a array allocated on the Rust heap for use in C code. + */ +typedef struct { + SignalMutPointerPreKeyBundle *base; + /** + * The number of elements in the buffer (not necessarily the number of bytes). + */ + size_t length; +} SignalOwnedBufferOfMutPointerPreKeyBundle; + typedef struct { SignalSenderKeyRecord *raw; } SignalMutPointerSenderKeyRecord; @@ -1190,10 +1211,6 @@ typedef struct { SignalPlaintextContent *raw; } SignalMutPointerPlaintextContent; -typedef struct { - SignalPreKeyBundle *raw; -} SignalMutPointerPreKeyBundle; - typedef struct { const SignalPreKeyBundle *raw; } SignalConstPointerPreKeyBundle; @@ -1523,6 +1540,26 @@ typedef struct { SignalCancellationId cancellation_id; } SignalCPromiseMutPointerUnauthenticatedChatConnection; +typedef struct { + SignalMutPointerPublicKey identity_key; + SignalOwnedBufferOfMutPointerPreKeyBundle pre_key_bundles; +} SignalFfiPreKeysResponse; + +/** + * A C callback used to report the results of Rust futures. + * + * cbindgen will produce independent C types like `SignalCPromisei32` and + * `SignalCPromiseProtocolAddress`. + * + * This derives Copy because it behaves like a C type; nevertheless, a promise should still only be + * completed once. + */ +typedef struct { + void (*complete)(SignalFfiError *error, const SignalFfiPreKeysResponse *result, const void *context); + const void *context; + SignalCancellationId cancellation_id; +} SignalCPromiseFfiPreKeysResponse; + /** * A C callback used to report the results of Rust futures. * @@ -1918,6 +1955,13 @@ void signal_free_list_of_strings(SignalOwnedBufferOfCStringPtr buffer); void signal_free_lookup_response_entry_list(SignalOwnedBufferOfFfiCdsiLookupResponseEntry buffer); +/** + * This frees a buffer of PreKeyBundle pointers, and _does not_ free the + * pointers within the buffer. This _only_ frees the buffer containing + * the pointers. + */ +void signal_free_outer_buffer_list_of_prekey_bundles(SignalOwnedBufferOfMutPointerPreKeyBundle buffer); + void signal_free_string(const char *buf); SignalFfiError *signal_generic_server_public_params_check_valid_contents(SignalBorrowedBuffer params_bytes); @@ -2686,6 +2730,10 @@ SignalFfiError *signal_unauthenticated_chat_connection_destroy(SignalMutPointerU SignalFfiError *signal_unauthenticated_chat_connection_disconnect(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat); +SignalFfiError *signal_unauthenticated_chat_connection_get_pre_keys_access_group_auth(SignalCPromiseFfiPreKeysResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer auth, const SignalServiceIdFixedWidthBinaryBytes *target, int32_t device); + +SignalFfiError *signal_unauthenticated_chat_connection_get_pre_keys_access_key_auth(SignalCPromiseFfiPreKeysResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, const uint8_t (*auth)[16], const SignalServiceIdFixedWidthBinaryBytes *target, int32_t device); + SignalFfiError *signal_unauthenticated_chat_connection_info(SignalMutPointerChatConnectionInfo *out, SignalConstPointerUnauthenticatedChatConnection chat); SignalFfiError *signal_unauthenticated_chat_connection_init_listener(SignalConstPointerUnauthenticatedChatConnection chat, SignalConstPointerFfiChatListenerStruct listener); diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index bb1774c..ccd0d51 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.87.5" +const Version = "v0.89.1" From 4842b35ab4a9a500a1cfbbc863687eb5c4236cc9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 19 Mar 2026 17:59:15 +0200 Subject: [PATCH 129/170] msgconv/from-signal: add more details to quote aci parse error log --- pkg/msgconv/from-signal.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/msgconv/from-signal.go b/pkg/msgconv/from-signal.go index 4119cc5..96b4f10 100644 --- a/pkg/msgconv/from-signal.go +++ b/pkg/msgconv/from-signal.go @@ -179,7 +179,10 @@ func (mc *MessageConverter) ToMatrix( if dm.Quote != nil { authorACI, err := signalmeow.ParseStringOrBinaryUUID(dm.Quote.GetAuthorAci(), dm.Quote.GetAuthorAciBinary()) if err != nil { - zerolog.Ctx(ctx).Err(err).Str("author_aci", dm.Quote.GetAuthorAci()).Msg("Failed to parse quote author ACI") + zerolog.Ctx(ctx).Err(err). + Str("author_aci", dm.Quote.GetAuthorAci()). + Hex("author_aci_binary", dm.Quote.GetAuthorAciBinary()). + Msg("Failed to parse quote author ACI") } else { cm.ReplyTo = &networkid.MessageOptionalPartID{ MessageID: signalid.MakeMessageID(authorACI, dm.Quote.GetId()), From 69f9b48e356a76c978e6f67cc49cdcd5aedf4f4e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 19 Mar 2026 20:57:46 +0200 Subject: [PATCH 130/170] signalmeow/attachments: handle unknown content length in downloads Closes #644 --- pkg/signalmeow/attachments.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pkg/signalmeow/attachments.go b/pkg/signalmeow/attachments.go index 2c8f1ea..e09dd7e 100644 --- a/pkg/signalmeow/attachments.go +++ b/pkg/signalmeow/attachments.go @@ -93,9 +93,15 @@ func DownloadAttachment( var body []byte var downloadedSize int64 - if into == nil || resp.StatusCode > 400 { - body = make([]byte, resp.ContentLength) - _, err = io.ReadFull(resp.Body, body) + if resp.StatusCode > 400 { + body, err = io.ReadAll(io.LimitReader(resp.Body, 4096)) + } else if into == nil { + if resp.ContentLength > 0 { + body = make([]byte, resp.ContentLength) + _, err = io.ReadFull(resp.Body, body) + } else { + body, err = io.ReadAll(http.MaxBytesReader(nil, resp.Body, max(int64(size), 32*1024)*2)) + } } else { err = fallocate.Fallocate(into, int(resp.ContentLength)) if err != nil { From f49b11c4cbbb46447e8aba055704ef973870ca27 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 22 Mar 2026 12:26:01 +0200 Subject: [PATCH 131/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b0be4f5..99019d5 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.52.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.4 + maunium.net/go/mautrix v0.26.5-0.20260322102453-0c955c396df7 ) require ( diff --git a/go.sum b/go.sum index ec06d77..0ec9eec 100644 --- a/go.sum +++ b/go.sum @@ -99,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.4 h1:enHSnkf0L2V9+VnfJfNhKSReSW6pBKS/x3Su+v+Vovs= -maunium.net/go/mautrix v0.26.4/go.mod h1:YWw8NWTszsbyFAznboicBObwHPgTSLcuTbVX2kY7U2M= +maunium.net/go/mautrix v0.26.5-0.20260322102453-0c955c396df7 h1:KUhlBHWGgknqYC2V8di4DFNh73atDtgPlqqO5FoLmPc= +maunium.net/go/mautrix v0.26.5-0.20260322102453-0c955c396df7/go.mod h1:YWw8NWTszsbyFAznboicBObwHPgTSLcuTbVX2kY7U2M= From 73a8a77e8855419894704402d47ccd9ba338fd3a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 24 Mar 2026 15:24:03 +0200 Subject: [PATCH 132/170] signalmeow: don't drop valid contact entries --- pkg/signalmeow/receiving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 45fafa5..9fa4b84 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -773,7 +773,7 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess convertedContacts := make([]*types.Recipient, 0, len(contacts)) err = cli.Store.DoContactTxn(ctx, func(ctx context.Context) error { for i, signalContact := range contacts { - if signalContact.Aci == nil || *signalContact.Aci == "" { + if (signalContact.Aci == nil || *signalContact.Aci == "") && len(signalContact.AciBinary) != 16 { // TODO lookup PNI via CDSI and store that when ACI is missing? log.Info(). Any("contact", signalContact). From 40f320061c1d09691a7f15f901b814f5b58e27f3 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 31 Mar 2026 19:56:36 +0300 Subject: [PATCH 133/170] dependencies: update mautrix-go --- go.mod | 12 ++++++------ go.sum | 32 ++++++++++++-------------------- pkg/connector/handlematrix.go | 3 +++ 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 99019d5..c2ff042 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff github.com/google/uuid v1.6.0 github.com/mattn/go-pointer v0.0.1 - github.com/rs/zerolog v1.34.0 + github.com/rs/zerolog v1.35.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 go.mau.fi/util v0.9.7 @@ -20,18 +20,18 @@ require ( golang.org/x/net v0.52.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.5-0.20260322102453-0c955c396df7 + maunium.net/go/mautrix v0.26.5-0.20260331163037-18917f3bdc14 ) require ( filippo.io/edwards25519 v1.2.0 // indirect - github.com/coreos/go-systemd/v22 v22.6.0 // indirect + github.com/coreos/go-systemd/v22 v22.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/lib/pq v1.11.2 // indirect + github.com/lib/pq v1.12.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.34 // indirect + github.com/mattn/go-sqlite3 v1.14.37 // indirect github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect @@ -40,7 +40,7 @@ require ( github.com/tidwall/match v1.2.0 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect - github.com/yuin/goldmark v1.7.16 // indirect + github.com/yuin/goldmark v1.8.2 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect golang.org/x/mod v0.34.0 // indirect golang.org/x/sync v0.20.0 // indirect diff --git a/go.sum b/go.sum index 0ec9eec..44ce4a1 100644 --- a/go.sum +++ b/go.sum @@ -4,15 +4,13 @@ github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7Oputl github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo= -github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU= +github.com/coreos/go-systemd/v22 v22.7.0 h1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA= +github.com/coreos/go-systemd/v22 v22.7.0/go.mod h1:xNUYtjHu2EDXbsxz1i41wouACIwT7Ybq9o0BQhMwD0w= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff h1:4N8wnS3f1hNHSmFD5zgFkWCyA4L1kCDkImPAtK7D6tg= github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -24,23 +22,19 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.11.2 h1:x6gxUeu39V0BHZiugWe8LXZYZ+Utk7hSJGThs8sdzfs= -github.com/lib/pq v1.11.2/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/lib/pq v1.12.0 h1:mC1zeiNamwKBecjHarAr26c/+d8V5w/u4J0I/yASbJo= +github.com/lib/pq v1.12.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= -github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk= -github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.37 h1:3DOZp4cXis1cUIpCfXLtmlGolNLp2VEqhiB/PARNBIg= +github.com/mattn/go-sqlite3 v1.14.37/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6 h1:rh2lKw/P/EqHa724vYH2+VVQ1YnW4u6EOXl0PMAovZE= github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= @@ -48,8 +42,8 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= -github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= -github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= +github.com/rs/zerolog v1.35.0 h1:VD0ykx7HMiMJytqINBsKcbLS+BJ4WYjz+05us+LRTdI= +github.com/rs/zerolog v1.35.0/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= @@ -65,8 +59,8 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= -github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= +github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= go.mau.fi/util v0.9.7 h1:AWGNbJfz1zRcQOKeOEYhKUG2fT+/26Gy6kyqcH8tnBg= go.mau.fi/util v0.9.7/go.mod h1:5T2f3ZWZFAGgmFwg3dGw7YK6kIsb9lryDzvynoR98pE= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= @@ -81,9 +75,7 @@ golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= @@ -99,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.5-0.20260322102453-0c955c396df7 h1:KUhlBHWGgknqYC2V8di4DFNh73atDtgPlqqO5FoLmPc= -maunium.net/go/mautrix v0.26.5-0.20260322102453-0c955c396df7/go.mod h1:YWw8NWTszsbyFAznboicBObwHPgTSLcuTbVX2kY7U2M= +maunium.net/go/mautrix v0.26.5-0.20260331163037-18917f3bdc14 h1:y+4gtqKBMTtcVUiAeWJnvp88JLo/h3myQPsz1rZfNOY= +maunium.net/go/mautrix v0.26.5-0.20260331163037-18917f3bdc14/go.mod h1:RUSMBPky3jhXB7Ux+AptfkEvFlJ4ajZKCYiXI8YzxVE= diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 0ef84f6..89b7d45 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -407,6 +407,9 @@ func (s *SignalClient) HandleMatrixRoomTopic(ctx context.Context, msg *bridgev2. } func (s *SignalClient) HandleMatrixMembership(ctx context.Context, msg *bridgev2.MatrixMembershipChange) (*bridgev2.MatrixMembershipResult, error) { + if msg.Type.IsSelf && msg.OrigSender != nil { + return nil, nil + } var targetIntent bridgev2.MatrixAPI var targetSignalID libsignalgo.ServiceID var err error From e9da747f37d21b5ddadb88a190b508436c0b27de Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 7 Apr 2026 00:50:21 +0300 Subject: [PATCH 134/170] .github: add checklist to bug report template --- .github/ISSUE_TEMPLATE/bug.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index 3703df9..c10630f 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -7,10 +7,11 @@ type: Bug --- - -It's always best to ask in the Matrix room first, especially if you aren't sure -what details are needed. Issues with insufficient detail will likely just be -ignored or closed immediately. ---> +### Checklist + + + +* [ ] This is an actual bug, not just a setup issue (see the [troubleshooting docs](https://docs.mau.fi/bridges/general/troubleshooting.html) or ask in the Matrix room for setup help). +* [ ] I am certain that sufficient information is included. Ask in the Matrix room first if not. From 426b1f82669e8ba4690006016471b52b416f9db0 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 7 Apr 2026 00:50:47 +0300 Subject: [PATCH 135/170] chatinfo: fix room name in DMs --- pkg/connector/chatinfo.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 4ce1f9d..87f1f6f 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -414,7 +414,7 @@ func (s *SignalClient) GetContactList(ctx context.Context) ([]*bridgev2.ResolveI } func (s *SignalClient) makeCreateDMResponse(ctx context.Context, recipient *types.Recipient, backupChat *store.BackupChat) *bridgev2.CreateChatResponse { - name := "" + namePtr := bridgev2.DefaultChatName topic := PrivateChatTopic selfUser := s.makeEventSender(s.Client.Store.ACI) members := &bridgev2.ChatMemberList{ @@ -441,7 +441,7 @@ func (s *SignalClient) makeCreateDMResponse(ctx context.Context, recipient *type var serviceID libsignalgo.ServiceID var avatar *bridgev2.Avatar if recipient.ACI == uuid.Nil { - name = s.Main.Config.FormatDisplayname(recipient) + namePtr = ptr.Ptr(s.Main.Config.FormatDisplayname(recipient)) serviceID = libsignalgo.NewPNIServiceID(recipient.PNI) } else { if backupChat == nil { @@ -453,7 +453,7 @@ func (s *SignalClient) makeCreateDMResponse(ctx context.Context, recipient *type } members.OtherUserID = signalid.MakeUserID(recipient.ACI) if recipient.ACI == s.Client.Store.ACI { - name = NoteToSelfName + namePtr = ptr.Ptr(NoteToSelfName) avatar = &bridgev2.Avatar{ ID: networkid.AvatarID(s.Main.Config.NoteToSelfAvatar), Remove: len(s.Main.Config.NoteToSelfAvatar) == 0, @@ -474,7 +474,7 @@ func (s *SignalClient) makeCreateDMResponse(ctx context.Context, recipient *type return &bridgev2.CreateChatResponse{ PortalKey: s.makeDMPortalKey(serviceID), PortalInfo: &bridgev2.ChatInfo{ - Name: &name, + Name: namePtr, Avatar: avatar, Topic: &topic, Members: members, From 9257116792a818485859627ed1db857977d98b8f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 9 Apr 2026 13:58:06 +0300 Subject: [PATCH 136/170] client: ensure connection is cancelled when bridge is stopped --- pkg/connector/client.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index e224c17..186ab4d 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -281,7 +281,7 @@ func (s *SignalClient) Disconnect() { } func (s *SignalClient) postLoginConnect() { - ctx := s.UserLogin.Log.WithContext(context.Background()) + ctx := s.UserLogin.Log.WithContext(s.Main.Bridge.BackgroundCtx) // TODO it would be more proper to only connect after syncing, // but currently syncing will fetch group info online, so it has to be connected. s.tryConnect(ctx, 0, false) @@ -300,6 +300,13 @@ func (s *SignalClient) postLoginConnect() { } func (s *SignalClient) tryConnect(ctx context.Context, retryCount int, doSync bool) { + if ctx.Err() != nil { + zerolog.Ctx(ctx).Debug(). + Int("retry_count", retryCount). + AnErr("ctx_err", ctx.Err()). + Msg("Context is canceled, not trying to connect") + return + } if retryCount == 0 { s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnecting}) } From e5a4f55e83749f25c153c6bea02f2c89c4fa932d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 9 Apr 2026 13:58:24 +0300 Subject: [PATCH 137/170] signalmeow/backup: return early if WaitForTransfer is cancelled --- pkg/signalmeow/backup.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/signalmeow/backup.go b/pkg/signalmeow/backup.go index fcbfff0..f003e19 100644 --- a/pkg/signalmeow/backup.go +++ b/pkg/signalmeow/backup.go @@ -282,7 +282,11 @@ func (cli *Client) WaitForTransfer(ctx context.Context) (*TransferArchiveMetadat } reqDuration := time.Since(reqStart) if reqDuration < reqTimeout-10*time.Second { - time.Sleep(15 * time.Second) + select { + case <-time.After(15 * time.Second): + case <-ctx.Done(): + return nil, ctx.Err() + } } } } From 9d34e0d7fac468be20b6b451092b58aad36624dd Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 9 Apr 2026 13:58:58 +0300 Subject: [PATCH 138/170] chatsync: catch missing recipients for backup chats --- pkg/connector/chatsync.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/connector/chatsync.go b/pkg/connector/chatsync.go index 5211270..7c891aa 100644 --- a/pkg/connector/chatsync.go +++ b/pkg/connector/chatsync.go @@ -69,6 +69,12 @@ func (s *SignalClient) syncChats(ctx context.Context) { if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to get recipient for chat") continue + } else if recipient == nil { + zerolog.Ctx(ctx).Warn(). + Uint64("backup_chat_id", chat.Id). + Uint64("backup_recipient_id", chat.RecipientId). + Msg("No recipient found for chat") + continue } resyncEvt := &simplevent.ChatResync{ EventMeta: simplevent.EventMeta{ From 59eaa364159c4910575e635cb9d78fd59077f7ff Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 9 Apr 2026 13:59:21 +0300 Subject: [PATCH 139/170] chatsync: stop syncing if client is logged out Closes #645 --- pkg/connector/chatsync.go | 17 ++++++++++++- pkg/connector/client.go | 51 ++++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/pkg/connector/chatsync.go b/pkg/connector/chatsync.go index 7c891aa..636cad7 100644 --- a/pkg/connector/chatsync.go +++ b/pkg/connector/chatsync.go @@ -32,10 +32,19 @@ import ( "go.mau.fi/mautrix-signal/pkg/signalmeow/types" ) -func (s *SignalClient) syncChats(ctx context.Context) { +func (s *SignalClient) stopChatSync() { + if cancel := s.cancelChatSync.Swap(nil); cancel != nil { + (*cancel)() + } +} + +func (s *SignalClient) syncChats(ctx context.Context, cancel context.CancelFunc) { + defer cancel() + if s.UserLogin.Metadata.(*signalid.UserLoginMetadata).ChatsSynced { return } + if s.Client.Store.EphemeralBackupKey != nil { zerolog.Ctx(ctx).Info().Msg("Fetching transfer archive before syncing chats") meta, err := s.Client.WaitForTransfer(ctx) @@ -65,6 +74,12 @@ func (s *SignalClient) syncChats(ctx context.Context) { } zerolog.Ctx(ctx).Info().Int("chat_count", len(chats)).Msg("Fetched chats to sync from database") for _, chat := range chats { + if ctx.Err() != nil { + zerolog.Ctx(ctx).Debug(). + AnErr("ctx_err", ctx.Err()). + Msg("Context cancelled while syncing chats, stopping") + return + } recipient, err := s.Client.Store.BackupStore.GetBackupRecipient(ctx, chat.RecipientId) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to get recipient for chat") diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 186ab4d..17ee216 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -19,6 +19,7 @@ package connector import ( "context" "fmt" + "sync/atomic" "time" "github.com/rs/zerolog" @@ -39,6 +40,7 @@ type SignalClient struct { Ghost *bridgev2.Ghost queueEmptyWaiter *exsync.Event + cancelChatSync atomic.Pointer[context.CancelFunc] } var ( @@ -78,6 +80,7 @@ func (s *SignalClient) LogoutRemote(ctx context.Context) { if s.Client == nil { return } + s.stopChatSync() err := s.Client.Unlink(ctx) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to unlink device") @@ -176,6 +179,7 @@ func (s *SignalClient) bridgeStateLoop(statusChan <-chan signalmeow.SignalConnec } case signalmeow.SignalConnectionEventLoggedOut: + s.stopChatSync() s.UserLogin.Log.Debug().Msg("Sending BadCredentials BridgeState") if err == nil { s.UserLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateBadCredentials, Message: "You have been logged out of Signal, please reconnect"}) @@ -274,6 +278,7 @@ func (s *SignalClient) Disconnect() { if s.Client == nil { return } + s.stopChatSync() err := s.Client.StopReceiveLoops() if err != nil { s.UserLogin.Log.Err(err).Msg("Failed to stop receive loops") @@ -282,24 +287,10 @@ func (s *SignalClient) Disconnect() { func (s *SignalClient) postLoginConnect() { ctx := s.UserLogin.Log.WithContext(s.Main.Bridge.BackgroundCtx) - // TODO it would be more proper to only connect after syncing, - // but currently syncing will fetch group info online, so it has to be connected. s.tryConnect(ctx, 0, false) - if s.Client.Store.EphemeralBackupKey != nil { - go func() { - if s.Client.Store.MasterKey != nil { - s.Client.SyncStorage(ctx) - } else { - s.UserLogin.Log.Warn().Msg("No master key for storage sync before backup sync") - } - s.syncChats(ctx) - }() - } else if s.Client.Store.MasterKey != nil { - go s.Client.SyncStorage(ctx) - } } -func (s *SignalClient) tryConnect(ctx context.Context, retryCount int, doSync bool) { +func (s *SignalClient) tryConnect(ctx context.Context, retryCount int, noLoginSync bool) { if ctx.Err() != nil { zerolog.Ctx(ctx).Debug(). Int("retry_count", retryCount). @@ -325,11 +316,33 @@ func (s *SignalClient) tryConnect(ctx context.Context, retryCount int, doSync bo zerolog.Ctx(ctx).Info().Msg("Context canceled, exit tryConnect") return } - s.tryConnect(ctx, retryCount+1, doSync) + s.tryConnect(ctx, retryCount+1, noLoginSync) + return + } + syncCtx, cancel := context.WithCancel(ctx) + if oldCancel := s.cancelChatSync.Swap(&cancel); oldCancel != nil { + (*oldCancel)() + } + go s.bridgeStateLoop(ch) + if noLoginSync { + go s.syncChats(syncCtx, cancel) } else { - go s.bridgeStateLoop(ch) - if doSync { - go s.syncChats(ctx) + // TODO it would be more proper to only connect after syncing, + // but currently syncing will fetch group info online, so it has to be connected. + if s.Client.Store.EphemeralBackupKey != nil { + go func() { + if s.Client.Store.MasterKey != nil { + s.Client.SyncStorage(ctx) + } else { + s.UserLogin.Log.Warn().Msg("No master key for storage sync before backup sync") + } + s.syncChats(syncCtx, cancel) + }() + } else { + cancel() + if s.Client.Store.MasterKey != nil { + go s.Client.SyncStorage(ctx) + } } } } From c2f0a1bbf78848ac5379c01c2656e82028020d9b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 9 Apr 2026 13:59:37 +0300 Subject: [PATCH 140/170] handlesignal: use bridge background context instead of todo --- pkg/connector/handlesignal.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index bc0dbe3..4438cb0 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -467,7 +467,7 @@ func (s *SignalClient) handleSignalReceipt(evt *events.Receipt) bool { Stringer("sender_id", evt.Sender). Stringer("receipt_type", evt.Content.GetType()). Logger() - ctx := log.WithContext(context.TODO()) + ctx := log.WithContext(s.Main.Bridge.BackgroundCtx) receipts := convertReceipts(ctx, evt.Content.Timestamp, func(ctx context.Context, msgTS uint64) (*database.Message, error) { return s.Main.Bridge.DB.Message.GetFirstPartByID(ctx, s.UserLogin.ID, signalid.MakeMessageID(s.Client.Store.ACI, msgTS)) }) @@ -478,7 +478,7 @@ func (s *SignalClient) handleSignalReadSelf(evt *events.ReadSelf) bool { log := s.UserLogin.Log.With(). Str("action", "handle signal read self"). Logger() - ctx := log.WithContext(context.TODO()) + ctx := log.WithContext(s.Main.Bridge.BackgroundCtx) receipts := convertReceipts(ctx, evt.Messages, func(ctx context.Context, msgInfo *signalpb.SyncMessage_Read) (*database.Message, error) { aciUUID, err := signalmeow.ParseStringOrBinaryUUID(msgInfo.GetSenderAci(), msgInfo.GetSenderAciBinary()) if err != nil { @@ -688,7 +688,7 @@ func (s *SignalClient) handleSignalACIFound(evt *events.ACIFound) { Stringer("aci", evt.ACI). Stringer("pni", evt.PNI). Logger() - ctx := log.WithContext(context.TODO()) + ctx := log.WithContext(s.Main.Bridge.BackgroundCtx) pniPortalKey := s.makeDMPortalKey(evt.PNI) aciPortalKey := s.makeDMPortalKey(evt.ACI) result, portal, err := s.Main.Bridge.ReIDPortal(ctx, pniPortalKey, aciPortalKey) @@ -708,7 +708,7 @@ func (s *SignalClient) handleSignalACIFound(evt *events.ACIFound) { func (s *SignalClient) handleSignalContactList(evt *events.ContactList) { log := s.UserLogin.Log.With().Str("action", "handle contact list").Logger() - ctx := log.WithContext(context.TODO()) + ctx := log.WithContext(s.Main.Bridge.BackgroundCtx) for _, contact := range evt.Contacts { if contact.ACI == uuid.Nil { continue From 53a3faa969ad6c58216a59e0e4a36aef65678d54 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 10 Apr 2026 20:46:03 +0300 Subject: [PATCH 141/170] chatinfo: fix uploading avatar when creating group --- pkg/connector/chatinfo.go | 4 ++-- pkg/connector/handlematrix.go | 2 +- pkg/signalmeow/attachments.go | 15 ++++++++++----- pkg/signalmeow/groups.go | 14 +++----------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/pkg/connector/chatinfo.go b/pkg/connector/chatinfo.go index 87f1f6f..0d48c45 100644 --- a/pkg/connector/chatinfo.go +++ b/pkg/connector/chatinfo.go @@ -332,7 +332,7 @@ func (s *SignalClient) CreateGroup(ctx context.Context, params *bridgev2.GroupCr if err != nil { return nil, fmt.Errorf("failed to download avatar: %w", err) } - group.AvatarPath, err = s.Client.UploadGroupAvatar(ctx, avatarBytes, group.GroupIdentifier) + group.AvatarPath, err = s.Client.UploadGroupAvatar(ctx, avatarBytes, group.GroupIdentifier, group.GroupMasterKey) if err != nil { return nil, fmt.Errorf("failed to upload avatar: %w", err) } @@ -362,7 +362,7 @@ func (s *SignalClient) CreateGroup(ctx context.Context, params *bridgev2.GroupCr return nil, fmt.Errorf("failed to set portal room ID: %w", err) } } - resp, err := s.Client.CreateGroup(ctx, group, avatarBytes) + resp, err := s.Client.CreateGroup(ctx, group) if err != nil { return nil, fmt.Errorf("failed to create group: %w", err) } diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 89b7d45..0f63de2 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -387,7 +387,7 @@ func (s *SignalClient) HandleMatrixRoomAvatar(ctx context.Context, msg *bridgev2 return false, fmt.Errorf("failed to download avatar: %w", err) } avatarHash = sha256.Sum256(data) - avatarPath, err = s.Client.UploadGroupAvatar(ctx, data, groupID) + avatarPath, err = s.Client.UploadGroupAvatar(ctx, data, groupID, "") if err != nil { return false, fmt.Errorf("failed to reupload avatar: %w", err) } diff --git a/pkg/signalmeow/attachments.go b/pkg/signalmeow/attachments.go index e09dd7e..a48414e 100644 --- a/pkg/signalmeow/attachments.go +++ b/pkg/signalmeow/attachments.go @@ -369,12 +369,17 @@ func (cli *Client) uploadAttachmentTUS( return nil } -func (cli *Client) UploadGroupAvatar(ctx context.Context, avatarBytes []byte, gid types.GroupIdentifier) (string, error) { +func (cli *Client) UploadGroupAvatar(ctx context.Context, avatarBytes []byte, gid types.GroupIdentifier, groupMasterKey types.SerializedGroupMasterKey) (string, error) { log := zerolog.Ctx(ctx) - groupMasterKey, err := cli.Store.GroupStore.MasterKeyFromGroupIdentifier(ctx, gid) - if err != nil { - log.Err(err).Msg("Could not get master key from group id") - return "", err + if groupMasterKey == "" { + var err error + groupMasterKey, err = cli.Store.GroupStore.MasterKeyFromGroupIdentifier(ctx, gid) + if err != nil { + log.Err(err).Msg("Could not get master key from group id") + return "", err + } else if groupMasterKey == "" { + return "", fmt.Errorf("no master key found for group %s", gid) + } } groupAuth, err := cli.GetAuthorizationForToday(ctx, masterKeyToBytes(groupMasterKey)) if err != nil { diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index b02687b..b9b9db5 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -1662,7 +1662,7 @@ func PrepareGroupCreation(decryptedGroup *Group) (libsignalgo.GroupMasterKey, er return masterKeyBytes, nil } -func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Group, avatarBytes []byte) (*Group, error) { +func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Group) (*Group, error) { log := zerolog.Ctx(ctx).With().Str("action", "CreateGroupOnServer").Logger() masterKeyBytes, err := PrepareGroupCreation(decryptedGroup) if err != nil { @@ -1677,14 +1677,6 @@ func (cli *Client) createGroupOnServer(ctx context.Context, decryptedGroup *Grou log.Err(err).Msg("DeriveGroupSecretParamsFromMasterKey error") return nil, err } - if len(avatarBytes) > 0 { - avatarPath, err := cli.UploadGroupAvatar(ctx, avatarBytes, decryptedGroup.GroupIdentifier) - if err != nil { - log.Err(err).Msg("Failed to upload group avatar") - return nil, err - } - decryptedGroup.AvatarPath = avatarPath - } encryptedGroup, err := cli.EncryptGroup(ctx, decryptedGroup, groupSecretParams) if err != nil { log.Err(err).Msg("Failed to encrypt group") @@ -1735,9 +1727,9 @@ func GenerateInviteLinkPassword() types.SerializedInviteLinkPassword { return InviteLinkPasswordFromBytes(random.Bytes(16)) } -func (cli *Client) CreateGroup(ctx context.Context, decryptedGroup *Group, avatarBytes []byte) (*Group, error) { +func (cli *Client) CreateGroup(ctx context.Context, decryptedGroup *Group) (*Group, error) { log := zerolog.Ctx(ctx).With().Str("action", "CreateGroup").Logger() - group, err := cli.createGroupOnServer(ctx, decryptedGroup, avatarBytes) + group, err := cli.createGroupOnServer(ctx, decryptedGroup) if err != nil { log.Err(err).Msg("Error creating group on server") return nil, err From aad72ca39bcc3d11ad5877c28d43906d2313cb7d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 11 Apr 2026 01:06:38 +0300 Subject: [PATCH 142/170] dependencies: update mautrix-go --- go.mod | 4 ++-- go.sum | 8 ++++---- pkg/connector/backfill.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index c2ff042..78ca5a0 100644 --- a/go.mod +++ b/go.mod @@ -14,13 +14,13 @@ require ( github.com/rs/zerolog v1.35.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.7 + go.mau.fi/util v0.9.8-0.20260406161447-0300c476893a golang.org/x/crypto v0.49.0 golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 golang.org/x/net v0.52.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.5-0.20260331163037-18917f3bdc14 + maunium.net/go/mautrix v0.26.5-0.20260410220226-744570e6f1f5 ) require ( diff --git a/go.sum b/go.sum index 44ce4a1..57a3b8d 100644 --- a/go.sum +++ b/go.sum @@ -61,8 +61,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.7 h1:AWGNbJfz1zRcQOKeOEYhKUG2fT+/26Gy6kyqcH8tnBg= -go.mau.fi/util v0.9.7/go.mod h1:5T2f3ZWZFAGgmFwg3dGw7YK6kIsb9lryDzvynoR98pE= +go.mau.fi/util v0.9.8-0.20260406161447-0300c476893a h1:OQQF3rTJH10l6+dcP0OKnYbNDMBTGoIZZINNJm8QBG8= +go.mau.fi/util v0.9.8-0.20260406161447-0300c476893a/go.mod h1:5T2f3ZWZFAGgmFwg3dGw7YK6kIsb9lryDzvynoR98pE= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.5-0.20260331163037-18917f3bdc14 h1:y+4gtqKBMTtcVUiAeWJnvp88JLo/h3myQPsz1rZfNOY= -maunium.net/go/mautrix v0.26.5-0.20260331163037-18917f3bdc14/go.mod h1:RUSMBPky3jhXB7Ux+AptfkEvFlJ4ajZKCYiXI8YzxVE= +maunium.net/go/mautrix v0.26.5-0.20260410220226-744570e6f1f5 h1:icMEYdJZfRKWXf5AyPk/2jncA84DmfxzrjhCZ4Mm/PE= +maunium.net/go/mautrix v0.26.5-0.20260410220226-744570e6f1f5/go.mod h1:MX4DQLiBe0c7sI/wizruqdxHinSOWs42/DYsP9GH7Q4= diff --git a/pkg/connector/backfill.go b/pkg/connector/backfill.go index 3f9a611..b7b2a23 100644 --- a/pkg/connector/backfill.go +++ b/pkg/connector/backfill.go @@ -187,7 +187,7 @@ func (s *SignalClient) FetchMessages(ctx context.Context, params bridgev2.FetchM CompleteCallback: func() { // When reaching the last backwards backfill batch, delete the chat from the backup store. // If backwards backfilling isn't enabled, delete immediately after the first backfill request. - if (!params.Forward && len(items) < params.Count) || (!s.Main.Bridge.Config.Backfill.Queue.Enabled && !s.Main.Bridge.Config.Backfill.WillPaginateManually) { + if (!params.Forward && len(items) < params.Count) || !s.Main.Bridge.Config.Backfill.Queue.AnyEnabled() { err := s.Client.Store.BackupStore.DeleteBackupChat(ctx, chat.Id) if err != nil { zerolog.Ctx(ctx).Err(err).Msg("Failed to delete chat from backup store") From 1c531e03daf1b43cf3f3dc640c9361b3d0be0eb8 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 12 Apr 2026 23:15:42 +0300 Subject: [PATCH 143/170] signalmeow/groups: catch missing group master key --- pkg/signalmeow/groups.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index b9b9db5..6dcd4ea 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -1513,11 +1513,15 @@ func (cli *Client) patchGroup(ctx context.Context, groupChange *signalpb.GroupCh return &changeResp, nil } +var ErrGroupMasterKeyNotFound = errors.New("group master key not found in store") + func (cli *Client) UpdateGroup(ctx context.Context, groupChange *GroupChange, gid types.GroupIdentifier) (uint32, error) { log := zerolog.Ctx(ctx).With().Str("action", "UpdateGroup").Logger() groupMasterKey, err := cli.Store.GroupStore.MasterKeyFromGroupIdentifier(ctx, gid) if err != nil { return 0, fmt.Errorf("failed to get master key for group: %w", err) + } else if groupMasterKey == "" { + return 0, ErrGroupMasterKeyNotFound } groupChange.GroupMasterKey = groupMasterKey masterKeyBytes := masterKeyToBytes(groupMasterKey) @@ -1752,7 +1756,7 @@ func (cli *Client) GetGroupHistoryPage(ctx context.Context, gid types.GroupIdent return nil, err } if groupMasterKey == "" { - return nil, fmt.Errorf("No group master key found for group identifier %s", gid) + return nil, ErrGroupMasterKeyNotFound } masterKeyBytes := masterKeyToBytes(groupMasterKey) groupAuth, err := cli.GetAuthorizationForToday(ctx, masterKeyBytes) From fdb9a61601907d5391ab8a6716e886192ac55b58 Mon Sep 17 00:00:00 2001 From: Rowan <151715+rwky@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:49:01 +0100 Subject: [PATCH 144/170] docker: add missing protobuf-dev package to non-ci dockerfile (#646) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 63e7542..1acc3d2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # -- Build libsignal (with Rust) -- FROM rust:1-alpine AS rust-builder -RUN apk add --no-cache git make cmake protoc musl-dev g++ clang-dev +RUN apk add --no-cache git make cmake protoc musl-dev g++ clang-dev protobuf-dev WORKDIR /build # Copy all files needed for Rust build, and no Go files From 952e7c473b28884eea56c0d60f107f0ef2ded296 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 13 Apr 2026 15:31:31 +0300 Subject: [PATCH 145/170] libsignal: update to v0.92.1 --- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 102 +++++++++++++++++++--------- pkg/libsignalgo/logging.go | 14 +++- pkg/libsignalgo/message.go | 3 +- pkg/libsignalgo/prekey.go | 3 +- pkg/libsignalgo/sealedsender.go | 13 +++- pkg/libsignalgo/session_test.go | 12 ++-- pkg/libsignalgo/setup_test.go | 2 + pkg/libsignalgo/version.go | 2 +- pkg/signalmeow/misc.go | 2 + pkg/signalmeow/receiving_decrypt.go | 5 ++ pkg/signalmeow/sending.go | 9 ++- 12 files changed, 120 insertions(+), 49 deletions(-) diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index a5e7667..b58bd7d 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit a5e76674882a89bac1ed3f4a982120652966d21e +Subproject commit b58bd7d5dfa0a391486df4210fd83bab96b9b479 diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index 59409c8..fe3bf52 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -261,6 +261,7 @@ typedef enum { SignalErrorCodeRequestUnauthorized = 220, SignalErrorCodeMismatchedDevices = 221, SignalErrorCodeServiceIdNotFound = 222, + SignalErrorCodeUploadTooLarge = 223, } SignalErrorCode; enum SignalSvr2CredentialsResult { @@ -511,6 +512,46 @@ typedef struct { const SignalAuthenticatedChatConnection *raw; } SignalConstPointerAuthenticatedChatConnection; +/** + * A type alias to be used with [`OwnedBufferOf`], so that `OwnedBufferOf` and + * `OwnedBufferOf<*const c_char>` get distinct names. + */ +typedef const char *SignalCStringPtr; + +/** + * A representation of a array allocated on the Rust heap for use in C code. + */ +typedef struct { + SignalCStringPtr *base; + /** + * The number of elements in the buffer (not necessarily the number of bytes). + */ + size_t length; +} SignalOwnedBufferOfCStringPtr; + +typedef struct { + uint32_t cdn; + SignalCStringPtr key; + SignalOwnedBufferOfCStringPtr header_keys; + SignalOwnedBufferOfCStringPtr header_values; + SignalCStringPtr signed_upload_url; +} SignalFfiUploadForm; + +/** + * A C callback used to report the results of Rust futures. + * + * cbindgen will produce independent C types like `SignalCPromisei32` and + * `SignalCPromiseProtocolAddress`. + * + * This derives Copy because it behaves like a C type; nevertheless, a promise should still only be + * completed once. + */ +typedef struct { + void (*complete)(SignalFfiError *error, const SignalFfiUploadForm *result, const void *context); + const void *context; + SignalCancellationId cancellation_id; +} SignalCPromiseFfiUploadForm; + typedef SignalConnectionInfo SignalChatConnectionInfo; typedef struct { @@ -562,23 +603,6 @@ typedef struct { const SignalFfiChatListenerStruct *raw; } SignalConstPointerFfiChatListenerStruct; -/** - * A type alias to be used with [`OwnedBufferOf`], so that `OwnedBufferOf` and - * `OwnedBufferOf<*const c_char>` get distinct names. - */ -typedef const char *SignalCStringPtr; - -/** - * A representation of a array allocated on the Rust heap for use in C code. - */ -typedef struct { - SignalCStringPtr *base; - /** - * The number of elements in the buffer (not necessarily the number of bytes). - */ - size_t length; -} SignalOwnedBufferOfCStringPtr; - typedef struct { uint16_t status; const char *message; @@ -945,6 +969,11 @@ typedef struct { SignalOwnedBuffer second; } SignalPairOfc_charOwnedBufferOfc_uchar; +typedef struct { + SignalPairOfc_charOwnedBufferOfc_uchar first; + int64_t second; +} SignalPairOfPairOfc_charOwnedBufferOfc_uchari64; + typedef struct { const char *first; bool second; @@ -1075,15 +1104,18 @@ typedef struct { SignalIncrementalMac *raw; } SignalMutPointerIncrementalMac; -typedef void (*SignalLogCallback)(void *ctx, SignalLogLevel level, const char *file, uint32_t line, const char *message); +typedef int (*SignalFfiLoggerLog)(void *ctx, SignalLogLevel level, const char *file, uint32_t line, const char *message); -typedef void (*SignalLogFlushCallback)(void *ctx); +typedef int (*SignalFfiLoggerFlush)(void *ctx); + +typedef void (*SignalFfiLoggerDestroy)(void *ctx); typedef struct { void *ctx; - SignalLogCallback log; - SignalLogFlushCallback flush; -} SignalFfiLogger; + SignalFfiLoggerLog log; + SignalFfiLoggerFlush flush; + SignalFfiLoggerDestroy destroy; +} SignalFfiLoggerStruct; /** * A C callback used to report the results of Rust futures. @@ -1695,6 +1727,8 @@ SignalFfiError *signal_authenticated_chat_connection_destroy(SignalMutPointerAut SignalFfiError *signal_authenticated_chat_connection_disconnect(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerAuthenticatedChatConnection chat); +SignalFfiError *signal_authenticated_chat_connection_get_upload_form(SignalCPromiseFfiUploadForm *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerAuthenticatedChatConnection chat, uint64_t upload_length); + SignalFfiError *signal_authenticated_chat_connection_info(SignalMutPointerChatConnectionInfo *out, SignalConstPointerAuthenticatedChatConnection chat); SignalFfiError *signal_authenticated_chat_connection_init_listener(SignalConstPointerAuthenticatedChatConnection chat, SignalConstPointerFfiChatListenerStruct listener); @@ -1865,7 +1899,7 @@ SignalFfiError *signal_create_call_link_credential_response_check_valid_contents SignalFfiError *signal_decrypt_message(SignalOwnedBuffer *out, SignalConstPointerSignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store); -SignalFfiError *signal_decrypt_pre_key_message(SignalOwnedBuffer *out, SignalConstPointerPreKeySignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, SignalConstPointerFfiPreKeyStoreStruct prekey_store, SignalConstPointerFfiSignedPreKeyStoreStruct signed_prekey_store, SignalConstPointerFfiKyberPreKeyStoreStruct kyber_prekey_store); +SignalFfiError *signal_decrypt_pre_key_message(SignalOwnedBuffer *out, SignalConstPointerPreKeySignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerProtocolAddress local_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, SignalConstPointerFfiPreKeyStoreStruct prekey_store, SignalConstPointerFfiSignedPreKeyStoreStruct signed_prekey_store, SignalConstPointerFfiKyberPreKeyStoreStruct kyber_prekey_store); SignalFfiError *signal_decryption_error_message_clone(SignalMutPointerDecryptionErrorMessage *new_obj, SignalConstPointerDecryptionErrorMessage obj); @@ -1891,7 +1925,7 @@ SignalFfiError *signal_device_transfer_generate_private_key(SignalOwnedBuffer *o SignalFfiError *signal_device_transfer_generate_private_key_with_format(SignalOwnedBuffer *out, uint8_t key_format); -SignalFfiError *signal_encrypt_message(SignalMutPointerCiphertextMessage *out, SignalBorrowedBuffer ptext, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, uint64_t now); +SignalFfiError *signal_encrypt_message(SignalMutPointerCiphertextMessage *out, SignalBorrowedBuffer ptext, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerProtocolAddress local_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, uint64_t now); void signal_error_free(SignalFfiError *err); @@ -1905,7 +1939,7 @@ SignalFfiError *signal_error_get_mismatched_device_errors(SignalOwnedBufferOfFfi SignalFfiError *signal_error_get_our_fingerprint_version(uint32_t *out, SignalUnwindSafeArgSignalFfiError err); -SignalFfiError *signal_error_get_rate_limit_challenge(SignalPairOfc_charOwnedBufferOfc_uchar *out, SignalUnwindSafeArgSignalFfiError err); +SignalFfiError *signal_error_get_rate_limit_challenge(SignalPairOfPairOfc_charOwnedBufferOfc_uchari64 *out, SignalUnwindSafeArgSignalFfiError err); SignalFfiError *signal_error_get_registration_error_not_deliverable(SignalPairOfc_charbool *out, SignalUnwindSafeArgSignalFfiError err); @@ -2080,18 +2114,16 @@ SignalFfiError *signal_incremental_mac_initialize(SignalMutPointerIncrementalMac SignalFfiError *signal_incremental_mac_update(SignalOwnedBuffer *out, SignalMutPointerIncrementalMac mac, SignalBorrowedBuffer bytes, uint32_t offset, uint32_t length); -bool signal_init_logger(SignalLogLevel max_level, SignalFfiLogger logger); +bool signal_init_logger(SignalLogLevel max_level, SignalFfiLoggerStruct logger); SignalFfiError *signal_key_transparency_aci_search_key(SignalOwnedBuffer *out, const SignalServiceIdFixedWidthBinaryBytes *aci); +SignalFfiError *signal_key_transparency_check(SignalCPromiseOwnedBufferOfc_uchar *promise, SignalConstPointerTokioAsyncContext async_runtime, uint8_t environment, SignalConstPointerUnauthenticatedChatConnection chat_connection, const SignalServiceIdFixedWidthBinaryBytes *aci, SignalConstPointerPublicKey aci_identity_key, const char *e164, SignalOptionalBorrowedSliceOfc_uchar unidentified_access_key, SignalOptionalBorrowedSliceOfc_uchar username_hash, SignalOptionalBorrowedSliceOfc_uchar account_data, SignalBorrowedBuffer last_distinguished_tree_head, bool is_self_check, bool is_e164_discoverable); + SignalFfiError *signal_key_transparency_distinguished(SignalCPromiseOwnedBufferOfc_uchar *promise, SignalConstPointerTokioAsyncContext async_runtime, uint8_t environment, SignalConstPointerUnauthenticatedChatConnection chat_connection, SignalOptionalBorrowedSliceOfc_uchar last_distinguished_tree_head); SignalFfiError *signal_key_transparency_e164_search_key(SignalOwnedBuffer *out, const char *e164); -SignalFfiError *signal_key_transparency_monitor(SignalCPromiseOwnedBufferOfc_uchar *promise, SignalConstPointerTokioAsyncContext async_runtime, uint8_t environment, SignalConstPointerUnauthenticatedChatConnection chat_connection, const SignalServiceIdFixedWidthBinaryBytes *aci, SignalConstPointerPublicKey aci_identity_key, const char *e164, SignalOptionalBorrowedSliceOfc_uchar unidentified_access_key, SignalOptionalBorrowedSliceOfc_uchar username_hash, SignalOptionalBorrowedSliceOfc_uchar account_data, SignalBorrowedBuffer last_distinguished_tree_head, bool is_self_monitor); - -SignalFfiError *signal_key_transparency_search(SignalCPromiseOwnedBufferOfc_uchar *promise, SignalConstPointerTokioAsyncContext async_runtime, uint8_t environment, SignalConstPointerUnauthenticatedChatConnection chat_connection, const SignalServiceIdFixedWidthBinaryBytes *aci, SignalConstPointerPublicKey aci_identity_key, const char *e164, SignalOptionalBorrowedSliceOfc_uchar unidentified_access_key, SignalOptionalBorrowedSliceOfc_uchar username_hash, SignalOptionalBorrowedSliceOfc_uchar account_data, SignalBorrowedBuffer last_distinguished_tree_head); - SignalFfiError *signal_key_transparency_username_hash_search_key(SignalOwnedBuffer *out, SignalBorrowedBuffer hash); SignalFfiError *signal_kyber_key_pair_clone(SignalMutPointerKyberKeyPair *new_obj, SignalConstPointerKyberKeyPair obj); @@ -2724,16 +2756,22 @@ SignalFfiError *signal_tokio_async_context_new(SignalMutPointerTokioAsyncContext SignalFfiError *signal_unauthenticated_chat_connection_account_exists(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, const SignalServiceIdFixedWidthBinaryBytes *account); +SignalFfiError *signal_unauthenticated_chat_connection_backup_get_media_upload_form(SignalCPromiseFfiUploadForm *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer credential, SignalBorrowedBuffer server_keys, SignalConstPointerPrivateKey signing_key, uint64_t upload_size, int64_t rng); + +SignalFfiError *signal_unauthenticated_chat_connection_backup_get_upload_form(SignalCPromiseFfiUploadForm *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer credential, SignalBorrowedBuffer server_keys, SignalConstPointerPrivateKey signing_key, uint64_t upload_size, int64_t rng); + SignalFfiError *signal_unauthenticated_chat_connection_connect(SignalCPromiseMutPointerUnauthenticatedChatConnection *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerConnectionManager connection_manager, SignalBorrowedBytestringArray languages); SignalFfiError *signal_unauthenticated_chat_connection_destroy(SignalMutPointerUnauthenticatedChatConnection p); SignalFfiError *signal_unauthenticated_chat_connection_disconnect(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat); -SignalFfiError *signal_unauthenticated_chat_connection_get_pre_keys_access_group_auth(SignalCPromiseFfiPreKeysResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer auth, const SignalServiceIdFixedWidthBinaryBytes *target, int32_t device); - SignalFfiError *signal_unauthenticated_chat_connection_get_pre_keys_access_key_auth(SignalCPromiseFfiPreKeysResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, const uint8_t (*auth)[16], const SignalServiceIdFixedWidthBinaryBytes *target, int32_t device); +SignalFfiError *signal_unauthenticated_chat_connection_get_pre_keys_group_auth(SignalCPromiseFfiPreKeysResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer auth, const SignalServiceIdFixedWidthBinaryBytes *target, int32_t device); + +SignalFfiError *signal_unauthenticated_chat_connection_get_pre_keys_unrestricted_auth(SignalCPromiseFfiPreKeysResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, const SignalServiceIdFixedWidthBinaryBytes *target, int32_t device); + SignalFfiError *signal_unauthenticated_chat_connection_info(SignalMutPointerChatConnectionInfo *out, SignalConstPointerUnauthenticatedChatConnection chat); SignalFfiError *signal_unauthenticated_chat_connection_init_listener(SignalConstPointerUnauthenticatedChatConnection chat, SignalConstPointerFfiChatListenerStruct listener); diff --git a/pkg/libsignalgo/logging.go b/pkg/libsignalgo/logging.go index 9d21afa..1926c23 100644 --- a/pkg/libsignalgo/logging.go +++ b/pkg/libsignalgo/logging.go @@ -21,6 +21,7 @@ package libsignalgo extern void signal_log_callback(void *ctx, SignalLogLevel level, char *file, uint32_t line, char *message); extern void signal_log_flush_callback(void *ctx); +extern void signal_log_destroy_callback(void *ctx); */ import "C" import ( @@ -40,6 +41,11 @@ func signal_log_flush_callback(ctx unsafe.Pointer) { ffiLogger.Flush() } +//export signal_log_destroy_callback +func signal_log_destroy_callback(ctx unsafe.Pointer) { + ffiLogger.Destroy() +} + type LogLevel int const ( @@ -53,12 +59,14 @@ const ( type Logger interface { Log(level LogLevel, file string, line uint, message string) Flush() + Destroy() } func InitLogger(level LogLevel, logger Logger) { ffiLogger = logger - C.signal_init_logger(C.SignalLogLevel(level), C.SignalFfiLogger{ - log: C.SignalLogCallback(C.signal_log_callback), - flush: C.SignalLogFlushCallback(C.signal_log_flush_callback), + C.signal_init_logger(C.SignalLogLevel(level), C.SignalFfiLoggerStruct{ + log: C.SignalFfiLoggerLog(C.signal_log_callback), + flush: C.SignalFfiLoggerFlush(C.signal_log_flush_callback), + destroy: C.SignalFfiLoggerDestroy(C.signal_log_destroy_callback), }) } diff --git a/pkg/libsignalgo/message.go b/pkg/libsignalgo/message.go index f016daa..1b581c0 100644 --- a/pkg/libsignalgo/message.go +++ b/pkg/libsignalgo/message.go @@ -27,7 +27,7 @@ import ( "time" ) -func Encrypt(ctx context.Context, plaintext []byte, forAddress *Address, sessionStore SessionStore, identityKeyStore IdentityKeyStore) (*CiphertextMessage, error) { +func Encrypt(ctx context.Context, plaintext []byte, forAddress, localAddress *Address, sessionStore SessionStore, identityKeyStore IdentityKeyStore) (*CiphertextMessage, error) { var ciphertextMessage C.SignalMutPointerCiphertextMessage var now C.uint64_t = C.uint64_t(time.Now().Unix()) callbackCtx := NewCallbackContext(ctx) @@ -36,6 +36,7 @@ func Encrypt(ctx context.Context, plaintext []byte, forAddress *Address, session &ciphertextMessage, BytesToBuffer(plaintext), forAddress.constPtr(), + localAddress.constPtr(), callbackCtx.wrapSessionStore(sessionStore), callbackCtx.wrapIdentityKeyStore(identityKeyStore), now, diff --git a/pkg/libsignalgo/prekey.go b/pkg/libsignalgo/prekey.go index 4d01f89..29e640e 100644 --- a/pkg/libsignalgo/prekey.go +++ b/pkg/libsignalgo/prekey.go @@ -26,7 +26,7 @@ import ( "runtime" ) -func DecryptPreKey(ctx context.Context, preKeyMessage *PreKeyMessage, fromAddress *Address, sessionStore SessionStore, identityStore IdentityKeyStore, preKeyStore PreKeyStore, signedPreKeyStore SignedPreKeyStore, kyberPreKeyStore KyberPreKeyStore) ([]byte, error) { +func DecryptPreKey(ctx context.Context, preKeyMessage *PreKeyMessage, fromAddress, localAddress *Address, sessionStore SessionStore, identityStore IdentityKeyStore, preKeyStore PreKeyStore, signedPreKeyStore SignedPreKeyStore, kyberPreKeyStore KyberPreKeyStore) ([]byte, error) { callbackCtx := NewCallbackContext(ctx) defer callbackCtx.Unref() var decrypted C.SignalOwnedBuffer = C.SignalOwnedBuffer{} @@ -34,6 +34,7 @@ func DecryptPreKey(ctx context.Context, preKeyMessage *PreKeyMessage, fromAddres &decrypted, preKeyMessage.constPtr(), fromAddress.constPtr(), + localAddress.constPtr(), callbackCtx.wrapSessionStore(sessionStore), callbackCtx.wrapIdentityKeyStore(identityStore), callbackCtx.wrapPreKeyStore(preKeyStore), diff --git a/pkg/libsignalgo/sealedsender.go b/pkg/libsignalgo/sealedsender.go index 56ffe8b..84ff254 100644 --- a/pkg/libsignalgo/sealedsender.go +++ b/pkg/libsignalgo/sealedsender.go @@ -44,8 +44,17 @@ func NewSealedSenderAddress(e164 string, uuid uuid.UUID, deviceID uint32) *Seale } } -func SealedSenderEncryptPlaintext(ctx context.Context, message []byte, contentHint UnidentifiedSenderMessageContentHint, forAddress *Address, fromSenderCert *SenderCertificate, sessionStore SessionStore, identityStore IdentityKeyStore, groupID *GroupIdentifier) ([]byte, error) { - ciphertextMessage, err := Encrypt(ctx, message, forAddress, sessionStore, identityStore) +func SealedSenderEncryptPlaintext( + ctx context.Context, + message []byte, + contentHint UnidentifiedSenderMessageContentHint, + forAddress, localAddress *Address, + fromSenderCert *SenderCertificate, + sessionStore SessionStore, + identityStore IdentityKeyStore, + groupID *GroupIdentifier, +) ([]byte, error) { + ciphertextMessage, err := Encrypt(ctx, message, forAddress, localAddress, sessionStore, identityStore) if err != nil { return nil, err } diff --git a/pkg/libsignalgo/session_test.go b/pkg/libsignalgo/session_test.go index 6d0b720..4bde894 100644 --- a/pkg/libsignalgo/session_test.go +++ b/pkg/libsignalgo/session_test.go @@ -136,7 +136,7 @@ func TestSessionCipher(t *testing.T) { alicePlaintext := []byte{8, 6, 7, 5, 3, 0, 9} - aliceCiphertext, err := libsignalgo.Encrypt(ctx, alicePlaintext, bobAddress, aliceStore, aliceStore) + aliceCiphertext, err := libsignalgo.Encrypt(ctx, alicePlaintext, bobAddress, aliceAddress, aliceStore, aliceStore) assert.NoError(t, err) aliceCiphertextMessageType, err := aliceCiphertext.MessageType() assert.NoError(t, err) @@ -147,13 +147,13 @@ func TestSessionCipher(t *testing.T) { bobCiphertext, err := libsignalgo.DeserializePreKeyMessage(aliceCiphertextSerialized) assert.NoError(t, err) - bobPlaintext, err := libsignalgo.DecryptPreKey(ctx, bobCiphertext, aliceAddress, bobStore, bobStore, bobStore, bobStore, bobStore) + bobPlaintext, err := libsignalgo.DecryptPreKey(ctx, bobCiphertext, aliceAddress, bobAddress, bobStore, bobStore, bobStore, bobStore, bobStore) assert.NoError(t, err) assert.Equal(t, alicePlaintext, bobPlaintext) bobPlaintext2 := []byte{23} - bobCiphertext2, err := libsignalgo.Encrypt(ctx, bobPlaintext2, aliceAddress, bobStore, bobStore) + bobCiphertext2, err := libsignalgo.Encrypt(ctx, bobPlaintext2, aliceAddress, bobAddress, bobStore, bobStore) assert.NoError(t, err) bobCiphertext2MessageType, err := bobCiphertext2.MessageType() assert.NoError(t, err) @@ -187,7 +187,7 @@ func TestSessionCipherWithBadStore(t *testing.T) { alicePlaintext := []byte{8, 6, 7, 5, 3, 0, 9} - aliceCiphertext, err := libsignalgo.Encrypt(ctx, alicePlaintext, bobAddress, aliceStore, aliceStore) + aliceCiphertext, err := libsignalgo.Encrypt(ctx, alicePlaintext, bobAddress, aliceAddress, aliceStore, aliceStore) assert.NoError(t, err) aliceCiphertextMessageType, err := aliceCiphertext.MessageType() assert.NoError(t, err) @@ -198,7 +198,7 @@ func TestSessionCipherWithBadStore(t *testing.T) { bobCiphertext, err := libsignalgo.DeserializePreKeyMessage(aliceCiphertextSerialized) assert.NoError(t, err) t.Skip("This test is broken") // TODO fix - _, err = libsignalgo.DecryptPreKey(ctx, bobCiphertext, aliceAddress, bobStore, bobStore, bobStore, bobStore, bobStore) + _, err = libsignalgo.DecryptPreKey(ctx, bobCiphertext, aliceAddress, bobAddress, bobStore, bobStore, bobStore, bobStore, bobStore) require.Error(t, err) assert.Equal(t, "Test error", err.Error()) } @@ -241,7 +241,7 @@ func TestSealedSenderEncrypt_Repeated(t *testing.T) { }() for i := 0; i < 100; i++ { message := []byte(fmt.Sprintf("%04d vision", i)) - ciphertext, err := libsignalgo.SealedSenderEncryptPlaintext(ctx, message, libsignalgo.UnidentifiedSenderMessageContentHintDefault, bobAddress, senderCert, aliceStore, aliceStore, nil) + ciphertext, err := libsignalgo.SealedSenderEncryptPlaintext(ctx, message, libsignalgo.UnidentifiedSenderMessageContentHintDefault, bobAddress, aliceAddress, senderCert, aliceStore, aliceStore, nil) require.NoError(t, err) assert.NotNil(t, ciphertext) } diff --git a/pkg/libsignalgo/setup_test.go b/pkg/libsignalgo/setup_test.go index c22149d..47d7d77 100644 --- a/pkg/libsignalgo/setup_test.go +++ b/pkg/libsignalgo/setup_test.go @@ -54,6 +54,8 @@ func (FFILogger) Log(level libsignalgo.LogLevel, file string, line uint, message func (FFILogger) Flush() {} +func (FFILogger) Destroy() {} + var loggingSetup = false func setupLogging() { diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index ccd0d51..bd14084 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.89.1" +const Version = "v0.92.1" diff --git a/pkg/signalmeow/misc.go b/pkg/signalmeow/misc.go index 467f646..70d3ba5 100644 --- a/pkg/signalmeow/misc.go +++ b/pkg/signalmeow/misc.go @@ -69,6 +69,8 @@ func (l FFILogger) Log(level libsignalgo.LogLevel, file string, line uint, messa func (FFILogger) Flush() {} +func (FFILogger) Destroy() {} + // Ensure FFILogger implements the Logger interface var _ libsignalgo.Logger = FFILogger{} diff --git a/pkg/signalmeow/receiving_decrypt.go b/pkg/signalmeow/receiving_decrypt.go index 958f84f..24b76ff 100644 --- a/pkg/signalmeow/receiving_decrypt.go +++ b/pkg/signalmeow/receiving_decrypt.go @@ -188,12 +188,17 @@ func (cli *Client) prekeyDecrypt( if is == nil { return nil, fmt.Errorf("no identity store found for %s", destination) } + destinationAddress, err := destination.Address(uint(cli.Store.DeviceID)) + if err != nil { + return nil, fmt.Errorf("failed to get own/destination address: %w", err) + } plaintext, ciphertextHash, err := cli.bufferedDecryptTxn(ctx, encryptedContent, serverTimestamp, func(ctx context.Context) ([]byte, error) { return libsignalgo.DecryptPreKey( ctx, preKeyMessage, sender, + destinationAddress, ss, is, pks, diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 568b4d4..94f1dcf 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -171,6 +171,10 @@ func (cli *Client) buildMessagesToSend( } else if len(sessions) == 0 { return nil, fmt.Errorf("no sessions found for recipient %s", recipient.String()) } + localAddress, err := cli.Store.ACIServiceID().Address(uint(cli.Store.DeviceID)) + if err != nil { + return nil, fmt.Errorf("failed to get own address: %w", err) + } messages := make([]MyMessage, 0, len(sessions)) for _, tuple := range sessions { @@ -193,7 +197,7 @@ func (cli *Client) buildMessagesToSend( includeE164 := groupID == nil && cli.Store.AccountRecord.GetPhoneNumberSharingMode() == signalpb.AccountRecord_EVERYBODY envelopeType, encryptedPayload, err := cli.buildMessageToSend( - ctx, tuple.Address, paddedMessage, getContentHint(content), ctmOverride, groupID, includeE164, unauthenticated, + ctx, tuple.Address, localAddress, paddedMessage, getContentHint(content), ctmOverride, groupID, includeE164, unauthenticated, ) if err != nil { return nil, err @@ -232,7 +236,7 @@ func ctmTypeToEnvelopeType(ctmType libsignalgo.CiphertextMessageType) signalpb.E func (cli *Client) buildMessageToSend( ctx context.Context, - recipientAddress *libsignalgo.Address, + recipientAddress, localAddress *libsignalgo.Address, paddedMessage []byte, contentHint libsignalgo.UnidentifiedSenderMessageContentHint, ciphertextMessage *libsignalgo.CiphertextMessage, @@ -244,6 +248,7 @@ func (cli *Client) buildMessageToSend( ctx, paddedMessage, recipientAddress, + localAddress, cli.Store.ACISessionStore, cli.Store.ACIIdentityStore, ) From 38f2ba9430c23bee7ded9a9a36f11e6eb540d4f3 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 13 Apr 2026 15:31:43 +0300 Subject: [PATCH 146/170] signalmeow/groups: use shared error type for unknown group master key --- pkg/signalmeow/groups.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/signalmeow/groups.go b/pkg/signalmeow/groups.go index 6dcd4ea..147d63d 100644 --- a/pkg/signalmeow/groups.go +++ b/pkg/signalmeow/groups.go @@ -619,7 +619,7 @@ func (cli *Client) fetchGroupByID(ctx context.Context, gid types.GroupIdentifier return nil, fmt.Errorf("failed to get group master key: %w", err) } if groupMasterKey == "" { - return nil, fmt.Errorf("No group master key found for group identifier %s", gid) + return nil, fmt.Errorf("%w for %s", ErrGroupMasterKeyNotFound, gid) } return cli.fetchGroupWithMasterKey(ctx, groupMasterKey) } From 2297e6b48bfe727aaaf49ceb4fdb9efe7a9d5fae Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 13 Apr 2026 16:32:10 +0300 Subject: [PATCH 147/170] signalmeow: update protobufs Content and SyncMessage switched to use oneofs, which is why a lot of code changed --- pkg/connector/handlematrix.go | 89 +- pkg/signalmeow/protobuf/Groups.pb.go | 271 +++- pkg/signalmeow/protobuf/Groups.proto | 14 +- pkg/signalmeow/protobuf/Provisioning.pb.go | 15 +- pkg/signalmeow/protobuf/Provisioning.proto | 2 +- pkg/signalmeow/protobuf/SignalService.pb.go | 1410 ++++++++++------ pkg/signalmeow/protobuf/SignalService.proto | 166 +- pkg/signalmeow/protobuf/StorageService.pb.go | 28 +- pkg/signalmeow/protobuf/StorageService.proto | 3 +- pkg/signalmeow/protobuf/backuppb/Backup.pb.go | 1418 ++++++++++------- pkg/signalmeow/protobuf/backuppb/Backup.proto | 25 +- pkg/signalmeow/protobuf/update-protos.sh | 15 +- pkg/signalmeow/provisioning.go | 12 +- pkg/signalmeow/receiving.go | 293 ++-- pkg/signalmeow/receiving_decrypt.go | 17 +- pkg/signalmeow/retry.go | 12 +- pkg/signalmeow/sending.go | 279 ++-- 17 files changed, 2475 insertions(+), 1594 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 0f63de2..7bcb214 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -137,7 +137,7 @@ func (s *SignalClient) doSendMessage( } msgID := signalid.MakeMessageID(s.Client.Store.ACI, ts) msg.AddPendingToIgnore(networkid.TransactionID(msgID)) - err := s.sendMessage(ctx, msg.Portal.ID, &signalpb.Content{DataMessage: converted}) + err := s.sendMessage(ctx, msg.Portal.ID, signalmeow.WrapDataMessage(converted)) if err != nil { return nil, bridgev2.WrapErrorInStatus(err).WithSendNotice(true) } @@ -173,10 +173,10 @@ func (s *SignalClient) HandleMatrixEdit(ctx context.Context, msg *bridgev2.Matri } ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) converted.Timestamp = &ts - err = s.sendMessage(ctx, msg.Portal.ID, &signalpb.Content{EditMessage: &signalpb.EditMessage{ + err = s.sendMessage(ctx, msg.Portal.ID, signalmeow.WrapEditMessage(&signalpb.EditMessage{ TargetSentTimestamp: proto.Uint64(targetSentTimestamp), DataMessage: converted, - }}) + })) if err != nil { return bridgev2.WrapErrorInStatus(err).WithSendNotice(true) } @@ -200,19 +200,16 @@ func (s *SignalClient) HandleMatrixReaction(ctx context.Context, msg *bridgev2.M return nil, fmt.Errorf("failed to parse target message ID: %w", err) } ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) - wrappedContent := &signalpb.Content{ - DataMessage: &signalpb.DataMessage{ - Timestamp: proto.Uint64(ts), - RequiredProtocolVersion: proto.Uint32(uint32(signalpb.DataMessage_REACTIONS)), - Reaction: &signalpb.DataMessage_Reaction{ - Emoji: proto.String(msg.PreHandleResp.Emoji), - Remove: proto.Bool(false), - TargetAuthorAciBinary: targetAuthorACI[:], - TargetSentTimestamp: proto.Uint64(targetSentTimestamp), - }, + err = s.sendMessage(ctx, msg.Portal.ID, signalmeow.WrapDataMessage(&signalpb.DataMessage{ + Timestamp: proto.Uint64(ts), + RequiredProtocolVersion: proto.Uint32(uint32(signalpb.DataMessage_REACTIONS)), + Reaction: &signalpb.DataMessage_Reaction{ + Emoji: proto.String(msg.PreHandleResp.Emoji), + Remove: proto.Bool(false), + TargetAuthorAciBinary: targetAuthorACI[:], + TargetSentTimestamp: proto.Uint64(targetSentTimestamp), }, - } - err = s.sendMessage(ctx, msg.Portal.ID, wrappedContent) + })) if err != nil { return nil, err } @@ -225,19 +222,16 @@ func (s *SignalClient) HandleMatrixReactionRemove(ctx context.Context, msg *brid return fmt.Errorf("failed to parse target message ID: %w", err) } ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) - wrappedContent := &signalpb.Content{ - DataMessage: &signalpb.DataMessage{ - Timestamp: proto.Uint64(ts), - RequiredProtocolVersion: proto.Uint32(uint32(signalpb.DataMessage_REACTIONS)), - Reaction: &signalpb.DataMessage_Reaction{ - Emoji: proto.String(msg.TargetReaction.Emoji), - Remove: proto.Bool(true), - TargetAuthorAciBinary: targetAuthorACI[:], - TargetSentTimestamp: proto.Uint64(targetSentTimestamp), - }, + err = s.sendMessage(ctx, msg.Portal.ID, signalmeow.WrapDataMessage(&signalpb.DataMessage{ + Timestamp: proto.Uint64(ts), + RequiredProtocolVersion: proto.Uint32(uint32(signalpb.DataMessage_REACTIONS)), + Reaction: &signalpb.DataMessage_Reaction{ + Emoji: proto.String(msg.TargetReaction.Emoji), + Remove: proto.Bool(true), + TargetAuthorAciBinary: targetAuthorACI[:], + TargetSentTimestamp: proto.Uint64(targetSentTimestamp), }, - } - err = s.sendMessage(ctx, msg.Portal.ID, wrappedContent) + })) if err != nil { return err } @@ -252,15 +246,12 @@ func (s *SignalClient) HandleMatrixMessageRemove(ctx context.Context, msg *bridg return fmt.Errorf("cannot delete other people's messages") } ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) - wrappedContent := &signalpb.Content{ - DataMessage: &signalpb.DataMessage{ - Timestamp: proto.Uint64(ts), - Delete: &signalpb.DataMessage_Delete{ - TargetSentTimestamp: proto.Uint64(targetSentTimestamp), - }, + err = s.sendMessage(ctx, msg.Portal.ID, signalmeow.WrapDataMessage(&signalpb.DataMessage{ + Timestamp: proto.Uint64(ts), + Delete: &signalpb.DataMessage_Delete{ + TargetSentTimestamp: proto.Uint64(targetSentTimestamp), }, - } - err = s.sendMessage(ctx, msg.Portal.ID, wrappedContent) + })) if err != nil { return err } @@ -688,13 +679,11 @@ func (s *SignalClient) HandleMatrixDisappearingTimer(ctx context.Context, msg *b }) } else { ts := getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender) - res := s.Client.SendMessage(ctx, userID, &signalpb.Content{ - DataMessage: &signalpb.DataMessage{ - Timestamp: ptr.Ptr(ts), - Flags: ptr.Ptr(uint32(signalpb.DataMessage_EXPIRATION_TIMER_UPDATE)), - ExpireTimer: ptr.Ptr(uint32(msg.Content.Timer.Seconds())), - }, - }) + res := s.Client.SendMessage(ctx, userID, signalmeow.WrapDataMessage(&signalpb.DataMessage{ + Timestamp: ptr.Ptr(ts), + Flags: ptr.Ptr(uint32(signalpb.DataMessage_EXPIRATION_TIMER_UPDATE)), + ExpireTimer: ptr.Ptr(uint32(msg.Content.Timer.Seconds())), + })) if !res.WasSuccessful { return false, res.Error } @@ -773,8 +762,8 @@ func (s *SignalClient) HandleMatrixDeleteChat(ctx context.Context, msg *bridgev2 recipientID := s.Client.Store.ACIServiceID() // Send DeleteForMe sync message to self - result := s.Client.SendMessage(ctx, recipientID, &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ + result := s.Client.SendMessage(ctx, recipientID, signalmeow.WrapSyncMessage(&signalpb.SyncMessage{ + Content: &signalpb.SyncMessage_DeleteForMe_{ DeleteForMe: &signalpb.SyncMessage_DeleteForMe{ ConversationDeletes: []*signalpb.SyncMessage_DeleteForMe_ConversationDelete{{ Conversation: conversationID, @@ -783,7 +772,7 @@ func (s *SignalClient) HandleMatrixDeleteChat(ctx context.Context, msg *bridgev2 }}, }, }, - }) + })) zerolog.Ctx(ctx).Debug(). Str("portal_id", string(msg.Portal.ID)). @@ -868,11 +857,11 @@ func (s *SignalClient) syncMessageRequestResponse( } else { return fmt.Errorf("invalid portal ID for message request response: %s", portal.ID) } - res := s.Client.SendMessage(ctx, libsignalgo.NewACIServiceID(s.Client.Store.ACI), &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ + res := s.Client.SendMessage(ctx, libsignalgo.NewACIServiceID(s.Client.Store.ACI), signalmeow.WrapSyncMessage(&signalpb.SyncMessage{ + Content: &signalpb.SyncMessage_MessageRequestResponse_{ MessageRequestResponse: accept, }, - }) + })) if !res.WasSuccessful { return res.Error } @@ -905,13 +894,13 @@ func (s *SignalClient) HandleMatrixAcceptMessageRequest(ctx context.Context, msg } } res := s.Client.SendMessage(ctx, userID, &signalpb.Content{ - DataMessage: &signalpb.DataMessage{ + Content: &signalpb.Content_DataMessage{DataMessage: &signalpb.DataMessage{ Flags: proto.Uint32(uint32(signalpb.DataMessage_PROFILE_KEY_UPDATE)), ProfileKey: profileKey.Slice(), Timestamp: proto.Uint64(getTimestampForEvent(msg.InputTransactionID, msg.Event, msg.OrigSender)), RequiredProtocolVersion: proto.Uint32(0), - }, + }}, PniSignatureMessage: pniSig, }) if !res.WasSuccessful { diff --git a/pkg/signalmeow/protobuf/Groups.pb.go b/pkg/signalmeow/protobuf/Groups.pb.go index c7717ff..0c2b81b 100644 --- a/pkg/signalmeow/protobuf/Groups.pb.go +++ b/pkg/signalmeow/protobuf/Groups.pb.go @@ -498,6 +498,7 @@ type AccessControl struct { Attributes AccessControl_AccessRequired `protobuf:"varint,1,opt,name=attributes,proto3,enum=signal.AccessControl_AccessRequired" json:"attributes,omitempty"` Members AccessControl_AccessRequired `protobuf:"varint,2,opt,name=members,proto3,enum=signal.AccessControl_AccessRequired" json:"members,omitempty"` AddFromInviteLink AccessControl_AccessRequired `protobuf:"varint,3,opt,name=addFromInviteLink,proto3,enum=signal.AccessControl_AccessRequired" json:"addFromInviteLink,omitempty"` + MemberLabel AccessControl_AccessRequired `protobuf:"varint,4,opt,name=memberLabel,proto3,enum=signal.AccessControl_AccessRequired" json:"memberLabel,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -553,6 +554,13 @@ func (x *AccessControl) GetAddFromInviteLink() AccessControl_AccessRequired { return AccessControl_UNKNOWN } +func (x *AccessControl) GetMemberLabel() AccessControl_AccessRequired { + if x != nil { + return x.MemberLabel + } + return AccessControl_UNKNOWN +} + type Group struct { state protoimpl.MessageState `protogen:"open.v1"` PublicKey []byte `protobuf:"bytes,1,opt,name=publicKey,proto3" json:"publicKey,omitempty"` @@ -569,7 +577,8 @@ type Group struct { MembersPendingAdminApproval []*MemberPendingAdminApproval `protobuf:"bytes,9,rep,name=membersPendingAdminApproval,proto3" json:"membersPendingAdminApproval,omitempty"` InviteLinkPassword []byte `protobuf:"bytes,10,opt,name=inviteLinkPassword,proto3" json:"inviteLinkPassword,omitempty"` AnnouncementsOnly bool `protobuf:"varint,12,opt,name=announcements_only,json=announcementsOnly,proto3" json:"announcements_only,omitempty"` - MembersBanned []*MemberBanned `protobuf:"bytes,13,rep,name=members_banned,json=membersBanned,proto3" json:"members_banned,omitempty"` // next: 14 + MembersBanned []*MemberBanned `protobuf:"bytes,13,rep,name=members_banned,json=membersBanned,proto3" json:"members_banned,omitempty"` + Terminated bool `protobuf:"varint,14,opt,name=terminated,proto3" json:"terminated,omitempty"` // next: 15 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -695,6 +704,13 @@ func (x *Group) GetMembersBanned() []*MemberBanned { return nil } +func (x *Group) GetTerminated() bool { + if x != nil { + return x.Terminated + } + return false +} + type GroupAttributeBlob struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Content: @@ -1317,6 +1333,8 @@ type GroupChange_Actions struct { DeleteMembersBanned []*GroupChange_Actions_DeleteMemberBannedAction `protobuf:"bytes,23,rep,name=delete_members_banned,json=deleteMembersBanned,proto3" json:"delete_members_banned,omitempty"` // change epoch = 4 PromoteMembersPendingPniAciProfileKey []*GroupChange_Actions_PromoteMemberPendingPniAciProfileKeyAction `protobuf:"bytes,24,rep,name=promote_members_pending_pni_aci_profile_key,json=promoteMembersPendingPniAciProfileKey,proto3" json:"promote_members_pending_pni_aci_profile_key,omitempty"` // change epoch = 5 ModifyMemberLabels []*GroupChange_Actions_ModifyMemberLabelAction `protobuf:"bytes,26,rep,name=modifyMemberLabels,proto3" json:"modifyMemberLabels,omitempty"` // change epoch = 6; + ModifyMemberLabelAccess *GroupChange_Actions_ModifyMemberLabelAccessControlAction `protobuf:"bytes,27,opt,name=modifyMemberLabelAccess,proto3" json:"modifyMemberLabelAccess,omitempty"` // change epoch = 6 + TerminateGroup *GroupChange_Actions_TerminateGroupAction `protobuf:"bytes,28,opt,name=terminate_group,json=terminateGroup,proto3" json:"terminate_group,omitempty"` // change epoch = 7 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1533,6 +1551,20 @@ func (x *GroupChange_Actions) GetModifyMemberLabels() []*GroupChange_Actions_Mod return nil } +func (x *GroupChange_Actions) GetModifyMemberLabelAccess() *GroupChange_Actions_ModifyMemberLabelAccessControlAction { + if x != nil { + return x.ModifyMemberLabelAccess + } + return nil +} + +func (x *GroupChange_Actions) GetTerminateGroup() *GroupChange_Actions_TerminateGroupAction { + if x != nil { + return x.TerminateGroup + } + return nil +} + type GroupChange_Actions_AddMemberAction struct { state protoimpl.MessageState `protogen:"open.v1"` Added *Member `protobuf:"bytes,1,opt,name=added,proto3" json:"added,omitempty"` @@ -2553,6 +2585,50 @@ func (x *GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction) GetAddF return AccessControl_UNKNOWN } +type GroupChange_Actions_ModifyMemberLabelAccessControlAction struct { + state protoimpl.MessageState `protogen:"open.v1"` + MemberLabelAccess AccessControl_AccessRequired `protobuf:"varint,1,opt,name=memberLabelAccess,proto3,enum=signal.AccessControl_AccessRequired" json:"memberLabelAccess,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupChange_Actions_ModifyMemberLabelAccessControlAction) Reset() { + *x = GroupChange_Actions_ModifyMemberLabelAccessControlAction{} + mi := &file_Groups_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupChange_Actions_ModifyMemberLabelAccessControlAction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupChange_Actions_ModifyMemberLabelAccessControlAction) ProtoMessage() {} + +func (x *GroupChange_Actions_ModifyMemberLabelAccessControlAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupChange_Actions_ModifyMemberLabelAccessControlAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_ModifyMemberLabelAccessControlAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 21} +} + +func (x *GroupChange_Actions_ModifyMemberLabelAccessControlAction) GetMemberLabelAccess() AccessControl_AccessRequired { + if x != nil { + return x.MemberLabelAccess + } + return AccessControl_UNKNOWN +} + type GroupChange_Actions_ModifyInviteLinkPasswordAction struct { state protoimpl.MessageState `protogen:"open.v1"` InviteLinkPassword []byte `protobuf:"bytes,1,opt,name=inviteLinkPassword,proto3" json:"inviteLinkPassword,omitempty"` @@ -2562,7 +2638,7 @@ type GroupChange_Actions_ModifyInviteLinkPasswordAction struct { func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) Reset() { *x = GroupChange_Actions_ModifyInviteLinkPasswordAction{} - mi := &file_Groups_proto_msgTypes[38] + mi := &file_Groups_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2574,7 +2650,7 @@ func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) String() string { func (*GroupChange_Actions_ModifyInviteLinkPasswordAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[38] + mi := &file_Groups_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2587,7 +2663,7 @@ func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) ProtoReflect() prot // Deprecated: Use GroupChange_Actions_ModifyInviteLinkPasswordAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyInviteLinkPasswordAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{10, 0, 21} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 22} } func (x *GroupChange_Actions_ModifyInviteLinkPasswordAction) GetInviteLinkPassword() []byte { @@ -2606,7 +2682,7 @@ type GroupChange_Actions_ModifyAnnouncementsOnlyAction struct { func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) Reset() { *x = GroupChange_Actions_ModifyAnnouncementsOnlyAction{} - mi := &file_Groups_proto_msgTypes[39] + mi := &file_Groups_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2618,7 +2694,7 @@ func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) String() string { func (*GroupChange_Actions_ModifyAnnouncementsOnlyAction) ProtoMessage() {} func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[39] + mi := &file_Groups_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2631,7 +2707,7 @@ func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) ProtoReflect() proto // Deprecated: Use GroupChange_Actions_ModifyAnnouncementsOnlyAction.ProtoReflect.Descriptor instead. func (*GroupChange_Actions_ModifyAnnouncementsOnlyAction) Descriptor() ([]byte, []int) { - return file_Groups_proto_rawDescGZIP(), []int{10, 0, 22} + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 23} } func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) GetAnnouncementsOnly() bool { @@ -2641,6 +2717,42 @@ func (x *GroupChange_Actions_ModifyAnnouncementsOnlyAction) GetAnnouncementsOnly return false } +type GroupChange_Actions_TerminateGroupAction struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupChange_Actions_TerminateGroupAction) Reset() { + *x = GroupChange_Actions_TerminateGroupAction{} + mi := &file_Groups_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupChange_Actions_TerminateGroupAction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupChange_Actions_TerminateGroupAction) ProtoMessage() {} + +func (x *GroupChange_Actions_TerminateGroupAction) ProtoReflect() protoreflect.Message { + mi := &file_Groups_proto_msgTypes[41] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupChange_Actions_TerminateGroupAction.ProtoReflect.Descriptor instead. +func (*GroupChange_Actions_TerminateGroupAction) Descriptor() ([]byte, []int) { + return file_Groups_proto_rawDescGZIP(), []int{10, 0, 24} +} + type GroupChanges_GroupChangeState struct { state protoimpl.MessageState `protogen:"open.v1"` GroupChange *GroupChange `protobuf:"bytes,1,opt,name=groupChange,proto3" json:"groupChange,omitempty"` @@ -2651,7 +2763,7 @@ type GroupChanges_GroupChangeState struct { func (x *GroupChanges_GroupChangeState) Reset() { *x = GroupChanges_GroupChangeState{} - mi := &file_Groups_proto_msgTypes[40] + mi := &file_Groups_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2663,7 +2775,7 @@ func (x *GroupChanges_GroupChangeState) String() string { func (*GroupChanges_GroupChangeState) ProtoMessage() {} func (x *GroupChanges_GroupChangeState) ProtoReflect() protoreflect.Message { - mi := &file_Groups_proto_msgTypes[40] + mi := &file_Groups_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2737,20 +2849,21 @@ const file_Groups_proto_rawDesc = "" + "\ttimestamp\x18\x04 \x01(\x04R\ttimestamp\"D\n" + "\fMemberBanned\x12\x16\n" + "\x06userId\x18\x01 \x01(\fR\x06userId\x12\x1c\n" + - "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\"\xc3\x02\n" + + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\"\x8b\x03\n" + "\rAccessControl\x12D\n" + "\n" + "attributes\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\n" + "attributes\x12>\n" + "\amembers\x18\x02 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\amembers\x12R\n" + - "\x11addFromInviteLink\x18\x03 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x11addFromInviteLink\"X\n" + + "\x11addFromInviteLink\x18\x03 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x11addFromInviteLink\x12F\n" + + "\vmemberLabel\x18\x04 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\vmemberLabel\"X\n" + "\x0eAccessRequired\x12\v\n" + "\aUNKNOWN\x10\x00\x12\a\n" + "\x03ANY\x10\x01\x12\n" + "\n" + "\x06MEMBER\x10\x02\x12\x11\n" + "\rADMINISTRATOR\x10\x03\x12\x11\n" + - "\rUNSATISFIABLE\x10\x04\"\x99\x05\n" + + "\rUNSATISFIABLE\x10\x04\"\xb9\x05\n" + "\x05Group\x12\x1c\n" + "\tpublicKey\x18\x01 \x01(\fR\tpublicKey\x12\x14\n" + "\x05title\x18\x02 \x01(\fR\x05title\x12 \n" + @@ -2765,7 +2878,10 @@ const file_Groups_proto_rawDesc = "" + "\x12inviteLinkPassword\x18\n" + " \x01(\fR\x12inviteLinkPassword\x12-\n" + "\x12announcements_only\x18\f \x01(\bR\x11announcementsOnly\x12;\n" + - "\x0emembers_banned\x18\r \x03(\v2\x14.signal.MemberBannedR\rmembersBanned\"\xc3\x01\n" + + "\x0emembers_banned\x18\r \x03(\v2\x14.signal.MemberBannedR\rmembersBanned\x12\x1e\n" + + "\n" + + "terminated\x18\x0e \x01(\bR\n" + + "terminated\"\xc3\x01\n" + "\x12GroupAttributeBlob\x12\x16\n" + "\x05title\x18\x01 \x01(\tH\x00R\x05title\x12\x18\n" + "\x06avatar\x18\x02 \x01(\fH\x00R\x06avatar\x12D\n" + @@ -2789,11 +2905,11 @@ const file_Groups_proto_rawDesc = "" + "\vmemberCount\x18\x04 \x01(\rR\vmemberCount\x12R\n" + "\x11addFromInviteLink\x18\x05 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x11addFromInviteLink\x12\x18\n" + "\aversion\x18\x06 \x01(\rR\aversion\x122\n" + - "\x14pendingAdminApproval\x18\a \x01(\bR\x14pendingAdminApproval\"\xbb'\n" + + "\x14pendingAdminApproval\x18\a \x01(\bR\x14pendingAdminApproval\"\xa6*\n" + "\vGroupChange\x12\x18\n" + "\aactions\x18\x01 \x01(\fR\aactions\x12(\n" + "\x0fserverSignature\x18\x02 \x01(\fR\x0fserverSignature\x12 \n" + - "\vchangeEpoch\x18\x03 \x01(\rR\vchangeEpoch\x1a\xc5&\n" + + "\vchangeEpoch\x18\x03 \x01(\rR\vchangeEpoch\x1a\xb0)\n" + "\aActions\x12\"\n" + "\fsourceUserId\x18\x01 \x01(\fR\fsourceUserId\x12\x19\n" + "\bgroup_id\x18\x19 \x01(\fR\agroupId\x12\x18\n" + @@ -2823,7 +2939,9 @@ const file_Groups_proto_rawDesc = "" + "\x12add_members_banned\x18\x16 \x03(\v21.signal.GroupChange.Actions.AddMemberBannedActionR\x10addMembersBanned\x12h\n" + "\x15delete_members_banned\x18\x17 \x03(\v24.signal.GroupChange.Actions.DeleteMemberBannedActionR\x13deleteMembersBanned\x12\xa2\x01\n" + "+promote_members_pending_pni_aci_profile_key\x18\x18 \x03(\v2F.signal.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyActionR%promoteMembersPendingPniAciProfileKey\x12c\n" + - "\x12modifyMemberLabels\x18\x1a \x03(\v23.signal.GroupChange.Actions.ModifyMemberLabelActionR\x12modifyMemberLabels\x1ag\n" + + "\x12modifyMemberLabels\x18\x1a \x03(\v23.signal.GroupChange.Actions.ModifyMemberLabelActionR\x12modifyMemberLabels\x12z\n" + + "\x17modifyMemberLabelAccess\x18\x1b \x01(\v2@.signal.GroupChange.Actions.ModifyMemberLabelAccessControlActionR\x17modifyMemberLabelAccess\x12Y\n" + + "\x0fterminate_group\x18\x1c \x01(\v20.signal.GroupChange.Actions.TerminateGroupActionR\x0eterminateGroup\x1ag\n" + "\x0fAddMemberAction\x12$\n" + "\x05added\x18\x01 \x01(\v2\x0e.signal.MemberR\x05added\x12.\n" + "\x12joinFromInviteLink\x18\x02 \x01(\bR\x12joinFromInviteLink\x1a:\n" + @@ -2882,11 +3000,14 @@ const file_Groups_proto_rawDesc = "" + " ModifyMembersAccessControlAction\x12J\n" + "\rmembersAccess\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\rmembersAccess\x1a\x8c\x01\n" + "*ModifyAddFromInviteLinkAccessControlAction\x12^\n" + - "\x17addFromInviteLinkAccess\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x17addFromInviteLinkAccess\x1aP\n" + + "\x17addFromInviteLinkAccess\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x17addFromInviteLinkAccess\x1az\n" + + "$ModifyMemberLabelAccessControlAction\x12R\n" + + "\x11memberLabelAccess\x18\x01 \x01(\x0e2$.signal.AccessControl.AccessRequiredR\x11memberLabelAccess\x1aP\n" + "\x1eModifyInviteLinkPasswordAction\x12.\n" + "\x12inviteLinkPassword\x18\x01 \x01(\fR\x12inviteLinkPassword\x1aN\n" + "\x1dModifyAnnouncementsOnlyAction\x12-\n" + - "\x12announcements_only\x18\x01 \x01(\bR\x11announcementsOnly\"/\n" + + "\x12announcements_only\x18\x01 \x01(\bR\x11announcementsOnly\x1a\x16\n" + + "\x14TerminateGroupAction\"/\n" + "\x17ExternalGroupCredential\x12\x14\n" + "\x05token\x18\x01 \x01(\tR\x05token\"}\n" + "\rGroupResponse\x12#\n" + @@ -2918,7 +3039,7 @@ func file_Groups_proto_rawDescGZIP() []byte { } var file_Groups_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_Groups_proto_msgTypes = make([]protoimpl.MessageInfo, 41) +var file_Groups_proto_msgTypes = make([]protoimpl.MessageInfo, 43) var file_Groups_proto_goTypes = []any{ (Member_Role)(0), // 0: signal.Member.Role (AccessControl_AccessRequired)(0), // 1: signal.AccessControl.AccessRequired @@ -2960,9 +3081,11 @@ var file_Groups_proto_goTypes = []any{ (*GroupChange_Actions_ModifyAttributesAccessControlAction)(nil), // 37: signal.GroupChange.Actions.ModifyAttributesAccessControlAction (*GroupChange_Actions_ModifyMembersAccessControlAction)(nil), // 38: signal.GroupChange.Actions.ModifyMembersAccessControlAction (*GroupChange_Actions_ModifyAddFromInviteLinkAccessControlAction)(nil), // 39: signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction - (*GroupChange_Actions_ModifyInviteLinkPasswordAction)(nil), // 40: signal.GroupChange.Actions.ModifyInviteLinkPasswordAction - (*GroupChange_Actions_ModifyAnnouncementsOnlyAction)(nil), // 41: signal.GroupChange.Actions.ModifyAnnouncementsOnlyAction - (*GroupChanges_GroupChangeState)(nil), // 42: signal.GroupChanges.GroupChangeState + (*GroupChange_Actions_ModifyMemberLabelAccessControlAction)(nil), // 40: signal.GroupChange.Actions.ModifyMemberLabelAccessControlAction + (*GroupChange_Actions_ModifyInviteLinkPasswordAction)(nil), // 41: signal.GroupChange.Actions.ModifyInviteLinkPasswordAction + (*GroupChange_Actions_ModifyAnnouncementsOnlyAction)(nil), // 42: signal.GroupChange.Actions.ModifyAnnouncementsOnlyAction + (*GroupChange_Actions_TerminateGroupAction)(nil), // 43: signal.GroupChange.Actions.TerminateGroupAction + (*GroupChanges_GroupChangeState)(nil), // 44: signal.GroupChanges.GroupChangeState } var file_Groups_proto_depIdxs = []int32{ 0, // 0: signal.Member.role:type_name -> signal.Member.Role @@ -2970,55 +3093,59 @@ var file_Groups_proto_depIdxs = []int32{ 1, // 2: signal.AccessControl.attributes:type_name -> signal.AccessControl.AccessRequired 1, // 3: signal.AccessControl.members:type_name -> signal.AccessControl.AccessRequired 1, // 4: signal.AccessControl.addFromInviteLink:type_name -> signal.AccessControl.AccessRequired - 7, // 5: signal.Group.accessControl:type_name -> signal.AccessControl - 3, // 6: signal.Group.members:type_name -> signal.Member - 4, // 7: signal.Group.membersPendingProfileKey:type_name -> signal.MemberPendingProfileKey - 5, // 8: signal.Group.membersPendingAdminApproval:type_name -> signal.MemberPendingAdminApproval - 6, // 9: signal.Group.members_banned:type_name -> signal.MemberBanned - 17, // 10: signal.GroupInviteLink.contentsV1:type_name -> signal.GroupInviteLink.GroupInviteLinkContentsV1 - 1, // 11: signal.GroupJoinInfo.addFromInviteLink:type_name -> signal.AccessControl.AccessRequired - 8, // 12: signal.GroupResponse.group:type_name -> signal.Group - 42, // 13: signal.GroupChanges.groupChanges:type_name -> signal.GroupChanges.GroupChangeState - 12, // 14: signal.GroupChangeResponse.group_change:type_name -> signal.GroupChange - 19, // 15: signal.GroupChange.Actions.addMembers:type_name -> signal.GroupChange.Actions.AddMemberAction - 20, // 16: signal.GroupChange.Actions.deleteMembers:type_name -> signal.GroupChange.Actions.DeleteMemberAction - 21, // 17: signal.GroupChange.Actions.modifyMemberRoles:type_name -> signal.GroupChange.Actions.ModifyMemberRoleAction - 23, // 18: signal.GroupChange.Actions.modifyMemberProfileKeys:type_name -> signal.GroupChange.Actions.ModifyMemberProfileKeyAction - 24, // 19: signal.GroupChange.Actions.addMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.AddMemberPendingProfileKeyAction - 25, // 20: signal.GroupChange.Actions.deleteMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.DeleteMemberPendingProfileKeyAction - 26, // 21: signal.GroupChange.Actions.promoteMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.PromoteMemberPendingProfileKeyAction - 33, // 22: signal.GroupChange.Actions.modifyTitle:type_name -> signal.GroupChange.Actions.ModifyTitleAction - 35, // 23: signal.GroupChange.Actions.modifyAvatar:type_name -> signal.GroupChange.Actions.ModifyAvatarAction - 36, // 24: signal.GroupChange.Actions.modifyDisappearingMessageTimer:type_name -> signal.GroupChange.Actions.ModifyDisappearingMessageTimerAction - 37, // 25: signal.GroupChange.Actions.modifyAttributesAccess:type_name -> signal.GroupChange.Actions.ModifyAttributesAccessControlAction - 38, // 26: signal.GroupChange.Actions.modifyMemberAccess:type_name -> signal.GroupChange.Actions.ModifyMembersAccessControlAction - 39, // 27: signal.GroupChange.Actions.modifyAddFromInviteLinkAccess:type_name -> signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction - 28, // 28: signal.GroupChange.Actions.addMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.AddMemberPendingAdminApprovalAction - 29, // 29: signal.GroupChange.Actions.deleteMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction - 30, // 30: signal.GroupChange.Actions.promoteMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction - 40, // 31: signal.GroupChange.Actions.modifyInviteLinkPassword:type_name -> signal.GroupChange.Actions.ModifyInviteLinkPasswordAction - 34, // 32: signal.GroupChange.Actions.modifyDescription:type_name -> signal.GroupChange.Actions.ModifyDescriptionAction - 41, // 33: signal.GroupChange.Actions.modify_announcements_only:type_name -> signal.GroupChange.Actions.ModifyAnnouncementsOnlyAction - 31, // 34: signal.GroupChange.Actions.add_members_banned:type_name -> signal.GroupChange.Actions.AddMemberBannedAction - 32, // 35: signal.GroupChange.Actions.delete_members_banned:type_name -> signal.GroupChange.Actions.DeleteMemberBannedAction - 27, // 36: signal.GroupChange.Actions.promote_members_pending_pni_aci_profile_key:type_name -> signal.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction - 22, // 37: signal.GroupChange.Actions.modifyMemberLabels:type_name -> signal.GroupChange.Actions.ModifyMemberLabelAction - 3, // 38: signal.GroupChange.Actions.AddMemberAction.added:type_name -> signal.Member - 0, // 39: signal.GroupChange.Actions.ModifyMemberRoleAction.role:type_name -> signal.Member.Role - 4, // 40: signal.GroupChange.Actions.AddMemberPendingProfileKeyAction.added:type_name -> signal.MemberPendingProfileKey - 5, // 41: signal.GroupChange.Actions.AddMemberPendingAdminApprovalAction.added:type_name -> signal.MemberPendingAdminApproval - 0, // 42: signal.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.role:type_name -> signal.Member.Role - 6, // 43: signal.GroupChange.Actions.AddMemberBannedAction.added:type_name -> signal.MemberBanned - 1, // 44: signal.GroupChange.Actions.ModifyAttributesAccessControlAction.attributesAccess:type_name -> signal.AccessControl.AccessRequired - 1, // 45: signal.GroupChange.Actions.ModifyMembersAccessControlAction.membersAccess:type_name -> signal.AccessControl.AccessRequired - 1, // 46: signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.addFromInviteLinkAccess:type_name -> signal.AccessControl.AccessRequired - 12, // 47: signal.GroupChanges.GroupChangeState.groupChange:type_name -> signal.GroupChange - 8, // 48: signal.GroupChanges.GroupChangeState.groupState:type_name -> signal.Group - 49, // [49:49] is the sub-list for method output_type - 49, // [49:49] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 1, // 5: signal.AccessControl.memberLabel:type_name -> signal.AccessControl.AccessRequired + 7, // 6: signal.Group.accessControl:type_name -> signal.AccessControl + 3, // 7: signal.Group.members:type_name -> signal.Member + 4, // 8: signal.Group.membersPendingProfileKey:type_name -> signal.MemberPendingProfileKey + 5, // 9: signal.Group.membersPendingAdminApproval:type_name -> signal.MemberPendingAdminApproval + 6, // 10: signal.Group.members_banned:type_name -> signal.MemberBanned + 17, // 11: signal.GroupInviteLink.contentsV1:type_name -> signal.GroupInviteLink.GroupInviteLinkContentsV1 + 1, // 12: signal.GroupJoinInfo.addFromInviteLink:type_name -> signal.AccessControl.AccessRequired + 8, // 13: signal.GroupResponse.group:type_name -> signal.Group + 44, // 14: signal.GroupChanges.groupChanges:type_name -> signal.GroupChanges.GroupChangeState + 12, // 15: signal.GroupChangeResponse.group_change:type_name -> signal.GroupChange + 19, // 16: signal.GroupChange.Actions.addMembers:type_name -> signal.GroupChange.Actions.AddMemberAction + 20, // 17: signal.GroupChange.Actions.deleteMembers:type_name -> signal.GroupChange.Actions.DeleteMemberAction + 21, // 18: signal.GroupChange.Actions.modifyMemberRoles:type_name -> signal.GroupChange.Actions.ModifyMemberRoleAction + 23, // 19: signal.GroupChange.Actions.modifyMemberProfileKeys:type_name -> signal.GroupChange.Actions.ModifyMemberProfileKeyAction + 24, // 20: signal.GroupChange.Actions.addMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.AddMemberPendingProfileKeyAction + 25, // 21: signal.GroupChange.Actions.deleteMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.DeleteMemberPendingProfileKeyAction + 26, // 22: signal.GroupChange.Actions.promoteMembersPendingProfileKey:type_name -> signal.GroupChange.Actions.PromoteMemberPendingProfileKeyAction + 33, // 23: signal.GroupChange.Actions.modifyTitle:type_name -> signal.GroupChange.Actions.ModifyTitleAction + 35, // 24: signal.GroupChange.Actions.modifyAvatar:type_name -> signal.GroupChange.Actions.ModifyAvatarAction + 36, // 25: signal.GroupChange.Actions.modifyDisappearingMessageTimer:type_name -> signal.GroupChange.Actions.ModifyDisappearingMessageTimerAction + 37, // 26: signal.GroupChange.Actions.modifyAttributesAccess:type_name -> signal.GroupChange.Actions.ModifyAttributesAccessControlAction + 38, // 27: signal.GroupChange.Actions.modifyMemberAccess:type_name -> signal.GroupChange.Actions.ModifyMembersAccessControlAction + 39, // 28: signal.GroupChange.Actions.modifyAddFromInviteLinkAccess:type_name -> signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction + 28, // 29: signal.GroupChange.Actions.addMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.AddMemberPendingAdminApprovalAction + 29, // 30: signal.GroupChange.Actions.deleteMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.DeleteMemberPendingAdminApprovalAction + 30, // 31: signal.GroupChange.Actions.promoteMembersPendingAdminApproval:type_name -> signal.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction + 41, // 32: signal.GroupChange.Actions.modifyInviteLinkPassword:type_name -> signal.GroupChange.Actions.ModifyInviteLinkPasswordAction + 34, // 33: signal.GroupChange.Actions.modifyDescription:type_name -> signal.GroupChange.Actions.ModifyDescriptionAction + 42, // 34: signal.GroupChange.Actions.modify_announcements_only:type_name -> signal.GroupChange.Actions.ModifyAnnouncementsOnlyAction + 31, // 35: signal.GroupChange.Actions.add_members_banned:type_name -> signal.GroupChange.Actions.AddMemberBannedAction + 32, // 36: signal.GroupChange.Actions.delete_members_banned:type_name -> signal.GroupChange.Actions.DeleteMemberBannedAction + 27, // 37: signal.GroupChange.Actions.promote_members_pending_pni_aci_profile_key:type_name -> signal.GroupChange.Actions.PromoteMemberPendingPniAciProfileKeyAction + 22, // 38: signal.GroupChange.Actions.modifyMemberLabels:type_name -> signal.GroupChange.Actions.ModifyMemberLabelAction + 40, // 39: signal.GroupChange.Actions.modifyMemberLabelAccess:type_name -> signal.GroupChange.Actions.ModifyMemberLabelAccessControlAction + 43, // 40: signal.GroupChange.Actions.terminate_group:type_name -> signal.GroupChange.Actions.TerminateGroupAction + 3, // 41: signal.GroupChange.Actions.AddMemberAction.added:type_name -> signal.Member + 0, // 42: signal.GroupChange.Actions.ModifyMemberRoleAction.role:type_name -> signal.Member.Role + 4, // 43: signal.GroupChange.Actions.AddMemberPendingProfileKeyAction.added:type_name -> signal.MemberPendingProfileKey + 5, // 44: signal.GroupChange.Actions.AddMemberPendingAdminApprovalAction.added:type_name -> signal.MemberPendingAdminApproval + 0, // 45: signal.GroupChange.Actions.PromoteMemberPendingAdminApprovalAction.role:type_name -> signal.Member.Role + 6, // 46: signal.GroupChange.Actions.AddMemberBannedAction.added:type_name -> signal.MemberBanned + 1, // 47: signal.GroupChange.Actions.ModifyAttributesAccessControlAction.attributesAccess:type_name -> signal.AccessControl.AccessRequired + 1, // 48: signal.GroupChange.Actions.ModifyMembersAccessControlAction.membersAccess:type_name -> signal.AccessControl.AccessRequired + 1, // 49: signal.GroupChange.Actions.ModifyAddFromInviteLinkAccessControlAction.addFromInviteLinkAccess:type_name -> signal.AccessControl.AccessRequired + 1, // 50: signal.GroupChange.Actions.ModifyMemberLabelAccessControlAction.memberLabelAccess:type_name -> signal.AccessControl.AccessRequired + 12, // 51: signal.GroupChanges.GroupChangeState.groupChange:type_name -> signal.GroupChange + 8, // 52: signal.GroupChanges.GroupChangeState.groupState:type_name -> signal.Group + 53, // [53:53] is the sub-list for method output_type + 53, // [53:53] is the sub-list for method input_type + 53, // [53:53] is the sub-list for extension type_name + 53, // [53:53] is the sub-list for extension extendee + 0, // [0:53] is the sub-list for field type_name } func init() { file_Groups_proto_init() } @@ -3041,7 +3168,7 @@ func file_Groups_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_Groups_proto_rawDesc), len(file_Groups_proto_rawDesc)), NumEnums: 2, - NumMessages: 41, + NumMessages: 43, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/signalmeow/protobuf/Groups.proto b/pkg/signalmeow/protobuf/Groups.proto index 448846a..9843d1c 100644 --- a/pkg/signalmeow/protobuf/Groups.proto +++ b/pkg/signalmeow/protobuf/Groups.proto @@ -69,6 +69,7 @@ message AccessControl { AccessRequired attributes = 1; AccessRequired members = 2; AccessRequired addFromInviteLink = 3; + AccessRequired memberLabel = 4; } message Group { @@ -87,7 +88,8 @@ message Group { bytes inviteLinkPassword = 10; bool announcements_only = 12; repeated MemberBanned members_banned = 13; - // next: 14 + bool terminated = 14; + // next: 15 } message GroupAttributeBlob { @@ -225,6 +227,10 @@ message GroupChange { AccessControl.AccessRequired addFromInviteLinkAccess = 1; } + message ModifyMemberLabelAccessControlAction { + AccessControl.AccessRequired memberLabelAccess = 1; + } + message ModifyInviteLinkPasswordAction { bytes inviteLinkPassword = 1; } @@ -233,6 +239,8 @@ message GroupChange { bool announcements_only = 1; } + message TerminateGroupAction {} + bytes sourceUserId = 1; // clients should not provide this value; the server will provide it in the response buffer to ensure the signature is binding to a particular group // if clients set it during a request the server will respond with 400. @@ -262,7 +270,9 @@ message GroupChange { repeated DeleteMemberBannedAction delete_members_banned = 23; // change epoch = 4 repeated PromoteMemberPendingPniAciProfileKeyAction promote_members_pending_pni_aci_profile_key = 24; // change epoch = 5 repeated ModifyMemberLabelAction modifyMemberLabels = 26; // change epoch = 6; - // next: 27 + ModifyMemberLabelAccessControlAction modifyMemberLabelAccess = 27; // change epoch = 6 + TerminateGroupAction terminate_group = 28; // change epoch = 7 + // next: 29 } bytes actions = 1; diff --git a/pkg/signalmeow/protobuf/Provisioning.pb.go b/pkg/signalmeow/protobuf/Provisioning.pb.go index 0231512..c925fe6 100644 --- a/pkg/signalmeow/protobuf/Provisioning.pb.go +++ b/pkg/signalmeow/protobuf/Provisioning.pb.go @@ -199,7 +199,6 @@ type ProvisionMessage struct { ProfileKey []byte `protobuf:"bytes,6,opt,name=profileKey" json:"profileKey,omitempty"` ReadReceipts *bool `protobuf:"varint,7,opt,name=readReceipts" json:"readReceipts,omitempty"` ProvisioningVersion *uint32 `protobuf:"varint,9,opt,name=provisioningVersion" json:"provisioningVersion,omitempty"` - MasterKey []byte `protobuf:"bytes,13,opt,name=masterKey" json:"masterKey,omitempty"` // Deprecated, but required by linked devices EphemeralBackupKey []byte `protobuf:"bytes,14,opt,name=ephemeralBackupKey" json:"ephemeralBackupKey,omitempty"` // 32 bytes AccountEntropyPool *string `protobuf:"bytes,15,opt,name=accountEntropyPool" json:"accountEntropyPool,omitempty"` MediaRootBackupKey []byte `protobuf:"bytes,16,opt,name=mediaRootBackupKey" json:"mediaRootBackupKey,omitempty"` // 32-bytes @@ -323,13 +322,6 @@ func (x *ProvisionMessage) GetProvisioningVersion() uint32 { return 0 } -func (x *ProvisionMessage) GetMasterKey() []byte { - if x != nil { - return x.MasterKey - } - return nil -} - func (x *ProvisionMessage) GetEphemeralBackupKey() []byte { if x != nil { return x.EphemeralBackupKey @@ -374,7 +366,7 @@ const file_Provisioning_proto_rawDesc = "" + "\aaddress\x18\x01 \x01(\tR\aaddress\"E\n" + "\x11ProvisionEnvelope\x12\x1c\n" + "\tpublicKey\x18\x01 \x01(\fR\tpublicKey\x12\x12\n" + - "\x04body\x18\x02 \x01(\fR\x04body\"\xcc\x05\n" + + "\x04body\x18\x02 \x01(\fR\x04body\"\xb4\x05\n" + "\x10ProvisionMessage\x122\n" + "\x14aciIdentityKeyPublic\x18\x01 \x01(\fR\x14aciIdentityKeyPublic\x124\n" + "\x15aciIdentityKeyPrivate\x18\x02 \x01(\fR\x15aciIdentityKeyPrivate\x122\n" + @@ -390,13 +382,12 @@ const file_Provisioning_proto_rawDesc = "" + "profileKey\x18\x06 \x01(\fR\n" + "profileKey\x12\"\n" + "\freadReceipts\x18\a \x01(\bR\freadReceipts\x120\n" + - "\x13provisioningVersion\x18\t \x01(\rR\x13provisioningVersion\x12\x1c\n" + - "\tmasterKey\x18\r \x01(\fR\tmasterKey\x12.\n" + + "\x13provisioningVersion\x18\t \x01(\rR\x13provisioningVersion\x12.\n" + "\x12ephemeralBackupKey\x18\x0e \x01(\fR\x12ephemeralBackupKey\x12.\n" + "\x12accountEntropyPool\x18\x0f \x01(\tR\x12accountEntropyPool\x12.\n" + "\x12mediaRootBackupKey\x18\x10 \x01(\fR\x12mediaRootBackupKey\x12\x1c\n" + "\taciBinary\x18\x11 \x01(\fR\taciBinary\x12\x1c\n" + - "\tpniBinary\x18\x12 \x01(\fR\tpniBinary*G\n" + + "\tpniBinary\x18\x12 \x01(\fR\tpniBinaryJ\x04\b\r\x10\x0e*G\n" + "\x13ProvisioningVersion\x12\v\n" + "\aINITIAL\x10\x00\x12\x12\n" + "\x0eTABLET_SUPPORT\x10\x01\x12\v\n" + diff --git a/pkg/signalmeow/protobuf/Provisioning.proto b/pkg/signalmeow/protobuf/Provisioning.proto index 2fde938..b5eeaf6 100644 --- a/pkg/signalmeow/protobuf/Provisioning.proto +++ b/pkg/signalmeow/protobuf/Provisioning.proto @@ -38,7 +38,7 @@ message ProvisionMessage { optional bytes profileKey = 6; optional bool readReceipts = 7; optional uint32 provisioningVersion = 9; - optional bytes masterKey = 13; // Deprecated, but required by linked devices + reserved /*masterKey*/ 13; // Deprecated in favor of accountEntropyPool optional bytes ephemeralBackupKey = 14; // 32 bytes optional string accountEntropyPool = 15; optional bytes mediaRootBackupKey = 16; // 32-bytes diff --git a/pkg/signalmeow/protobuf/SignalService.pb.go b/pkg/signalmeow/protobuf/SignalService.pb.go index 5866dbb..32842bf 100644 --- a/pkg/signalmeow/protobuf/SignalService.pb.go +++ b/pkg/signalmeow/protobuf/SignalService.pb.go @@ -28,33 +28,71 @@ const ( type Envelope_Type int32 const ( - Envelope_UNKNOWN Envelope_Type = 0 - Envelope_CIPHERTEXT Envelope_Type = 1 // content => (version byte | SignalMessage{Content}) - Envelope_PREKEY_BUNDLE Envelope_Type = 3 // content => (version byte | PreKeySignalMessage{Content}) - Envelope_SERVER_DELIVERY_RECEIPT Envelope_Type = 5 // legacyMessage => [] AND content => [] - Envelope_UNIDENTIFIED_SENDER Envelope_Type = 6 // legacyMessage => [] AND content => ((version byte | UnidentifiedSenderMessage) OR (version byte | Multi-Recipient Sealed Sender Format)) - Envelope_SENDERKEY_MESSAGE Envelope_Type = 7 // legacyMessage => [] AND content => (version byte | SenderKeyMessage) - Envelope_PLAINTEXT_CONTENT Envelope_Type = 8 // legacyMessage => [] AND content => (marker byte | Content) + Envelope_UNKNOWN Envelope_Type = 0 + // * + // A double-ratchet message represents a "normal," "unsealed-sender" message + // encrypted using the Double Ratchet within an established Signal session. + // Double-ratchet messages include sender information in the plaintext + // portion of the `Envelope`. + Envelope_DOUBLE_RATCHET Envelope_Type = 1 // content => (version byte | SignalMessage{Content}) + // * + // A prekey message begins a new Signal session. The `content` of a prekey + // message is a superset of a double-ratchet message's `content` and + // contains the sender's identity public key and information identifying the + // pre-keys used in the message's ciphertext. Like double-ratchet messages, + // prekey messages contain sender information in the plaintext portion of + // the `Envelope`. + Envelope_PREKEY_MESSAGE Envelope_Type = 3 // content => (version byte | PreKeySignalMessage{Content}) + // * + // Server delivery receipts are generated by the server when + // "unsealed-sender" messages are delivered to and acknowledged by the + // destination device. Server delivery receipts identify the sender in the + // plaintext portion of the `Envelope` and have no `content`. Note that + // receipts for sealed-sender messages are generated by clients as + // `UNIDENTIFIED_SENDER` messages. + // + // Note that, with server delivery receipts, the "client timestamp" on + // the envelope refers to the timestamp of the original message (i.e. the + // message the server just delivered) and not to the time of delivery. The + // "server timestamp" refers to the time of delivery. + Envelope_SERVER_DELIVERY_RECEIPT Envelope_Type = 5 // content => [] + // * + // An unidentified sender message represents a message with no sender + // information in the plaintext portion of the `Envelope`. Unidentified + // sender messages always contain an additional `subtype` in their + // `content`. They may or may not be part of an existing Signal session + // (i.e. an unidentified sender message may have a "prekey message" + // subtype or may indicate an encryption error). + Envelope_UNIDENTIFIED_SENDER Envelope_Type = 6 // content => ((version byte | UnidentifiedSenderMessage) OR (version byte | Multi-Recipient Sealed Sender Format)) + // * + // A plaintext message is used solely to convey encryption error receipts + // and never contains encrypted message content. Encryption error receipts + // must be delivered in plaintext because, encryption/decryption of a prior + // message failed and there is no reason to believe that + // encryption/decryption of subsequent messages with the same key material + // would succeed. + // + // Critically, plaintext messages never have "real" message content + // generated by users. Plaintext messages include sender information. + Envelope_PLAINTEXT_CONTENT Envelope_Type = 8 // content => (marker byte | Content) ) // Enum value maps for Envelope_Type. var ( Envelope_Type_name = map[int32]string{ 0: "UNKNOWN", - 1: "CIPHERTEXT", - 3: "PREKEY_BUNDLE", + 1: "DOUBLE_RATCHET", + 3: "PREKEY_MESSAGE", 5: "SERVER_DELIVERY_RECEIPT", 6: "UNIDENTIFIED_SENDER", - 7: "SENDERKEY_MESSAGE", 8: "PLAINTEXT_CONTENT", } Envelope_Type_value = map[string]int32{ "UNKNOWN": 0, - "CIPHERTEXT": 1, - "PREKEY_BUNDLE": 3, + "DOUBLE_RATCHET": 1, + "PREKEY_MESSAGE": 3, "SERVER_DELIVERY_RECEIPT": 5, "UNIDENTIFIED_SENDER": 6, - "SENDERKEY_MESSAGE": 7, "PLAINTEXT_CONTENT": 8, } ) @@ -1753,9 +1791,9 @@ type Envelope struct { state protoimpl.MessageState `protogen:"open.v1"` Type *Envelope_Type `protobuf:"varint,1,opt,name=type,enum=signalservice.Envelope_Type" json:"type,omitempty"` SourceServiceId *string `protobuf:"bytes,11,opt,name=sourceServiceId" json:"sourceServiceId,omitempty"` - SourceDevice *uint32 `protobuf:"varint,7,opt,name=sourceDevice" json:"sourceDevice,omitempty"` + SourceDeviceId *uint32 `protobuf:"varint,7,opt,name=sourceDeviceId" json:"sourceDeviceId,omitempty"` DestinationServiceId *string `protobuf:"bytes,13,opt,name=destinationServiceId" json:"destinationServiceId,omitempty"` - Timestamp *uint64 `protobuf:"varint,5,opt,name=timestamp" json:"timestamp,omitempty"` + ClientTimestamp *uint64 `protobuf:"varint,5,opt,name=clientTimestamp" json:"clientTimestamp,omitempty"` Content []byte `protobuf:"bytes,8,opt,name=content" json:"content,omitempty"` // Contains an encrypted Content ServerGuid *string `protobuf:"bytes,9,opt,name=serverGuid" json:"serverGuid,omitempty"` ServerTimestamp *uint64 `protobuf:"varint,10,opt,name=serverTimestamp" json:"serverTimestamp,omitempty"` @@ -1821,9 +1859,9 @@ func (x *Envelope) GetSourceServiceId() string { return "" } -func (x *Envelope) GetSourceDevice() uint32 { - if x != nil && x.SourceDevice != nil { - return *x.SourceDevice +func (x *Envelope) GetSourceDeviceId() uint32 { + if x != nil && x.SourceDeviceId != nil { + return *x.SourceDeviceId } return 0 } @@ -1835,9 +1873,9 @@ func (x *Envelope) GetDestinationServiceId() string { return "" } -func (x *Envelope) GetTimestamp() uint64 { - if x != nil && x.Timestamp != nil { - return *x.Timestamp +func (x *Envelope) GetClientTimestamp() uint64 { + if x != nil && x.ClientTimestamp != nil { + return *x.ClientTimestamp } return 0 } @@ -1927,18 +1965,21 @@ func (x *Envelope) GetUpdatedPniBinary() []byte { } type Content struct { - state protoimpl.MessageState `protogen:"open.v1"` - DataMessage *DataMessage `protobuf:"bytes,1,opt,name=dataMessage" json:"dataMessage,omitempty"` - SyncMessage *SyncMessage `protobuf:"bytes,2,opt,name=syncMessage" json:"syncMessage,omitempty"` - CallMessage *CallMessage `protobuf:"bytes,3,opt,name=callMessage" json:"callMessage,omitempty"` - NullMessage *NullMessage `protobuf:"bytes,4,opt,name=nullMessage" json:"nullMessage,omitempty"` - ReceiptMessage *ReceiptMessage `protobuf:"bytes,5,opt,name=receiptMessage" json:"receiptMessage,omitempty"` - TypingMessage *TypingMessage `protobuf:"bytes,6,opt,name=typingMessage" json:"typingMessage,omitempty"` - SenderKeyDistributionMessage []byte `protobuf:"bytes,7,opt,name=senderKeyDistributionMessage" json:"senderKeyDistributionMessage,omitempty"` - DecryptionErrorMessage []byte `protobuf:"bytes,8,opt,name=decryptionErrorMessage" json:"decryptionErrorMessage,omitempty"` - StoryMessage *StoryMessage `protobuf:"bytes,9,opt,name=storyMessage" json:"storyMessage,omitempty"` - PniSignatureMessage *PniSignatureMessage `protobuf:"bytes,10,opt,name=pniSignatureMessage" json:"pniSignatureMessage,omitempty"` - EditMessage *EditMessage `protobuf:"bytes,11,opt,name=editMessage" json:"editMessage,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Content: + // + // *Content_DataMessage + // *Content_SyncMessage + // *Content_CallMessage + // *Content_NullMessage + // *Content_ReceiptMessage + // *Content_TypingMessage + // *Content_DecryptionErrorMessage + // *Content_StoryMessage + // *Content_EditMessage + Content isContent_Content `protobuf_oneof:"content"` + SenderKeyDistributionMessage []byte `protobuf:"bytes,7,opt,name=senderKeyDistributionMessage" json:"senderKeyDistributionMessage,omitempty"` + PniSignatureMessage *PniSignatureMessage `protobuf:"bytes,10,opt,name=pniSignatureMessage" json:"pniSignatureMessage,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1973,44 +2014,90 @@ func (*Content) Descriptor() ([]byte, []int) { return file_SignalService_proto_rawDescGZIP(), []int{1} } +func (x *Content) GetContent() isContent_Content { + if x != nil { + return x.Content + } + return nil +} + func (x *Content) GetDataMessage() *DataMessage { if x != nil { - return x.DataMessage + if x, ok := x.Content.(*Content_DataMessage); ok { + return x.DataMessage + } } return nil } func (x *Content) GetSyncMessage() *SyncMessage { if x != nil { - return x.SyncMessage + if x, ok := x.Content.(*Content_SyncMessage); ok { + return x.SyncMessage + } } return nil } func (x *Content) GetCallMessage() *CallMessage { if x != nil { - return x.CallMessage + if x, ok := x.Content.(*Content_CallMessage); ok { + return x.CallMessage + } } return nil } func (x *Content) GetNullMessage() *NullMessage { if x != nil { - return x.NullMessage + if x, ok := x.Content.(*Content_NullMessage); ok { + return x.NullMessage + } } return nil } func (x *Content) GetReceiptMessage() *ReceiptMessage { if x != nil { - return x.ReceiptMessage + if x, ok := x.Content.(*Content_ReceiptMessage); ok { + return x.ReceiptMessage + } } return nil } func (x *Content) GetTypingMessage() *TypingMessage { if x != nil { - return x.TypingMessage + if x, ok := x.Content.(*Content_TypingMessage); ok { + return x.TypingMessage + } + } + return nil +} + +func (x *Content) GetDecryptionErrorMessage() []byte { + if x != nil { + if x, ok := x.Content.(*Content_DecryptionErrorMessage); ok { + return x.DecryptionErrorMessage + } + } + return nil +} + +func (x *Content) GetStoryMessage() *StoryMessage { + if x != nil { + if x, ok := x.Content.(*Content_StoryMessage); ok { + return x.StoryMessage + } + } + return nil +} + +func (x *Content) GetEditMessage() *EditMessage { + if x != nil { + if x, ok := x.Content.(*Content_EditMessage); ok { + return x.EditMessage + } } return nil } @@ -2022,20 +2109,6 @@ func (x *Content) GetSenderKeyDistributionMessage() []byte { return nil } -func (x *Content) GetDecryptionErrorMessage() []byte { - if x != nil { - return x.DecryptionErrorMessage - } - return nil -} - -func (x *Content) GetStoryMessage() *StoryMessage { - if x != nil { - return x.StoryMessage - } - return nil -} - func (x *Content) GetPniSignatureMessage() *PniSignatureMessage { if x != nil { return x.PniSignatureMessage @@ -2043,13 +2116,64 @@ func (x *Content) GetPniSignatureMessage() *PniSignatureMessage { return nil } -func (x *Content) GetEditMessage() *EditMessage { - if x != nil { - return x.EditMessage - } - return nil +type isContent_Content interface { + isContent_Content() } +type Content_DataMessage struct { + DataMessage *DataMessage `protobuf:"bytes,1,opt,name=dataMessage,oneof"` +} + +type Content_SyncMessage struct { + SyncMessage *SyncMessage `protobuf:"bytes,2,opt,name=syncMessage,oneof"` +} + +type Content_CallMessage struct { + CallMessage *CallMessage `protobuf:"bytes,3,opt,name=callMessage,oneof"` +} + +type Content_NullMessage struct { + NullMessage *NullMessage `protobuf:"bytes,4,opt,name=nullMessage,oneof"` +} + +type Content_ReceiptMessage struct { + ReceiptMessage *ReceiptMessage `protobuf:"bytes,5,opt,name=receiptMessage,oneof"` +} + +type Content_TypingMessage struct { + TypingMessage *TypingMessage `protobuf:"bytes,6,opt,name=typingMessage,oneof"` +} + +type Content_DecryptionErrorMessage struct { + DecryptionErrorMessage []byte `protobuf:"bytes,8,opt,name=decryptionErrorMessage,oneof"` +} + +type Content_StoryMessage struct { + StoryMessage *StoryMessage `protobuf:"bytes,9,opt,name=storyMessage,oneof"` +} + +type Content_EditMessage struct { + EditMessage *EditMessage `protobuf:"bytes,11,opt,name=editMessage,oneof"` +} + +func (*Content_DataMessage) isContent_Content() {} + +func (*Content_SyncMessage) isContent_Content() {} + +func (*Content_CallMessage) isContent_Content() {} + +func (*Content_NullMessage) isContent_Content() {} + +func (*Content_ReceiptMessage) isContent_Content() {} + +func (*Content_TypingMessage) isContent_Content() {} + +func (*Content_DecryptionErrorMessage) isContent_Content() {} + +func (*Content_StoryMessage) isContent_Content() {} + +func (*Content_EditMessage) isContent_Content() {} + type CallMessage struct { state protoimpl.MessageState `protogen:"open.v1"` Offer *CallMessage_Offer `protobuf:"bytes,1,opt,name=offer" json:"offer,omitempty"` @@ -2169,7 +2293,8 @@ type DataMessage struct { PollTerminate *DataMessage_PollTerminate `protobuf:"bytes,25,opt,name=pollTerminate" json:"pollTerminate,omitempty"` PollVote *DataMessage_PollVote `protobuf:"bytes,26,opt,name=pollVote" json:"pollVote,omitempty"` PinMessage *DataMessage_PinMessage `protobuf:"bytes,27,opt,name=pinMessage" json:"pinMessage,omitempty"` - UnpinMessage *DataMessage_UnpinMessage `protobuf:"bytes,28,opt,name=unpinMessage" json:"unpinMessage,omitempty"` // NEXT ID: 29 + UnpinMessage *DataMessage_UnpinMessage `protobuf:"bytes,28,opt,name=unpinMessage" json:"unpinMessage,omitempty"` + AdminDelete *DataMessage_AdminDelete `protobuf:"bytes,29,opt,name=adminDelete" json:"adminDelete,omitempty"` // NEXT ID: 30 unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2386,6 +2511,13 @@ func (x *DataMessage) GetUnpinMessage() *DataMessage_UnpinMessage { return nil } +func (x *DataMessage) GetAdminDelete() *DataMessage_AdminDelete { + if x != nil { + return x.AdminDelete + } + return nil +} + type NullMessage struct { state protoimpl.MessageState `protogen:"open.v1"` Padding []byte `protobuf:"bytes,1,opt,name=padding" json:"padding,omitempty"` @@ -2931,32 +3063,38 @@ func (x *Verified) GetDestinationAciBinary() []byte { } type SyncMessage struct { - state protoimpl.MessageState `protogen:"open.v1"` - Sent *SyncMessage_Sent `protobuf:"bytes,1,opt,name=sent" json:"sent,omitempty"` - Contacts *SyncMessage_Contacts `protobuf:"bytes,2,opt,name=contacts" json:"contacts,omitempty"` - Request *SyncMessage_Request `protobuf:"bytes,4,opt,name=request" json:"request,omitempty"` - Read []*SyncMessage_Read `protobuf:"bytes,5,rep,name=read" json:"read,omitempty"` - Blocked *SyncMessage_Blocked `protobuf:"bytes,6,opt,name=blocked" json:"blocked,omitempty"` - Verified *Verified `protobuf:"bytes,7,opt,name=verified" json:"verified,omitempty"` - Configuration *SyncMessage_Configuration `protobuf:"bytes,9,opt,name=configuration" json:"configuration,omitempty"` - Padding []byte `protobuf:"bytes,8,opt,name=padding" json:"padding,omitempty"` - StickerPackOperation []*SyncMessage_StickerPackOperation `protobuf:"bytes,10,rep,name=stickerPackOperation" json:"stickerPackOperation,omitempty"` - ViewOnceOpen *SyncMessage_ViewOnceOpen `protobuf:"bytes,11,opt,name=viewOnceOpen" json:"viewOnceOpen,omitempty"` - FetchLatest *SyncMessage_FetchLatest `protobuf:"bytes,12,opt,name=fetchLatest" json:"fetchLatest,omitempty"` - Keys *SyncMessage_Keys `protobuf:"bytes,13,opt,name=keys" json:"keys,omitempty"` - MessageRequestResponse *SyncMessage_MessageRequestResponse `protobuf:"bytes,14,opt,name=messageRequestResponse" json:"messageRequestResponse,omitempty"` - OutgoingPayment *SyncMessage_OutgoingPayment `protobuf:"bytes,15,opt,name=outgoingPayment" json:"outgoingPayment,omitempty"` - Viewed []*SyncMessage_Viewed `protobuf:"bytes,16,rep,name=viewed" json:"viewed,omitempty"` - PniChangeNumber *SyncMessage_PniChangeNumber `protobuf:"bytes,18,opt,name=pniChangeNumber" json:"pniChangeNumber,omitempty"` - CallEvent *SyncMessage_CallEvent `protobuf:"bytes,19,opt,name=callEvent" json:"callEvent,omitempty"` - CallLinkUpdate *SyncMessage_CallLinkUpdate `protobuf:"bytes,20,opt,name=callLinkUpdate" json:"callLinkUpdate,omitempty"` - CallLogEvent *SyncMessage_CallLogEvent `protobuf:"bytes,21,opt,name=callLogEvent" json:"callLogEvent,omitempty"` - DeleteForMe *SyncMessage_DeleteForMe `protobuf:"bytes,22,opt,name=deleteForMe" json:"deleteForMe,omitempty"` - DeviceNameChange *SyncMessage_DeviceNameChange `protobuf:"bytes,23,opt,name=deviceNameChange" json:"deviceNameChange,omitempty"` - AttachmentBackfillRequest *SyncMessage_AttachmentBackfillRequest `protobuf:"bytes,24,opt,name=attachmentBackfillRequest" json:"attachmentBackfillRequest,omitempty"` - AttachmentBackfillResponse *SyncMessage_AttachmentBackfillResponse `protobuf:"bytes,25,opt,name=attachmentBackfillResponse" json:"attachmentBackfillResponse,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Content: + // + // *SyncMessage_Sent_ + // *SyncMessage_Contacts_ + // *SyncMessage_Request_ + // *SyncMessage_Blocked_ + // *SyncMessage_Verified + // *SyncMessage_Configuration_ + // *SyncMessage_ViewOnceOpen_ + // *SyncMessage_FetchLatest_ + // *SyncMessage_Keys_ + // *SyncMessage_MessageRequestResponse_ + // *SyncMessage_OutgoingPayment_ + // *SyncMessage_PniChangeNumber_ + // *SyncMessage_CallEvent_ + // *SyncMessage_CallLinkUpdate_ + // *SyncMessage_CallLogEvent_ + // *SyncMessage_DeleteForMe_ + // *SyncMessage_DeviceNameChange_ + // *SyncMessage_AttachmentBackfillRequest_ + // *SyncMessage_AttachmentBackfillResponse_ + Content isSyncMessage_Content `protobuf_oneof:"content"` + // Protobufs don't allow `repeated` fields to be inside of `oneof` so while + // the fields below are mutually exclusive with the rest of the values above + // we have to place them outside of `oneof`. + Read []*SyncMessage_Read `protobuf:"bytes,5,rep,name=read" json:"read,omitempty"` + StickerPackOperation []*SyncMessage_StickerPackOperation `protobuf:"bytes,10,rep,name=stickerPackOperation" json:"stickerPackOperation,omitempty"` + Viewed []*SyncMessage_Viewed `protobuf:"bytes,16,rep,name=viewed" json:"viewed,omitempty"` + Padding []byte `protobuf:"bytes,8,opt,name=padding" json:"padding,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SyncMessage) Reset() { @@ -2989,23 +3127,180 @@ func (*SyncMessage) Descriptor() ([]byte, []int) { return file_SignalService_proto_rawDescGZIP(), []int{11} } +func (x *SyncMessage) GetContent() isSyncMessage_Content { + if x != nil { + return x.Content + } + return nil +} + func (x *SyncMessage) GetSent() *SyncMessage_Sent { if x != nil { - return x.Sent + if x, ok := x.Content.(*SyncMessage_Sent_); ok { + return x.Sent + } } return nil } func (x *SyncMessage) GetContacts() *SyncMessage_Contacts { if x != nil { - return x.Contacts + if x, ok := x.Content.(*SyncMessage_Contacts_); ok { + return x.Contacts + } } return nil } func (x *SyncMessage) GetRequest() *SyncMessage_Request { if x != nil { - return x.Request + if x, ok := x.Content.(*SyncMessage_Request_); ok { + return x.Request + } + } + return nil +} + +func (x *SyncMessage) GetBlocked() *SyncMessage_Blocked { + if x != nil { + if x, ok := x.Content.(*SyncMessage_Blocked_); ok { + return x.Blocked + } + } + return nil +} + +func (x *SyncMessage) GetVerified() *Verified { + if x != nil { + if x, ok := x.Content.(*SyncMessage_Verified); ok { + return x.Verified + } + } + return nil +} + +func (x *SyncMessage) GetConfiguration() *SyncMessage_Configuration { + if x != nil { + if x, ok := x.Content.(*SyncMessage_Configuration_); ok { + return x.Configuration + } + } + return nil +} + +func (x *SyncMessage) GetViewOnceOpen() *SyncMessage_ViewOnceOpen { + if x != nil { + if x, ok := x.Content.(*SyncMessage_ViewOnceOpen_); ok { + return x.ViewOnceOpen + } + } + return nil +} + +func (x *SyncMessage) GetFetchLatest() *SyncMessage_FetchLatest { + if x != nil { + if x, ok := x.Content.(*SyncMessage_FetchLatest_); ok { + return x.FetchLatest + } + } + return nil +} + +func (x *SyncMessage) GetKeys() *SyncMessage_Keys { + if x != nil { + if x, ok := x.Content.(*SyncMessage_Keys_); ok { + return x.Keys + } + } + return nil +} + +func (x *SyncMessage) GetMessageRequestResponse() *SyncMessage_MessageRequestResponse { + if x != nil { + if x, ok := x.Content.(*SyncMessage_MessageRequestResponse_); ok { + return x.MessageRequestResponse + } + } + return nil +} + +func (x *SyncMessage) GetOutgoingPayment() *SyncMessage_OutgoingPayment { + if x != nil { + if x, ok := x.Content.(*SyncMessage_OutgoingPayment_); ok { + return x.OutgoingPayment + } + } + return nil +} + +func (x *SyncMessage) GetPniChangeNumber() *SyncMessage_PniChangeNumber { + if x != nil { + if x, ok := x.Content.(*SyncMessage_PniChangeNumber_); ok { + return x.PniChangeNumber + } + } + return nil +} + +func (x *SyncMessage) GetCallEvent() *SyncMessage_CallEvent { + if x != nil { + if x, ok := x.Content.(*SyncMessage_CallEvent_); ok { + return x.CallEvent + } + } + return nil +} + +func (x *SyncMessage) GetCallLinkUpdate() *SyncMessage_CallLinkUpdate { + if x != nil { + if x, ok := x.Content.(*SyncMessage_CallLinkUpdate_); ok { + return x.CallLinkUpdate + } + } + return nil +} + +func (x *SyncMessage) GetCallLogEvent() *SyncMessage_CallLogEvent { + if x != nil { + if x, ok := x.Content.(*SyncMessage_CallLogEvent_); ok { + return x.CallLogEvent + } + } + return nil +} + +func (x *SyncMessage) GetDeleteForMe() *SyncMessage_DeleteForMe { + if x != nil { + if x, ok := x.Content.(*SyncMessage_DeleteForMe_); ok { + return x.DeleteForMe + } + } + return nil +} + +func (x *SyncMessage) GetDeviceNameChange() *SyncMessage_DeviceNameChange { + if x != nil { + if x, ok := x.Content.(*SyncMessage_DeviceNameChange_); ok { + return x.DeviceNameChange + } + } + return nil +} + +func (x *SyncMessage) GetAttachmentBackfillRequest() *SyncMessage_AttachmentBackfillRequest { + if x != nil { + if x, ok := x.Content.(*SyncMessage_AttachmentBackfillRequest_); ok { + return x.AttachmentBackfillRequest + } + } + return nil +} + +func (x *SyncMessage) GetAttachmentBackfillResponse() *SyncMessage_AttachmentBackfillResponse { + if x != nil { + if x, ok := x.Content.(*SyncMessage_AttachmentBackfillResponse_); ok { + return x.AttachmentBackfillResponse + } } return nil } @@ -3017,34 +3312,6 @@ func (x *SyncMessage) GetRead() []*SyncMessage_Read { return nil } -func (x *SyncMessage) GetBlocked() *SyncMessage_Blocked { - if x != nil { - return x.Blocked - } - return nil -} - -func (x *SyncMessage) GetVerified() *Verified { - if x != nil { - return x.Verified - } - return nil -} - -func (x *SyncMessage) GetConfiguration() *SyncMessage_Configuration { - if x != nil { - return x.Configuration - } - return nil -} - -func (x *SyncMessage) GetPadding() []byte { - if x != nil { - return x.Padding - } - return nil -} - func (x *SyncMessage) GetStickerPackOperation() []*SyncMessage_StickerPackOperation { if x != nil { return x.StickerPackOperation @@ -3052,41 +3319,6 @@ func (x *SyncMessage) GetStickerPackOperation() []*SyncMessage_StickerPackOperat return nil } -func (x *SyncMessage) GetViewOnceOpen() *SyncMessage_ViewOnceOpen { - if x != nil { - return x.ViewOnceOpen - } - return nil -} - -func (x *SyncMessage) GetFetchLatest() *SyncMessage_FetchLatest { - if x != nil { - return x.FetchLatest - } - return nil -} - -func (x *SyncMessage) GetKeys() *SyncMessage_Keys { - if x != nil { - return x.Keys - } - return nil -} - -func (x *SyncMessage) GetMessageRequestResponse() *SyncMessage_MessageRequestResponse { - if x != nil { - return x.MessageRequestResponse - } - return nil -} - -func (x *SyncMessage) GetOutgoingPayment() *SyncMessage_OutgoingPayment { - if x != nil { - return x.OutgoingPayment - } - return nil -} - func (x *SyncMessage) GetViewed() []*SyncMessage_Viewed { if x != nil { return x.Viewed @@ -3094,62 +3326,131 @@ func (x *SyncMessage) GetViewed() []*SyncMessage_Viewed { return nil } -func (x *SyncMessage) GetPniChangeNumber() *SyncMessage_PniChangeNumber { +func (x *SyncMessage) GetPadding() []byte { if x != nil { - return x.PniChangeNumber + return x.Padding } return nil } -func (x *SyncMessage) GetCallEvent() *SyncMessage_CallEvent { - if x != nil { - return x.CallEvent - } - return nil +type isSyncMessage_Content interface { + isSyncMessage_Content() } -func (x *SyncMessage) GetCallLinkUpdate() *SyncMessage_CallLinkUpdate { - if x != nil { - return x.CallLinkUpdate - } - return nil +type SyncMessage_Sent_ struct { + Sent *SyncMessage_Sent `protobuf:"bytes,1,opt,name=sent,oneof"` } -func (x *SyncMessage) GetCallLogEvent() *SyncMessage_CallLogEvent { - if x != nil { - return x.CallLogEvent - } - return nil +type SyncMessage_Contacts_ struct { + Contacts *SyncMessage_Contacts `protobuf:"bytes,2,opt,name=contacts,oneof"` } -func (x *SyncMessage) GetDeleteForMe() *SyncMessage_DeleteForMe { - if x != nil { - return x.DeleteForMe - } - return nil +type SyncMessage_Request_ struct { + Request *SyncMessage_Request `protobuf:"bytes,4,opt,name=request,oneof"` } -func (x *SyncMessage) GetDeviceNameChange() *SyncMessage_DeviceNameChange { - if x != nil { - return x.DeviceNameChange - } - return nil +type SyncMessage_Blocked_ struct { + Blocked *SyncMessage_Blocked `protobuf:"bytes,6,opt,name=blocked,oneof"` } -func (x *SyncMessage) GetAttachmentBackfillRequest() *SyncMessage_AttachmentBackfillRequest { - if x != nil { - return x.AttachmentBackfillRequest - } - return nil +type SyncMessage_Verified struct { + Verified *Verified `protobuf:"bytes,7,opt,name=verified,oneof"` } -func (x *SyncMessage) GetAttachmentBackfillResponse() *SyncMessage_AttachmentBackfillResponse { - if x != nil { - return x.AttachmentBackfillResponse - } - return nil +type SyncMessage_Configuration_ struct { + Configuration *SyncMessage_Configuration `protobuf:"bytes,9,opt,name=configuration,oneof"` } +type SyncMessage_ViewOnceOpen_ struct { + ViewOnceOpen *SyncMessage_ViewOnceOpen `protobuf:"bytes,11,opt,name=viewOnceOpen,oneof"` +} + +type SyncMessage_FetchLatest_ struct { + FetchLatest *SyncMessage_FetchLatest `protobuf:"bytes,12,opt,name=fetchLatest,oneof"` +} + +type SyncMessage_Keys_ struct { + Keys *SyncMessage_Keys `protobuf:"bytes,13,opt,name=keys,oneof"` +} + +type SyncMessage_MessageRequestResponse_ struct { + MessageRequestResponse *SyncMessage_MessageRequestResponse `protobuf:"bytes,14,opt,name=messageRequestResponse,oneof"` +} + +type SyncMessage_OutgoingPayment_ struct { + OutgoingPayment *SyncMessage_OutgoingPayment `protobuf:"bytes,15,opt,name=outgoingPayment,oneof"` +} + +type SyncMessage_PniChangeNumber_ struct { + PniChangeNumber *SyncMessage_PniChangeNumber `protobuf:"bytes,18,opt,name=pniChangeNumber,oneof"` +} + +type SyncMessage_CallEvent_ struct { + CallEvent *SyncMessage_CallEvent `protobuf:"bytes,19,opt,name=callEvent,oneof"` +} + +type SyncMessage_CallLinkUpdate_ struct { + CallLinkUpdate *SyncMessage_CallLinkUpdate `protobuf:"bytes,20,opt,name=callLinkUpdate,oneof"` +} + +type SyncMessage_CallLogEvent_ struct { + CallLogEvent *SyncMessage_CallLogEvent `protobuf:"bytes,21,opt,name=callLogEvent,oneof"` +} + +type SyncMessage_DeleteForMe_ struct { + DeleteForMe *SyncMessage_DeleteForMe `protobuf:"bytes,22,opt,name=deleteForMe,oneof"` +} + +type SyncMessage_DeviceNameChange_ struct { + DeviceNameChange *SyncMessage_DeviceNameChange `protobuf:"bytes,23,opt,name=deviceNameChange,oneof"` +} + +type SyncMessage_AttachmentBackfillRequest_ struct { + AttachmentBackfillRequest *SyncMessage_AttachmentBackfillRequest `protobuf:"bytes,24,opt,name=attachmentBackfillRequest,oneof"` +} + +type SyncMessage_AttachmentBackfillResponse_ struct { + AttachmentBackfillResponse *SyncMessage_AttachmentBackfillResponse `protobuf:"bytes,25,opt,name=attachmentBackfillResponse,oneof"` +} + +func (*SyncMessage_Sent_) isSyncMessage_Content() {} + +func (*SyncMessage_Contacts_) isSyncMessage_Content() {} + +func (*SyncMessage_Request_) isSyncMessage_Content() {} + +func (*SyncMessage_Blocked_) isSyncMessage_Content() {} + +func (*SyncMessage_Verified) isSyncMessage_Content() {} + +func (*SyncMessage_Configuration_) isSyncMessage_Content() {} + +func (*SyncMessage_ViewOnceOpen_) isSyncMessage_Content() {} + +func (*SyncMessage_FetchLatest_) isSyncMessage_Content() {} + +func (*SyncMessage_Keys_) isSyncMessage_Content() {} + +func (*SyncMessage_MessageRequestResponse_) isSyncMessage_Content() {} + +func (*SyncMessage_OutgoingPayment_) isSyncMessage_Content() {} + +func (*SyncMessage_PniChangeNumber_) isSyncMessage_Content() {} + +func (*SyncMessage_CallEvent_) isSyncMessage_Content() {} + +func (*SyncMessage_CallLinkUpdate_) isSyncMessage_Content() {} + +func (*SyncMessage_CallLogEvent_) isSyncMessage_Content() {} + +func (*SyncMessage_DeleteForMe_) isSyncMessage_Content() {} + +func (*SyncMessage_DeviceNameChange_) isSyncMessage_Content() {} + +func (*SyncMessage_AttachmentBackfillRequest_) isSyncMessage_Content() {} + +func (*SyncMessage_AttachmentBackfillResponse_) isSyncMessage_Content() {} + type AttachmentPointer struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to AttachmentIdentifier: @@ -5117,8 +5418,8 @@ type DataMessage_PollVote struct { state protoimpl.MessageState `protogen:"open.v1"` TargetAuthorAciBinary []byte `protobuf:"bytes,1,opt,name=targetAuthorAciBinary" json:"targetAuthorAciBinary,omitempty"` TargetSentTimestamp *uint64 `protobuf:"varint,2,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` - OptionIndexes []uint32 `protobuf:"varint,3,rep,name=optionIndexes" json:"optionIndexes,omitempty"` // must be in the range [0, options.length) from the PollCreate - VoteCount *uint32 `protobuf:"varint,4,opt,name=voteCount" json:"voteCount,omitempty"` // increment this by 1 each time you vote on a given poll + OptionIndexes []uint32 `protobuf:"varint,3,rep,name=optionIndexes" json:"optionIndexes,omitempty"` + VoteCount *uint32 `protobuf:"varint,4,opt,name=voteCount" json:"voteCount,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -5331,6 +5632,58 @@ func (x *DataMessage_UnpinMessage) GetTargetSentTimestamp() uint64 { return 0 } +type DataMessage_AdminDelete struct { + state protoimpl.MessageState `protogen:"open.v1"` + TargetAuthorAciBinary []byte `protobuf:"bytes,1,opt,name=targetAuthorAciBinary" json:"targetAuthorAciBinary,omitempty"` // 16-byte UUID + TargetSentTimestamp *uint64 `protobuf:"varint,2,opt,name=targetSentTimestamp" json:"targetSentTimestamp,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DataMessage_AdminDelete) Reset() { + *x = DataMessage_AdminDelete{} + mi := &file_SignalService_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DataMessage_AdminDelete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataMessage_AdminDelete) ProtoMessage() {} + +func (x *DataMessage_AdminDelete) ProtoReflect() protoreflect.Message { + mi := &file_SignalService_proto_msgTypes[42] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataMessage_AdminDelete.ProtoReflect.Descriptor instead. +func (*DataMessage_AdminDelete) Descriptor() ([]byte, []int) { + return file_SignalService_proto_rawDescGZIP(), []int{3, 14} +} + +func (x *DataMessage_AdminDelete) GetTargetAuthorAciBinary() []byte { + if x != nil { + return x.TargetAuthorAciBinary + } + return nil +} + +func (x *DataMessage_AdminDelete) GetTargetSentTimestamp() uint64 { + if x != nil && x.TargetSentTimestamp != nil { + return *x.TargetSentTimestamp + } + return 0 +} + type DataMessage_Payment_Amount struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Amount: @@ -5343,7 +5696,7 @@ type DataMessage_Payment_Amount struct { func (x *DataMessage_Payment_Amount) Reset() { *x = DataMessage_Payment_Amount{} - mi := &file_SignalService_proto_msgTypes[42] + mi := &file_SignalService_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5355,7 +5708,7 @@ func (x *DataMessage_Payment_Amount) String() string { func (*DataMessage_Payment_Amount) ProtoMessage() {} func (x *DataMessage_Payment_Amount) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[42] + mi := &file_SignalService_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5411,7 +5764,7 @@ type DataMessage_Payment_Notification struct { func (x *DataMessage_Payment_Notification) Reset() { *x = DataMessage_Payment_Notification{} - mi := &file_SignalService_proto_msgTypes[43] + mi := &file_SignalService_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5423,7 +5776,7 @@ func (x *DataMessage_Payment_Notification) String() string { func (*DataMessage_Payment_Notification) ProtoMessage() {} func (x *DataMessage_Payment_Notification) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[43] + mi := &file_SignalService_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5482,7 +5835,7 @@ type DataMessage_Payment_Activation struct { func (x *DataMessage_Payment_Activation) Reset() { *x = DataMessage_Payment_Activation{} - mi := &file_SignalService_proto_msgTypes[44] + mi := &file_SignalService_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5494,7 +5847,7 @@ func (x *DataMessage_Payment_Activation) String() string { func (*DataMessage_Payment_Activation) ProtoMessage() {} func (x *DataMessage_Payment_Activation) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[44] + mi := &file_SignalService_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5526,7 +5879,7 @@ type DataMessage_Payment_Amount_MobileCoin struct { func (x *DataMessage_Payment_Amount_MobileCoin) Reset() { *x = DataMessage_Payment_Amount_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[45] + mi := &file_SignalService_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5538,7 +5891,7 @@ func (x *DataMessage_Payment_Amount_MobileCoin) String() string { func (*DataMessage_Payment_Amount_MobileCoin) ProtoMessage() {} func (x *DataMessage_Payment_Amount_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[45] + mi := &file_SignalService_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5570,7 +5923,7 @@ type DataMessage_Payment_Notification_MobileCoin struct { func (x *DataMessage_Payment_Notification_MobileCoin) Reset() { *x = DataMessage_Payment_Notification_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[46] + mi := &file_SignalService_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5582,7 +5935,7 @@ func (x *DataMessage_Payment_Notification_MobileCoin) String() string { func (*DataMessage_Payment_Notification_MobileCoin) ProtoMessage() {} func (x *DataMessage_Payment_Notification_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[46] + mi := &file_SignalService_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5616,7 +5969,7 @@ type DataMessage_Quote_QuotedAttachment struct { func (x *DataMessage_Quote_QuotedAttachment) Reset() { *x = DataMessage_Quote_QuotedAttachment{} - mi := &file_SignalService_proto_msgTypes[47] + mi := &file_SignalService_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5628,7 +5981,7 @@ func (x *DataMessage_Quote_QuotedAttachment) String() string { func (*DataMessage_Quote_QuotedAttachment) ProtoMessage() {} func (x *DataMessage_Quote_QuotedAttachment) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[47] + mi := &file_SignalService_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5679,7 +6032,7 @@ type DataMessage_Contact_Name struct { func (x *DataMessage_Contact_Name) Reset() { *x = DataMessage_Contact_Name{} - mi := &file_SignalService_proto_msgTypes[48] + mi := &file_SignalService_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5691,7 +6044,7 @@ func (x *DataMessage_Contact_Name) String() string { func (*DataMessage_Contact_Name) ProtoMessage() {} func (x *DataMessage_Contact_Name) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[48] + mi := &file_SignalService_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5760,7 +6113,7 @@ type DataMessage_Contact_Phone struct { func (x *DataMessage_Contact_Phone) Reset() { *x = DataMessage_Contact_Phone{} - mi := &file_SignalService_proto_msgTypes[49] + mi := &file_SignalService_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5772,7 +6125,7 @@ func (x *DataMessage_Contact_Phone) String() string { func (*DataMessage_Contact_Phone) ProtoMessage() {} func (x *DataMessage_Contact_Phone) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[49] + mi := &file_SignalService_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5820,7 +6173,7 @@ type DataMessage_Contact_Email struct { func (x *DataMessage_Contact_Email) Reset() { *x = DataMessage_Contact_Email{} - mi := &file_SignalService_proto_msgTypes[50] + mi := &file_SignalService_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5832,7 +6185,7 @@ func (x *DataMessage_Contact_Email) String() string { func (*DataMessage_Contact_Email) ProtoMessage() {} func (x *DataMessage_Contact_Email) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[50] + mi := &file_SignalService_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5886,7 +6239,7 @@ type DataMessage_Contact_PostalAddress struct { func (x *DataMessage_Contact_PostalAddress) Reset() { *x = DataMessage_Contact_PostalAddress{} - mi := &file_SignalService_proto_msgTypes[51] + mi := &file_SignalService_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5898,7 +6251,7 @@ func (x *DataMessage_Contact_PostalAddress) String() string { func (*DataMessage_Contact_PostalAddress) ProtoMessage() {} func (x *DataMessage_Contact_PostalAddress) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[51] + mi := &file_SignalService_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5987,7 +6340,7 @@ type DataMessage_Contact_Avatar struct { func (x *DataMessage_Contact_Avatar) Reset() { *x = DataMessage_Contact_Avatar{} - mi := &file_SignalService_proto_msgTypes[52] + mi := &file_SignalService_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5999,7 +6352,7 @@ func (x *DataMessage_Contact_Avatar) String() string { func (*DataMessage_Contact_Avatar) ProtoMessage() {} func (x *DataMessage_Contact_Avatar) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[52] + mi := &file_SignalService_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6042,7 +6395,7 @@ type TextAttachment_Gradient struct { func (x *TextAttachment_Gradient) Reset() { *x = TextAttachment_Gradient{} - mi := &file_SignalService_proto_msgTypes[53] + mi := &file_SignalService_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6054,7 +6407,7 @@ func (x *TextAttachment_Gradient) String() string { func (*TextAttachment_Gradient) ProtoMessage() {} func (x *TextAttachment_Gradient) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[53] + mi := &file_SignalService_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6129,7 +6482,7 @@ const ( func (x *SyncMessage_Sent) Reset() { *x = SyncMessage_Sent{} - mi := &file_SignalService_proto_msgTypes[54] + mi := &file_SignalService_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6141,7 +6494,7 @@ func (x *SyncMessage_Sent) String() string { func (*SyncMessage_Sent) ProtoMessage() {} func (x *SyncMessage_Sent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[54] + mi := &file_SignalService_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6249,7 +6602,7 @@ const ( func (x *SyncMessage_Contacts) Reset() { *x = SyncMessage_Contacts{} - mi := &file_SignalService_proto_msgTypes[55] + mi := &file_SignalService_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6261,7 +6614,7 @@ func (x *SyncMessage_Contacts) String() string { func (*SyncMessage_Contacts) ProtoMessage() {} func (x *SyncMessage_Contacts) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[55] + mi := &file_SignalService_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6303,7 +6656,7 @@ type SyncMessage_Blocked struct { func (x *SyncMessage_Blocked) Reset() { *x = SyncMessage_Blocked{} - mi := &file_SignalService_proto_msgTypes[56] + mi := &file_SignalService_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6315,7 +6668,7 @@ func (x *SyncMessage_Blocked) String() string { func (*SyncMessage_Blocked) ProtoMessage() {} func (x *SyncMessage_Blocked) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[56] + mi := &file_SignalService_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6368,7 +6721,7 @@ type SyncMessage_Request struct { func (x *SyncMessage_Request) Reset() { *x = SyncMessage_Request{} - mi := &file_SignalService_proto_msgTypes[57] + mi := &file_SignalService_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6380,7 +6733,7 @@ func (x *SyncMessage_Request) String() string { func (*SyncMessage_Request) ProtoMessage() {} func (x *SyncMessage_Request) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[57] + mi := &file_SignalService_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6414,7 +6767,7 @@ type SyncMessage_Read struct { func (x *SyncMessage_Read) Reset() { *x = SyncMessage_Read{} - mi := &file_SignalService_proto_msgTypes[58] + mi := &file_SignalService_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6426,7 +6779,7 @@ func (x *SyncMessage_Read) String() string { func (*SyncMessage_Read) ProtoMessage() {} func (x *SyncMessage_Read) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[58] + mi := &file_SignalService_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6474,7 +6827,7 @@ type SyncMessage_Viewed struct { func (x *SyncMessage_Viewed) Reset() { *x = SyncMessage_Viewed{} - mi := &file_SignalService_proto_msgTypes[59] + mi := &file_SignalService_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6486,7 +6839,7 @@ func (x *SyncMessage_Viewed) String() string { func (*SyncMessage_Viewed) ProtoMessage() {} func (x *SyncMessage_Viewed) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[59] + mi := &file_SignalService_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6528,7 +6881,6 @@ type SyncMessage_Configuration struct { ReadReceipts *bool `protobuf:"varint,1,opt,name=readReceipts" json:"readReceipts,omitempty"` UnidentifiedDeliveryIndicators *bool `protobuf:"varint,2,opt,name=unidentifiedDeliveryIndicators" json:"unidentifiedDeliveryIndicators,omitempty"` TypingIndicators *bool `protobuf:"varint,3,opt,name=typingIndicators" json:"typingIndicators,omitempty"` - ProvisioningVersion *uint32 `protobuf:"varint,5,opt,name=provisioningVersion" json:"provisioningVersion,omitempty"` LinkPreviews *bool `protobuf:"varint,6,opt,name=linkPreviews" json:"linkPreviews,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -6536,7 +6888,7 @@ type SyncMessage_Configuration struct { func (x *SyncMessage_Configuration) Reset() { *x = SyncMessage_Configuration{} - mi := &file_SignalService_proto_msgTypes[60] + mi := &file_SignalService_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6548,7 +6900,7 @@ func (x *SyncMessage_Configuration) String() string { func (*SyncMessage_Configuration) ProtoMessage() {} func (x *SyncMessage_Configuration) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[60] + mi := &file_SignalService_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6585,13 +6937,6 @@ func (x *SyncMessage_Configuration) GetTypingIndicators() bool { return false } -func (x *SyncMessage_Configuration) GetProvisioningVersion() uint32 { - if x != nil && x.ProvisioningVersion != nil { - return *x.ProvisioningVersion - } - return 0 -} - func (x *SyncMessage_Configuration) GetLinkPreviews() bool { if x != nil && x.LinkPreviews != nil { return *x.LinkPreviews @@ -6610,7 +6955,7 @@ type SyncMessage_StickerPackOperation struct { func (x *SyncMessage_StickerPackOperation) Reset() { *x = SyncMessage_StickerPackOperation{} - mi := &file_SignalService_proto_msgTypes[61] + mi := &file_SignalService_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6622,7 +6967,7 @@ func (x *SyncMessage_StickerPackOperation) String() string { func (*SyncMessage_StickerPackOperation) ProtoMessage() {} func (x *SyncMessage_StickerPackOperation) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[61] + mi := &file_SignalService_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6670,7 +7015,7 @@ type SyncMessage_ViewOnceOpen struct { func (x *SyncMessage_ViewOnceOpen) Reset() { *x = SyncMessage_ViewOnceOpen{} - mi := &file_SignalService_proto_msgTypes[62] + mi := &file_SignalService_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6682,7 +7027,7 @@ func (x *SyncMessage_ViewOnceOpen) String() string { func (*SyncMessage_ViewOnceOpen) ProtoMessage() {} func (x *SyncMessage_ViewOnceOpen) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[62] + mi := &file_SignalService_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6728,7 +7073,7 @@ type SyncMessage_FetchLatest struct { func (x *SyncMessage_FetchLatest) Reset() { *x = SyncMessage_FetchLatest{} - mi := &file_SignalService_proto_msgTypes[63] + mi := &file_SignalService_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6740,7 +7085,7 @@ func (x *SyncMessage_FetchLatest) String() string { func (*SyncMessage_FetchLatest) ProtoMessage() {} func (x *SyncMessage_FetchLatest) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[63] + mi := &file_SignalService_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6765,7 +7110,6 @@ func (x *SyncMessage_FetchLatest) GetType() SyncMessage_FetchLatest_Type { type SyncMessage_Keys struct { state protoimpl.MessageState `protogen:"open.v1"` - Master []byte `protobuf:"bytes,2,opt,name=master" json:"master,omitempty"` // deprecated: this field will be removed in a future release. AccountEntropyPool *string `protobuf:"bytes,3,opt,name=accountEntropyPool" json:"accountEntropyPool,omitempty"` MediaRootBackupKey []byte `protobuf:"bytes,4,opt,name=mediaRootBackupKey" json:"mediaRootBackupKey,omitempty"` unknownFields protoimpl.UnknownFields @@ -6774,7 +7118,7 @@ type SyncMessage_Keys struct { func (x *SyncMessage_Keys) Reset() { *x = SyncMessage_Keys{} - mi := &file_SignalService_proto_msgTypes[64] + mi := &file_SignalService_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6786,7 +7130,7 @@ func (x *SyncMessage_Keys) String() string { func (*SyncMessage_Keys) ProtoMessage() {} func (x *SyncMessage_Keys) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[64] + mi := &file_SignalService_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6802,13 +7146,6 @@ func (*SyncMessage_Keys) Descriptor() ([]byte, []int) { return file_SignalService_proto_rawDescGZIP(), []int{11, 10} } -func (x *SyncMessage_Keys) GetMaster() []byte { - if x != nil { - return x.Master - } - return nil -} - func (x *SyncMessage_Keys) GetAccountEntropyPool() string { if x != nil && x.AccountEntropyPool != nil { return *x.AccountEntropyPool @@ -6833,7 +7170,7 @@ type SyncMessage_PniIdentity struct { func (x *SyncMessage_PniIdentity) Reset() { *x = SyncMessage_PniIdentity{} - mi := &file_SignalService_proto_msgTypes[65] + mi := &file_SignalService_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6845,7 +7182,7 @@ func (x *SyncMessage_PniIdentity) String() string { func (*SyncMessage_PniIdentity) ProtoMessage() {} func (x *SyncMessage_PniIdentity) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[65] + mi := &file_SignalService_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6887,7 +7224,7 @@ type SyncMessage_MessageRequestResponse struct { func (x *SyncMessage_MessageRequestResponse) Reset() { *x = SyncMessage_MessageRequestResponse{} - mi := &file_SignalService_proto_msgTypes[66] + mi := &file_SignalService_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6899,7 +7236,7 @@ func (x *SyncMessage_MessageRequestResponse) String() string { func (*SyncMessage_MessageRequestResponse) ProtoMessage() {} func (x *SyncMessage_MessageRequestResponse) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[66] + mi := &file_SignalService_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6957,7 +7294,7 @@ type SyncMessage_OutgoingPayment struct { func (x *SyncMessage_OutgoingPayment) Reset() { *x = SyncMessage_OutgoingPayment{} - mi := &file_SignalService_proto_msgTypes[67] + mi := &file_SignalService_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6969,7 +7306,7 @@ func (x *SyncMessage_OutgoingPayment) String() string { func (*SyncMessage_OutgoingPayment) ProtoMessage() {} func (x *SyncMessage_OutgoingPayment) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[67] + mi := &file_SignalService_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7039,7 +7376,7 @@ type SyncMessage_PniChangeNumber struct { func (x *SyncMessage_PniChangeNumber) Reset() { *x = SyncMessage_PniChangeNumber{} - mi := &file_SignalService_proto_msgTypes[68] + mi := &file_SignalService_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7051,7 +7388,7 @@ func (x *SyncMessage_PniChangeNumber) String() string { func (*SyncMessage_PniChangeNumber) ProtoMessage() {} func (x *SyncMessage_PniChangeNumber) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[68] + mi := &file_SignalService_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7121,7 +7458,7 @@ type SyncMessage_CallEvent struct { func (x *SyncMessage_CallEvent) Reset() { *x = SyncMessage_CallEvent{} - mi := &file_SignalService_proto_msgTypes[69] + mi := &file_SignalService_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7133,7 +7470,7 @@ func (x *SyncMessage_CallEvent) String() string { func (*SyncMessage_CallEvent) ProtoMessage() {} func (x *SyncMessage_CallEvent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[69] + mi := &file_SignalService_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7196,14 +7533,13 @@ type SyncMessage_CallLinkUpdate struct { RootKey []byte `protobuf:"bytes,1,opt,name=rootKey" json:"rootKey,omitempty"` AdminPasskey []byte `protobuf:"bytes,2,opt,name=adminPasskey" json:"adminPasskey,omitempty"` Type *SyncMessage_CallLinkUpdate_Type `protobuf:"varint,3,opt,name=type,enum=signalservice.SyncMessage_CallLinkUpdate_Type" json:"type,omitempty"` // defaults to UPDATE - Epoch []byte `protobuf:"bytes,4,opt,name=epoch" json:"epoch,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *SyncMessage_CallLinkUpdate) Reset() { *x = SyncMessage_CallLinkUpdate{} - mi := &file_SignalService_proto_msgTypes[70] + mi := &file_SignalService_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7215,7 +7551,7 @@ func (x *SyncMessage_CallLinkUpdate) String() string { func (*SyncMessage_CallLinkUpdate) ProtoMessage() {} func (x *SyncMessage_CallLinkUpdate) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[70] + mi := &file_SignalService_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7252,13 +7588,6 @@ func (x *SyncMessage_CallLinkUpdate) GetType() SyncMessage_CallLinkUpdate_Type { return SyncMessage_CallLinkUpdate_UPDATE } -func (x *SyncMessage_CallLinkUpdate) GetEpoch() []byte { - if x != nil { - return x.Epoch - } - return nil -} - type SyncMessage_CallLogEvent struct { state protoimpl.MessageState `protogen:"open.v1"` Type *SyncMessage_CallLogEvent_Type `protobuf:"varint,1,opt,name=type,enum=signalservice.SyncMessage_CallLogEvent_Type" json:"type,omitempty"` @@ -7276,7 +7605,7 @@ type SyncMessage_CallLogEvent struct { func (x *SyncMessage_CallLogEvent) Reset() { *x = SyncMessage_CallLogEvent{} - mi := &file_SignalService_proto_msgTypes[71] + mi := &file_SignalService_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7288,7 +7617,7 @@ func (x *SyncMessage_CallLogEvent) String() string { func (*SyncMessage_CallLogEvent) ProtoMessage() {} func (x *SyncMessage_CallLogEvent) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[71] + mi := &file_SignalService_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7344,7 +7673,7 @@ type SyncMessage_DeleteForMe struct { func (x *SyncMessage_DeleteForMe) Reset() { *x = SyncMessage_DeleteForMe{} - mi := &file_SignalService_proto_msgTypes[72] + mi := &file_SignalService_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7356,7 +7685,7 @@ func (x *SyncMessage_DeleteForMe) String() string { func (*SyncMessage_DeleteForMe) ProtoMessage() {} func (x *SyncMessage_DeleteForMe) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[72] + mi := &file_SignalService_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7409,7 +7738,7 @@ type SyncMessage_DeviceNameChange struct { func (x *SyncMessage_DeviceNameChange) Reset() { *x = SyncMessage_DeviceNameChange{} - mi := &file_SignalService_proto_msgTypes[73] + mi := &file_SignalService_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7421,7 +7750,7 @@ func (x *SyncMessage_DeviceNameChange) String() string { func (*SyncMessage_DeviceNameChange) ProtoMessage() {} func (x *SyncMessage_DeviceNameChange) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[73] + mi := &file_SignalService_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7454,7 +7783,7 @@ type SyncMessage_AttachmentBackfillRequest struct { func (x *SyncMessage_AttachmentBackfillRequest) Reset() { *x = SyncMessage_AttachmentBackfillRequest{} - mi := &file_SignalService_proto_msgTypes[74] + mi := &file_SignalService_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7466,7 +7795,7 @@ func (x *SyncMessage_AttachmentBackfillRequest) String() string { func (*SyncMessage_AttachmentBackfillRequest) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillRequest) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[74] + mi := &file_SignalService_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7511,7 +7840,7 @@ type SyncMessage_AttachmentBackfillResponse struct { func (x *SyncMessage_AttachmentBackfillResponse) Reset() { *x = SyncMessage_AttachmentBackfillResponse{} - mi := &file_SignalService_proto_msgTypes[75] + mi := &file_SignalService_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7523,7 +7852,7 @@ func (x *SyncMessage_AttachmentBackfillResponse) String() string { func (*SyncMessage_AttachmentBackfillResponse) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[75] + mi := &file_SignalService_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7608,7 +7937,7 @@ type SyncMessage_Sent_UnidentifiedDeliveryStatus struct { func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) Reset() { *x = SyncMessage_Sent_UnidentifiedDeliveryStatus{} - mi := &file_SignalService_proto_msgTypes[76] + mi := &file_SignalService_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7620,7 +7949,7 @@ func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) String() string { func (*SyncMessage_Sent_UnidentifiedDeliveryStatus) ProtoMessage() {} func (x *SyncMessage_Sent_UnidentifiedDeliveryStatus) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[76] + mi := &file_SignalService_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7676,7 +8005,7 @@ type SyncMessage_Sent_StoryMessageRecipient struct { func (x *SyncMessage_Sent_StoryMessageRecipient) Reset() { *x = SyncMessage_Sent_StoryMessageRecipient{} - mi := &file_SignalService_proto_msgTypes[77] + mi := &file_SignalService_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7688,7 +8017,7 @@ func (x *SyncMessage_Sent_StoryMessageRecipient) String() string { func (*SyncMessage_Sent_StoryMessageRecipient) ProtoMessage() {} func (x *SyncMessage_Sent_StoryMessageRecipient) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[77] + mi := &file_SignalService_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7748,7 +8077,7 @@ type SyncMessage_OutgoingPayment_MobileCoin struct { func (x *SyncMessage_OutgoingPayment_MobileCoin) Reset() { *x = SyncMessage_OutgoingPayment_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[78] + mi := &file_SignalService_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7760,7 +8089,7 @@ func (x *SyncMessage_OutgoingPayment_MobileCoin) String() string { func (*SyncMessage_OutgoingPayment_MobileCoin) ProtoMessage() {} func (x *SyncMessage_OutgoingPayment_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[78] + mi := &file_SignalService_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7842,7 +8171,7 @@ type SyncMessage_DeleteForMe_MessageDeletes struct { func (x *SyncMessage_DeleteForMe_MessageDeletes) Reset() { *x = SyncMessage_DeleteForMe_MessageDeletes{} - mi := &file_SignalService_proto_msgTypes[79] + mi := &file_SignalService_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7854,7 +8183,7 @@ func (x *SyncMessage_DeleteForMe_MessageDeletes) String() string { func (*SyncMessage_DeleteForMe_MessageDeletes) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_MessageDeletes) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[79] + mi := &file_SignalService_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7900,7 +8229,7 @@ type SyncMessage_DeleteForMe_AttachmentDelete struct { func (x *SyncMessage_DeleteForMe_AttachmentDelete) Reset() { *x = SyncMessage_DeleteForMe_AttachmentDelete{} - mi := &file_SignalService_proto_msgTypes[80] + mi := &file_SignalService_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7912,7 +8241,7 @@ func (x *SyncMessage_DeleteForMe_AttachmentDelete) String() string { func (*SyncMessage_DeleteForMe_AttachmentDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_AttachmentDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[80] + mi := &file_SignalService_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7975,7 +8304,7 @@ type SyncMessage_DeleteForMe_ConversationDelete struct { func (x *SyncMessage_DeleteForMe_ConversationDelete) Reset() { *x = SyncMessage_DeleteForMe_ConversationDelete{} - mi := &file_SignalService_proto_msgTypes[81] + mi := &file_SignalService_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7987,7 +8316,7 @@ func (x *SyncMessage_DeleteForMe_ConversationDelete) String() string { func (*SyncMessage_DeleteForMe_ConversationDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_ConversationDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[81] + mi := &file_SignalService_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8040,7 +8369,7 @@ type SyncMessage_DeleteForMe_LocalOnlyConversationDelete struct { func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) Reset() { *x = SyncMessage_DeleteForMe_LocalOnlyConversationDelete{} - mi := &file_SignalService_proto_msgTypes[82] + mi := &file_SignalService_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8052,7 +8381,7 @@ func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) String() string { func (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete) ProtoMessage() {} func (x *SyncMessage_DeleteForMe_LocalOnlyConversationDelete) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[82] + mi := &file_SignalService_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8088,7 +8417,7 @@ type SyncMessage_AttachmentBackfillResponse_AttachmentData struct { func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) Reset() { *x = SyncMessage_AttachmentBackfillResponse_AttachmentData{} - mi := &file_SignalService_proto_msgTypes[83] + mi := &file_SignalService_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8100,7 +8429,7 @@ func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) String() string func (*SyncMessage_AttachmentBackfillResponse_AttachmentData) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse_AttachmentData) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[83] + mi := &file_SignalService_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8169,7 +8498,7 @@ type SyncMessage_AttachmentBackfillResponse_AttachmentDataList struct { func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) Reset() { *x = SyncMessage_AttachmentBackfillResponse_AttachmentDataList{} - mi := &file_SignalService_proto_msgTypes[84] + mi := &file_SignalService_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8181,7 +8510,7 @@ func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) String() str func (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList) ProtoMessage() {} func (x *SyncMessage_AttachmentBackfillResponse_AttachmentDataList) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[84] + mi := &file_SignalService_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8221,7 +8550,7 @@ type ContactDetails_Avatar struct { func (x *ContactDetails_Avatar) Reset() { *x = ContactDetails_Avatar{} - mi := &file_SignalService_proto_msgTypes[85] + mi := &file_SignalService_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8233,7 +8562,7 @@ func (x *ContactDetails_Avatar) String() string { func (*ContactDetails_Avatar) ProtoMessage() {} func (x *ContactDetails_Avatar) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[85] + mi := &file_SignalService_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8273,7 +8602,7 @@ type PaymentAddress_MobileCoin struct { func (x *PaymentAddress_MobileCoin) Reset() { *x = PaymentAddress_MobileCoin{} - mi := &file_SignalService_proto_msgTypes[86] + mi := &file_SignalService_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8285,7 +8614,7 @@ func (x *PaymentAddress_MobileCoin) String() string { func (*PaymentAddress_MobileCoin) ProtoMessage() {} func (x *PaymentAddress_MobileCoin) ProtoReflect() protoreflect.Message { - mi := &file_SignalService_proto_msgTypes[86] + mi := &file_SignalService_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8319,13 +8648,13 @@ var File_SignalService_proto protoreflect.FileDescriptor const file_SignalService_proto_rawDesc = "" + "\n" + - "\x13SignalService.proto\x12\rsignalservice\"\xf5\x06\n" + + "\x13SignalService.proto\x12\rsignalservice\"\x8c\a\n" + "\bEnvelope\x120\n" + "\x04type\x18\x01 \x01(\x0e2\x1c.signalservice.Envelope.TypeR\x04type\x12(\n" + - "\x0fsourceServiceId\x18\v \x01(\tR\x0fsourceServiceId\x12\"\n" + - "\fsourceDevice\x18\a \x01(\rR\fsourceDevice\x122\n" + - "\x14destinationServiceId\x18\r \x01(\tR\x14destinationServiceId\x12\x1c\n" + - "\ttimestamp\x18\x05 \x01(\x04R\ttimestamp\x12\x18\n" + + "\x0fsourceServiceId\x18\v \x01(\tR\x0fsourceServiceId\x12&\n" + + "\x0esourceDeviceId\x18\a \x01(\rR\x0esourceDeviceId\x122\n" + + "\x14destinationServiceId\x18\r \x01(\tR\x14destinationServiceId\x12(\n" + + "\x0fclientTimestamp\x18\x05 \x01(\x04R\x0fclientTimestamp\x12\x18\n" + "\acontent\x18\b \x01(\fR\acontent\x12\x1e\n" + "\n" + "serverGuid\x18\t \x01(\tR\n" + @@ -8342,29 +8671,28 @@ const file_SignalService_proto_rawDesc = "" + "\x15sourceServiceIdBinary\x18\x13 \x01(\fR\x15sourceServiceIdBinary\x12>\n" + "\x1adestinationServiceIdBinary\x18\x14 \x01(\fR\x1adestinationServiceIdBinary\x12*\n" + "\x10serverGuidBinary\x18\x15 \x01(\fR\x10serverGuidBinary\x12*\n" + - "\x10updatedPniBinary\x18\x16 \x01(\fR\x10updatedPniBinary\"\xae\x01\n" + + "\x10updatedPniBinary\x18\x16 \x01(\fR\x10updatedPniBinary\"\xb5\x01\n" + "\x04Type\x12\v\n" + - "\aUNKNOWN\x10\x00\x12\x0e\n" + - "\n" + - "CIPHERTEXT\x10\x01\x12\x11\n" + - "\rPREKEY_BUNDLE\x10\x03\x12\x1b\n" + + "\aUNKNOWN\x10\x00\x12\x12\n" + + "\x0eDOUBLE_RATCHET\x10\x01\x12\x12\n" + + "\x0ePREKEY_MESSAGE\x10\x03\x12\x1b\n" + "\x17SERVER_DELIVERY_RECEIPT\x10\x05\x12\x17\n" + "\x13UNIDENTIFIED_SENDER\x10\x06\x12\x15\n" + - "\x11SENDERKEY_MESSAGE\x10\a\x12\x15\n" + - "\x11PLAINTEXT_CONTENT\x10\b\"\x04\b\x02\x10\x02*\fKEY_EXCHANGEJ\x04\b\x02\x10\x03J\x04\b\x03\x10\x04J\x04\b\x06\x10\aJ\x04\b\x12\x10\x13\"\xdd\x05\n" + - "\aContent\x12<\n" + - "\vdataMessage\x18\x01 \x01(\v2\x1a.signalservice.DataMessageR\vdataMessage\x12<\n" + - "\vsyncMessage\x18\x02 \x01(\v2\x1a.signalservice.SyncMessageR\vsyncMessage\x12<\n" + - "\vcallMessage\x18\x03 \x01(\v2\x1a.signalservice.CallMessageR\vcallMessage\x12<\n" + - "\vnullMessage\x18\x04 \x01(\v2\x1a.signalservice.NullMessageR\vnullMessage\x12E\n" + - "\x0ereceiptMessage\x18\x05 \x01(\v2\x1d.signalservice.ReceiptMessageR\x0ereceiptMessage\x12B\n" + - "\rtypingMessage\x18\x06 \x01(\v2\x1c.signalservice.TypingMessageR\rtypingMessage\x12B\n" + - "\x1csenderKeyDistributionMessage\x18\a \x01(\fR\x1csenderKeyDistributionMessage\x126\n" + - "\x16decryptionErrorMessage\x18\b \x01(\fR\x16decryptionErrorMessage\x12?\n" + - "\fstoryMessage\x18\t \x01(\v2\x1b.signalservice.StoryMessageR\fstoryMessage\x12T\n" + + "\x11PLAINTEXT_CONTENT\x10\b\"\x04\b\x02\x10\x02\"\x04\b\a\x10\a*\fKEY_EXCHANGE*\x11SENDERKEY_MESSAGEJ\x04\b\x02\x10\x03J\x04\b\x03\x10\x04J\x04\b\x06\x10\aJ\x04\b\x12\x10\x13\"\xfa\x05\n" + + "\aContent\x12>\n" + + "\vdataMessage\x18\x01 \x01(\v2\x1a.signalservice.DataMessageH\x00R\vdataMessage\x12>\n" + + "\vsyncMessage\x18\x02 \x01(\v2\x1a.signalservice.SyncMessageH\x00R\vsyncMessage\x12>\n" + + "\vcallMessage\x18\x03 \x01(\v2\x1a.signalservice.CallMessageH\x00R\vcallMessage\x12>\n" + + "\vnullMessage\x18\x04 \x01(\v2\x1a.signalservice.NullMessageH\x00R\vnullMessage\x12G\n" + + "\x0ereceiptMessage\x18\x05 \x01(\v2\x1d.signalservice.ReceiptMessageH\x00R\x0ereceiptMessage\x12D\n" + + "\rtypingMessage\x18\x06 \x01(\v2\x1c.signalservice.TypingMessageH\x00R\rtypingMessage\x128\n" + + "\x16decryptionErrorMessage\x18\b \x01(\fH\x00R\x16decryptionErrorMessage\x12A\n" + + "\fstoryMessage\x18\t \x01(\v2\x1b.signalservice.StoryMessageH\x00R\fstoryMessage\x12>\n" + + "\veditMessage\x18\v \x01(\v2\x1a.signalservice.EditMessageH\x00R\veditMessage\x12B\n" + + "\x1csenderKeyDistributionMessage\x18\a \x01(\fR\x1csenderKeyDistributionMessage\x12T\n" + "\x13pniSignatureMessage\x18\n" + - " \x01(\v2\".signalservice.PniSignatureMessageR\x13pniSignatureMessage\x12<\n" + - "\veditMessage\x18\v \x01(\v2\x1a.signalservice.EditMessageR\veditMessage\"\xf2\b\n" + + " \x01(\v2\".signalservice.PniSignatureMessageR\x13pniSignatureMessageB\t\n" + + "\acontent\"\xf2\b\n" + "\vCallMessage\x126\n" + "\x05offer\x18\x01 \x01(\v2 .signalservice.CallMessage.OfferR\x05offer\x129\n" + "\x06answer\x18\x02 \x01(\v2!.signalservice.CallMessage.AnswerR\x06answer\x12B\n" + @@ -8404,7 +8732,7 @@ const file_SignalService_proto_rawDesc = "" + "\aurgency\x18\x02 \x01(\x0e2).signalservice.CallMessage.Opaque.UrgencyR\aurgency\"0\n" + "\aUrgency\x12\r\n" + "\tDROPPABLE\x10\x00\x12\x16\n" + - "\x12HANDLE_IMMEDIATELY\x10\x01J\x04\b\x04\x10\x05J\x04\b\x06\x10\aJ\x04\b\b\x10\t\"\xca,\n" + + "\x12HANDLE_IMMEDIATELY\x10\x01J\x04\b\x04\x10\x05J\x04\b\x06\x10\aJ\x04\b\b\x10\t\"\x8b.\n" + "\vDataMessage\x12\x12\n" + "\x04body\x18\x01 \x01(\tR\x04body\x12B\n" + "\vattachments\x18\x02 \x03(\v2 .signalservice.AttachmentPointerR\vattachments\x127\n" + @@ -8442,7 +8770,8 @@ const file_SignalService_proto_rawDesc = "" + "\n" + "pinMessage\x18\x1b \x01(\v2%.signalservice.DataMessage.PinMessageR\n" + "pinMessage\x12K\n" + - "\funpinMessage\x18\x1c \x01(\v2'.signalservice.DataMessage.UnpinMessageR\funpinMessage\x1a\x9a\x05\n" + + "\funpinMessage\x18\x1c \x01(\v2'.signalservice.DataMessage.UnpinMessageR\funpinMessage\x12H\n" + + "\vadminDelete\x18\x1d \x01(\v2&.signalservice.DataMessage.AdminDeleteR\vadminDelete\x1a\x9a\x05\n" + "\aPayment\x12U\n" + "\fnotification\x18\x01 \x01(\v2/.signalservice.DataMessage.Payment.NotificationH\x00R\fnotification\x12O\n" + "\n" + @@ -8594,6 +8923,9 @@ const file_SignalService_proto_rawDesc = "" + "\vpinDuration\x1av\n" + "\fUnpinMessage\x124\n" + "\x15targetAuthorAciBinary\x18\x01 \x01(\fR\x15targetAuthorAciBinary\x120\n" + + "\x13targetSentTimestamp\x18\x02 \x01(\x04R\x13targetSentTimestamp\x1au\n" + + "\vAdminDelete\x124\n" + + "\x15targetAuthorAciBinary\x18\x01 \x01(\fR\x15targetAuthorAciBinary\x120\n" + "\x13targetSentTimestamp\x18\x02 \x01(\x04R\x13targetSentTimestamp\"Z\n" + "\x05Flags\x12\x0f\n" + "\vEND_SESSION\x10\x01\x12\x1b\n" + @@ -8683,32 +9015,32 @@ const file_SignalService_proto_rawDesc = "" + "\aDEFAULT\x10\x00\x12\f\n" + "\bVERIFIED\x10\x01\x12\x0e\n" + "\n" + - "UNVERIFIED\x10\x02J\x04\b\x01\x10\x02\"\x8fG\n" + - "\vSyncMessage\x123\n" + - "\x04sent\x18\x01 \x01(\v2\x1f.signalservice.SyncMessage.SentR\x04sent\x12?\n" + - "\bcontacts\x18\x02 \x01(\v2#.signalservice.SyncMessage.ContactsR\bcontacts\x12<\n" + - "\arequest\x18\x04 \x01(\v2\".signalservice.SyncMessage.RequestR\arequest\x123\n" + - "\x04read\x18\x05 \x03(\v2\x1f.signalservice.SyncMessage.ReadR\x04read\x12<\n" + - "\ablocked\x18\x06 \x01(\v2\".signalservice.SyncMessage.BlockedR\ablocked\x123\n" + - "\bverified\x18\a \x01(\v2\x17.signalservice.VerifiedR\bverified\x12N\n" + - "\rconfiguration\x18\t \x01(\v2(.signalservice.SyncMessage.ConfigurationR\rconfiguration\x12\x18\n" + - "\apadding\x18\b \x01(\fR\apadding\x12c\n" + + "UNVERIFIED\x10\x02J\x04\b\x01\x10\x02\"\xf1F\n" + + "\vSyncMessage\x125\n" + + "\x04sent\x18\x01 \x01(\v2\x1f.signalservice.SyncMessage.SentH\x00R\x04sent\x12A\n" + + "\bcontacts\x18\x02 \x01(\v2#.signalservice.SyncMessage.ContactsH\x00R\bcontacts\x12>\n" + + "\arequest\x18\x04 \x01(\v2\".signalservice.SyncMessage.RequestH\x00R\arequest\x12>\n" + + "\ablocked\x18\x06 \x01(\v2\".signalservice.SyncMessage.BlockedH\x00R\ablocked\x125\n" + + "\bverified\x18\a \x01(\v2\x17.signalservice.VerifiedH\x00R\bverified\x12P\n" + + "\rconfiguration\x18\t \x01(\v2(.signalservice.SyncMessage.ConfigurationH\x00R\rconfiguration\x12M\n" + + "\fviewOnceOpen\x18\v \x01(\v2'.signalservice.SyncMessage.ViewOnceOpenH\x00R\fviewOnceOpen\x12J\n" + + "\vfetchLatest\x18\f \x01(\v2&.signalservice.SyncMessage.FetchLatestH\x00R\vfetchLatest\x125\n" + + "\x04keys\x18\r \x01(\v2\x1f.signalservice.SyncMessage.KeysH\x00R\x04keys\x12k\n" + + "\x16messageRequestResponse\x18\x0e \x01(\v21.signalservice.SyncMessage.MessageRequestResponseH\x00R\x16messageRequestResponse\x12V\n" + + "\x0foutgoingPayment\x18\x0f \x01(\v2*.signalservice.SyncMessage.OutgoingPaymentH\x00R\x0foutgoingPayment\x12V\n" + + "\x0fpniChangeNumber\x18\x12 \x01(\v2*.signalservice.SyncMessage.PniChangeNumberH\x00R\x0fpniChangeNumber\x12D\n" + + "\tcallEvent\x18\x13 \x01(\v2$.signalservice.SyncMessage.CallEventH\x00R\tcallEvent\x12S\n" + + "\x0ecallLinkUpdate\x18\x14 \x01(\v2).signalservice.SyncMessage.CallLinkUpdateH\x00R\x0ecallLinkUpdate\x12M\n" + + "\fcallLogEvent\x18\x15 \x01(\v2'.signalservice.SyncMessage.CallLogEventH\x00R\fcallLogEvent\x12J\n" + + "\vdeleteForMe\x18\x16 \x01(\v2&.signalservice.SyncMessage.DeleteForMeH\x00R\vdeleteForMe\x12Y\n" + + "\x10deviceNameChange\x18\x17 \x01(\v2+.signalservice.SyncMessage.DeviceNameChangeH\x00R\x10deviceNameChange\x12t\n" + + "\x19attachmentBackfillRequest\x18\x18 \x01(\v24.signalservice.SyncMessage.AttachmentBackfillRequestH\x00R\x19attachmentBackfillRequest\x12w\n" + + "\x1aattachmentBackfillResponse\x18\x19 \x01(\v25.signalservice.SyncMessage.AttachmentBackfillResponseH\x00R\x1aattachmentBackfillResponse\x123\n" + + "\x04read\x18\x05 \x03(\v2\x1f.signalservice.SyncMessage.ReadR\x04read\x12c\n" + "\x14stickerPackOperation\x18\n" + - " \x03(\v2/.signalservice.SyncMessage.StickerPackOperationR\x14stickerPackOperation\x12K\n" + - "\fviewOnceOpen\x18\v \x01(\v2'.signalservice.SyncMessage.ViewOnceOpenR\fviewOnceOpen\x12H\n" + - "\vfetchLatest\x18\f \x01(\v2&.signalservice.SyncMessage.FetchLatestR\vfetchLatest\x123\n" + - "\x04keys\x18\r \x01(\v2\x1f.signalservice.SyncMessage.KeysR\x04keys\x12i\n" + - "\x16messageRequestResponse\x18\x0e \x01(\v21.signalservice.SyncMessage.MessageRequestResponseR\x16messageRequestResponse\x12T\n" + - "\x0foutgoingPayment\x18\x0f \x01(\v2*.signalservice.SyncMessage.OutgoingPaymentR\x0foutgoingPayment\x129\n" + - "\x06viewed\x18\x10 \x03(\v2!.signalservice.SyncMessage.ViewedR\x06viewed\x12T\n" + - "\x0fpniChangeNumber\x18\x12 \x01(\v2*.signalservice.SyncMessage.PniChangeNumberR\x0fpniChangeNumber\x12B\n" + - "\tcallEvent\x18\x13 \x01(\v2$.signalservice.SyncMessage.CallEventR\tcallEvent\x12Q\n" + - "\x0ecallLinkUpdate\x18\x14 \x01(\v2).signalservice.SyncMessage.CallLinkUpdateR\x0ecallLinkUpdate\x12K\n" + - "\fcallLogEvent\x18\x15 \x01(\v2'.signalservice.SyncMessage.CallLogEventR\fcallLogEvent\x12H\n" + - "\vdeleteForMe\x18\x16 \x01(\v2&.signalservice.SyncMessage.DeleteForMeR\vdeleteForMe\x12W\n" + - "\x10deviceNameChange\x18\x17 \x01(\v2+.signalservice.SyncMessage.DeviceNameChangeR\x10deviceNameChange\x12r\n" + - "\x19attachmentBackfillRequest\x18\x18 \x01(\v24.signalservice.SyncMessage.AttachmentBackfillRequestR\x19attachmentBackfillRequest\x12u\n" + - "\x1aattachmentBackfillResponse\x18\x19 \x01(\v25.signalservice.SyncMessage.AttachmentBackfillResponseR\x1aattachmentBackfillResponse\x1a\xbc\t\n" + + " \x03(\v2/.signalservice.SyncMessage.StickerPackOperationR\x14stickerPackOperation\x129\n" + + "\x06viewed\x18\x10 \x03(\v2!.signalservice.SyncMessage.ViewedR\x06viewed\x12\x18\n" + + "\apadding\x18\b \x01(\fR\apadding\x1a\xbc\t\n" + "\x04Sent\x12(\n" + "\x0fdestinationE164\x18\x01 \x01(\tR\x0fdestinationE164\x122\n" + "\x14destinationServiceId\x18\a \x01(\tR\x14destinationServiceId\x12\x1c\n" + @@ -8757,13 +9089,12 @@ const file_SignalService_proto_rawDesc = "" + "\x06Viewed\x12\x1c\n" + "\tsenderAci\x18\x03 \x01(\tR\tsenderAci\x12\x1c\n" + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\x12(\n" + - "\x0fsenderAciBinary\x18\x04 \x01(\fR\x0fsenderAciBinaryJ\x04\b\x01\x10\x02\x1a\x83\x02\n" + + "\x0fsenderAciBinary\x18\x04 \x01(\fR\x0fsenderAciBinaryJ\x04\b\x01\x10\x02\x1a\xd7\x01\n" + "\rConfiguration\x12\"\n" + "\freadReceipts\x18\x01 \x01(\bR\freadReceipts\x12F\n" + "\x1eunidentifiedDeliveryIndicators\x18\x02 \x01(\bR\x1eunidentifiedDeliveryIndicators\x12*\n" + - "\x10typingIndicators\x18\x03 \x01(\bR\x10typingIndicators\x120\n" + - "\x13provisioningVersion\x18\x05 \x01(\rR\x13provisioningVersion\x12\"\n" + - "\flinkPreviews\x18\x06 \x01(\bR\flinkPreviewsJ\x04\b\x04\x10\x05\x1a\xb3\x01\n" + + "\x10typingIndicators\x18\x03 \x01(\bR\x10typingIndicators\x12\"\n" + + "\flinkPreviews\x18\x06 \x01(\bR\flinkPreviewsJ\x04\b\x04\x10\x05J\x04\b\x05\x10\x06\x1a\xb3\x01\n" + "\x14StickerPackOperation\x12\x16\n" + "\x06packId\x18\x01 \x01(\fR\x06packId\x12\x18\n" + "\apackKey\x18\x02 \x01(\fR\apackKey\x12H\n" + @@ -8782,11 +9113,10 @@ const file_SignalService_proto_rawDesc = "" + "\aUNKNOWN\x10\x00\x12\x11\n" + "\rLOCAL_PROFILE\x10\x01\x12\x14\n" + "\x10STORAGE_MANIFEST\x10\x02\x12\x17\n" + - "\x13SUBSCRIPTION_STATUS\x10\x03\x1a\x84\x01\n" + - "\x04Keys\x12\x16\n" + - "\x06master\x18\x02 \x01(\fR\x06master\x12.\n" + + "\x13SUBSCRIPTION_STATUS\x10\x03\x1ar\n" + + "\x04Keys\x12.\n" + "\x12accountEntropyPool\x18\x03 \x01(\tR\x12accountEntropyPool\x12.\n" + - "\x12mediaRootBackupKey\x18\x04 \x01(\fR\x12mediaRootBackupKeyJ\x04\b\x01\x10\x02\x1aK\n" + + "\x12mediaRootBackupKey\x18\x04 \x01(\fR\x12mediaRootBackupKeyJ\x04\b\x01\x10\x02J\x04\b\x02\x10\x03\x1aK\n" + "\vPniIdentity\x12\x1c\n" + "\tpublicKey\x18\x01 \x01(\fR\tpublicKey\x12\x1e\n" + "\n" + @@ -8858,15 +9188,14 @@ const file_SignalService_proto_rawDesc = "" + "\fNOT_ACCEPTED\x10\x02\x12\n" + "\n" + "\x06DELETE\x10\x03\x12\f\n" + - "\bOBSERVED\x10\x04\x1a\xc2\x01\n" + + "\bOBSERVED\x10\x04\x1a\xb2\x01\n" + "\x0eCallLinkUpdate\x12\x18\n" + "\arootKey\x18\x01 \x01(\fR\arootKey\x12\"\n" + "\fadminPasskey\x18\x02 \x01(\fR\fadminPasskey\x12B\n" + - "\x04type\x18\x03 \x01(\x0e2..signalservice.SyncMessage.CallLinkUpdate.TypeR\x04type\x12\x14\n" + - "\x05epoch\x18\x04 \x01(\fR\x05epoch\"\x18\n" + + "\x04type\x18\x03 \x01(\x0e2..signalservice.SyncMessage.CallLinkUpdate.TypeR\x04type\"\x18\n" + "\x04Type\x12\n" + "\n" + - "\x06UPDATE\x10\x00\"\x04\b\x01\x10\x01\x1a\x94\x02\n" + + "\x06UPDATE\x10\x00\"\x04\b\x01\x10\x01J\x04\b\x04\x10\x05\x1a\x94\x02\n" + "\fCallLogEvent\x12@\n" + "\x04type\x18\x01 \x01(\x0e2,.signalservice.SyncMessage.CallLogEvent.TypeR\x04type\x12\x1c\n" + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\x12&\n" + @@ -8925,7 +9254,8 @@ const file_SignalService_proto_rawDesc = "" + "\blongText\x18\x02 \x01(\v2D.signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataR\blongText\"\x1e\n" + "\x05Error\x12\x15\n" + "\x11MESSAGE_NOT_FOUND\x10\x00B\x06\n" + - "\x04dataJ\x04\b\x03\x10\x04J\x04\b\x11\x10\x12\"\xe7\x04\n" + + "\x04dataB\t\n" + + "\acontentJ\x04\b\x03\x10\x04J\x04\b\x11\x10\x12\"\xe7\x04\n" + "\x11AttachmentPointer\x12\x16\n" + "\x05cdnId\x18\x01 \x01(\x06H\x00R\x05cdnId\x12\x18\n" + "\x06cdnKey\x18\x0f \x01(\tH\x00R\x06cdnKey\x12\x1e\n" + @@ -9041,7 +9371,7 @@ func file_SignalService_proto_rawDescGZIP() []byte { } var file_SignalService_proto_enumTypes = make([]protoimpl.EnumInfo, 28) -var file_SignalService_proto_msgTypes = make([]protoimpl.MessageInfo, 87) +var file_SignalService_proto_msgTypes = make([]protoimpl.MessageInfo, 88) var file_SignalService_proto_goTypes = []any{ (Envelope_Type)(0), // 0: signalservice.Envelope.Type (CallMessage_Offer_Type)(0), // 1: signalservice.CallMessage.Offer.Type @@ -9113,51 +9443,52 @@ var file_SignalService_proto_goTypes = []any{ (*DataMessage_PollVote)(nil), // 67: signalservice.DataMessage.PollVote (*DataMessage_PinMessage)(nil), // 68: signalservice.DataMessage.PinMessage (*DataMessage_UnpinMessage)(nil), // 69: signalservice.DataMessage.UnpinMessage - (*DataMessage_Payment_Amount)(nil), // 70: signalservice.DataMessage.Payment.Amount - (*DataMessage_Payment_Notification)(nil), // 71: signalservice.DataMessage.Payment.Notification - (*DataMessage_Payment_Activation)(nil), // 72: signalservice.DataMessage.Payment.Activation - (*DataMessage_Payment_Amount_MobileCoin)(nil), // 73: signalservice.DataMessage.Payment.Amount.MobileCoin - (*DataMessage_Payment_Notification_MobileCoin)(nil), // 74: signalservice.DataMessage.Payment.Notification.MobileCoin - (*DataMessage_Quote_QuotedAttachment)(nil), // 75: signalservice.DataMessage.Quote.QuotedAttachment - (*DataMessage_Contact_Name)(nil), // 76: signalservice.DataMessage.Contact.Name - (*DataMessage_Contact_Phone)(nil), // 77: signalservice.DataMessage.Contact.Phone - (*DataMessage_Contact_Email)(nil), // 78: signalservice.DataMessage.Contact.Email - (*DataMessage_Contact_PostalAddress)(nil), // 79: signalservice.DataMessage.Contact.PostalAddress - (*DataMessage_Contact_Avatar)(nil), // 80: signalservice.DataMessage.Contact.Avatar - (*TextAttachment_Gradient)(nil), // 81: signalservice.TextAttachment.Gradient - (*SyncMessage_Sent)(nil), // 82: signalservice.SyncMessage.Sent - (*SyncMessage_Contacts)(nil), // 83: signalservice.SyncMessage.Contacts - (*SyncMessage_Blocked)(nil), // 84: signalservice.SyncMessage.Blocked - (*SyncMessage_Request)(nil), // 85: signalservice.SyncMessage.Request - (*SyncMessage_Read)(nil), // 86: signalservice.SyncMessage.Read - (*SyncMessage_Viewed)(nil), // 87: signalservice.SyncMessage.Viewed - (*SyncMessage_Configuration)(nil), // 88: signalservice.SyncMessage.Configuration - (*SyncMessage_StickerPackOperation)(nil), // 89: signalservice.SyncMessage.StickerPackOperation - (*SyncMessage_ViewOnceOpen)(nil), // 90: signalservice.SyncMessage.ViewOnceOpen - (*SyncMessage_FetchLatest)(nil), // 91: signalservice.SyncMessage.FetchLatest - (*SyncMessage_Keys)(nil), // 92: signalservice.SyncMessage.Keys - (*SyncMessage_PniIdentity)(nil), // 93: signalservice.SyncMessage.PniIdentity - (*SyncMessage_MessageRequestResponse)(nil), // 94: signalservice.SyncMessage.MessageRequestResponse - (*SyncMessage_OutgoingPayment)(nil), // 95: signalservice.SyncMessage.OutgoingPayment - (*SyncMessage_PniChangeNumber)(nil), // 96: signalservice.SyncMessage.PniChangeNumber - (*SyncMessage_CallEvent)(nil), // 97: signalservice.SyncMessage.CallEvent - (*SyncMessage_CallLinkUpdate)(nil), // 98: signalservice.SyncMessage.CallLinkUpdate - (*SyncMessage_CallLogEvent)(nil), // 99: signalservice.SyncMessage.CallLogEvent - (*SyncMessage_DeleteForMe)(nil), // 100: signalservice.SyncMessage.DeleteForMe - (*SyncMessage_DeviceNameChange)(nil), // 101: signalservice.SyncMessage.DeviceNameChange - (*SyncMessage_AttachmentBackfillRequest)(nil), // 102: signalservice.SyncMessage.AttachmentBackfillRequest - (*SyncMessage_AttachmentBackfillResponse)(nil), // 103: signalservice.SyncMessage.AttachmentBackfillResponse - (*SyncMessage_Sent_UnidentifiedDeliveryStatus)(nil), // 104: signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus - (*SyncMessage_Sent_StoryMessageRecipient)(nil), // 105: signalservice.SyncMessage.Sent.StoryMessageRecipient - (*SyncMessage_OutgoingPayment_MobileCoin)(nil), // 106: signalservice.SyncMessage.OutgoingPayment.MobileCoin - (*SyncMessage_DeleteForMe_MessageDeletes)(nil), // 107: signalservice.SyncMessage.DeleteForMe.MessageDeletes - (*SyncMessage_DeleteForMe_AttachmentDelete)(nil), // 108: signalservice.SyncMessage.DeleteForMe.AttachmentDelete - (*SyncMessage_DeleteForMe_ConversationDelete)(nil), // 109: signalservice.SyncMessage.DeleteForMe.ConversationDelete - (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete)(nil), // 110: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete - (*SyncMessage_AttachmentBackfillResponse_AttachmentData)(nil), // 111: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList)(nil), // 112: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList - (*ContactDetails_Avatar)(nil), // 113: signalservice.ContactDetails.Avatar - (*PaymentAddress_MobileCoin)(nil), // 114: signalservice.PaymentAddress.MobileCoin + (*DataMessage_AdminDelete)(nil), // 70: signalservice.DataMessage.AdminDelete + (*DataMessage_Payment_Amount)(nil), // 71: signalservice.DataMessage.Payment.Amount + (*DataMessage_Payment_Notification)(nil), // 72: signalservice.DataMessage.Payment.Notification + (*DataMessage_Payment_Activation)(nil), // 73: signalservice.DataMessage.Payment.Activation + (*DataMessage_Payment_Amount_MobileCoin)(nil), // 74: signalservice.DataMessage.Payment.Amount.MobileCoin + (*DataMessage_Payment_Notification_MobileCoin)(nil), // 75: signalservice.DataMessage.Payment.Notification.MobileCoin + (*DataMessage_Quote_QuotedAttachment)(nil), // 76: signalservice.DataMessage.Quote.QuotedAttachment + (*DataMessage_Contact_Name)(nil), // 77: signalservice.DataMessage.Contact.Name + (*DataMessage_Contact_Phone)(nil), // 78: signalservice.DataMessage.Contact.Phone + (*DataMessage_Contact_Email)(nil), // 79: signalservice.DataMessage.Contact.Email + (*DataMessage_Contact_PostalAddress)(nil), // 80: signalservice.DataMessage.Contact.PostalAddress + (*DataMessage_Contact_Avatar)(nil), // 81: signalservice.DataMessage.Contact.Avatar + (*TextAttachment_Gradient)(nil), // 82: signalservice.TextAttachment.Gradient + (*SyncMessage_Sent)(nil), // 83: signalservice.SyncMessage.Sent + (*SyncMessage_Contacts)(nil), // 84: signalservice.SyncMessage.Contacts + (*SyncMessage_Blocked)(nil), // 85: signalservice.SyncMessage.Blocked + (*SyncMessage_Request)(nil), // 86: signalservice.SyncMessage.Request + (*SyncMessage_Read)(nil), // 87: signalservice.SyncMessage.Read + (*SyncMessage_Viewed)(nil), // 88: signalservice.SyncMessage.Viewed + (*SyncMessage_Configuration)(nil), // 89: signalservice.SyncMessage.Configuration + (*SyncMessage_StickerPackOperation)(nil), // 90: signalservice.SyncMessage.StickerPackOperation + (*SyncMessage_ViewOnceOpen)(nil), // 91: signalservice.SyncMessage.ViewOnceOpen + (*SyncMessage_FetchLatest)(nil), // 92: signalservice.SyncMessage.FetchLatest + (*SyncMessage_Keys)(nil), // 93: signalservice.SyncMessage.Keys + (*SyncMessage_PniIdentity)(nil), // 94: signalservice.SyncMessage.PniIdentity + (*SyncMessage_MessageRequestResponse)(nil), // 95: signalservice.SyncMessage.MessageRequestResponse + (*SyncMessage_OutgoingPayment)(nil), // 96: signalservice.SyncMessage.OutgoingPayment + (*SyncMessage_PniChangeNumber)(nil), // 97: signalservice.SyncMessage.PniChangeNumber + (*SyncMessage_CallEvent)(nil), // 98: signalservice.SyncMessage.CallEvent + (*SyncMessage_CallLinkUpdate)(nil), // 99: signalservice.SyncMessage.CallLinkUpdate + (*SyncMessage_CallLogEvent)(nil), // 100: signalservice.SyncMessage.CallLogEvent + (*SyncMessage_DeleteForMe)(nil), // 101: signalservice.SyncMessage.DeleteForMe + (*SyncMessage_DeviceNameChange)(nil), // 102: signalservice.SyncMessage.DeviceNameChange + (*SyncMessage_AttachmentBackfillRequest)(nil), // 103: signalservice.SyncMessage.AttachmentBackfillRequest + (*SyncMessage_AttachmentBackfillResponse)(nil), // 104: signalservice.SyncMessage.AttachmentBackfillResponse + (*SyncMessage_Sent_UnidentifiedDeliveryStatus)(nil), // 105: signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus + (*SyncMessage_Sent_StoryMessageRecipient)(nil), // 106: signalservice.SyncMessage.Sent.StoryMessageRecipient + (*SyncMessage_OutgoingPayment_MobileCoin)(nil), // 107: signalservice.SyncMessage.OutgoingPayment.MobileCoin + (*SyncMessage_DeleteForMe_MessageDeletes)(nil), // 108: signalservice.SyncMessage.DeleteForMe.MessageDeletes + (*SyncMessage_DeleteForMe_AttachmentDelete)(nil), // 109: signalservice.SyncMessage.DeleteForMe.AttachmentDelete + (*SyncMessage_DeleteForMe_ConversationDelete)(nil), // 110: signalservice.SyncMessage.DeleteForMe.ConversationDelete + (*SyncMessage_DeleteForMe_LocalOnlyConversationDelete)(nil), // 111: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete + (*SyncMessage_AttachmentBackfillResponse_AttachmentData)(nil), // 112: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + (*SyncMessage_AttachmentBackfillResponse_AttachmentDataList)(nil), // 113: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList + (*ContactDetails_Avatar)(nil), // 114: signalservice.ContactDetails.Avatar + (*PaymentAddress_MobileCoin)(nil), // 115: signalservice.PaymentAddress.MobileCoin } var file_SignalService_proto_depIdxs = []int32{ 0, // 0: signalservice.Envelope.type:type_name -> signalservice.Envelope.Type @@ -9168,8 +9499,8 @@ var file_SignalService_proto_depIdxs = []int32{ 33, // 5: signalservice.Content.receiptMessage:type_name -> signalservice.ReceiptMessage 34, // 6: signalservice.Content.typingMessage:type_name -> signalservice.TypingMessage 35, // 7: signalservice.Content.storyMessage:type_name -> signalservice.StoryMessage - 45, // 8: signalservice.Content.pniSignatureMessage:type_name -> signalservice.PniSignatureMessage - 46, // 9: signalservice.Content.editMessage:type_name -> signalservice.EditMessage + 46, // 8: signalservice.Content.editMessage:type_name -> signalservice.EditMessage + 45, // 9: signalservice.Content.pniSignatureMessage:type_name -> signalservice.PniSignatureMessage 50, // 10: signalservice.CallMessage.offer:type_name -> signalservice.CallMessage.Offer 51, // 11: signalservice.CallMessage.answer:type_name -> signalservice.CallMessage.Answer 52, // 12: signalservice.CallMessage.iceUpdate:type_name -> signalservice.CallMessage.IceUpdate @@ -9194,108 +9525,109 @@ var file_SignalService_proto_depIdxs = []int32{ 67, // 31: signalservice.DataMessage.pollVote:type_name -> signalservice.DataMessage.PollVote 68, // 32: signalservice.DataMessage.pinMessage:type_name -> signalservice.DataMessage.PinMessage 69, // 33: signalservice.DataMessage.unpinMessage:type_name -> signalservice.DataMessage.UnpinMessage - 11, // 34: signalservice.ReceiptMessage.type:type_name -> signalservice.ReceiptMessage.Type - 12, // 35: signalservice.TypingMessage.action:type_name -> signalservice.TypingMessage.Action - 41, // 36: signalservice.StoryMessage.group:type_name -> signalservice.GroupContextV2 - 40, // 37: signalservice.StoryMessage.fileAttachment:type_name -> signalservice.AttachmentPointer - 37, // 38: signalservice.StoryMessage.textAttachment:type_name -> signalservice.TextAttachment - 47, // 39: signalservice.StoryMessage.bodyRanges:type_name -> signalservice.BodyRange - 40, // 40: signalservice.Preview.image:type_name -> signalservice.AttachmentPointer - 13, // 41: signalservice.TextAttachment.textStyle:type_name -> signalservice.TextAttachment.Style - 36, // 42: signalservice.TextAttachment.preview:type_name -> signalservice.Preview - 81, // 43: signalservice.TextAttachment.gradient:type_name -> signalservice.TextAttachment.Gradient - 14, // 44: signalservice.Verified.state:type_name -> signalservice.Verified.State - 82, // 45: signalservice.SyncMessage.sent:type_name -> signalservice.SyncMessage.Sent - 83, // 46: signalservice.SyncMessage.contacts:type_name -> signalservice.SyncMessage.Contacts - 85, // 47: signalservice.SyncMessage.request:type_name -> signalservice.SyncMessage.Request - 86, // 48: signalservice.SyncMessage.read:type_name -> signalservice.SyncMessage.Read - 84, // 49: signalservice.SyncMessage.blocked:type_name -> signalservice.SyncMessage.Blocked + 70, // 34: signalservice.DataMessage.adminDelete:type_name -> signalservice.DataMessage.AdminDelete + 11, // 35: signalservice.ReceiptMessage.type:type_name -> signalservice.ReceiptMessage.Type + 12, // 36: signalservice.TypingMessage.action:type_name -> signalservice.TypingMessage.Action + 41, // 37: signalservice.StoryMessage.group:type_name -> signalservice.GroupContextV2 + 40, // 38: signalservice.StoryMessage.fileAttachment:type_name -> signalservice.AttachmentPointer + 37, // 39: signalservice.StoryMessage.textAttachment:type_name -> signalservice.TextAttachment + 47, // 40: signalservice.StoryMessage.bodyRanges:type_name -> signalservice.BodyRange + 40, // 41: signalservice.Preview.image:type_name -> signalservice.AttachmentPointer + 13, // 42: signalservice.TextAttachment.textStyle:type_name -> signalservice.TextAttachment.Style + 36, // 43: signalservice.TextAttachment.preview:type_name -> signalservice.Preview + 82, // 44: signalservice.TextAttachment.gradient:type_name -> signalservice.TextAttachment.Gradient + 14, // 45: signalservice.Verified.state:type_name -> signalservice.Verified.State + 83, // 46: signalservice.SyncMessage.sent:type_name -> signalservice.SyncMessage.Sent + 84, // 47: signalservice.SyncMessage.contacts:type_name -> signalservice.SyncMessage.Contacts + 86, // 48: signalservice.SyncMessage.request:type_name -> signalservice.SyncMessage.Request + 85, // 49: signalservice.SyncMessage.blocked:type_name -> signalservice.SyncMessage.Blocked 38, // 50: signalservice.SyncMessage.verified:type_name -> signalservice.Verified - 88, // 51: signalservice.SyncMessage.configuration:type_name -> signalservice.SyncMessage.Configuration - 89, // 52: signalservice.SyncMessage.stickerPackOperation:type_name -> signalservice.SyncMessage.StickerPackOperation - 90, // 53: signalservice.SyncMessage.viewOnceOpen:type_name -> signalservice.SyncMessage.ViewOnceOpen - 91, // 54: signalservice.SyncMessage.fetchLatest:type_name -> signalservice.SyncMessage.FetchLatest - 92, // 55: signalservice.SyncMessage.keys:type_name -> signalservice.SyncMessage.Keys - 94, // 56: signalservice.SyncMessage.messageRequestResponse:type_name -> signalservice.SyncMessage.MessageRequestResponse - 95, // 57: signalservice.SyncMessage.outgoingPayment:type_name -> signalservice.SyncMessage.OutgoingPayment - 87, // 58: signalservice.SyncMessage.viewed:type_name -> signalservice.SyncMessage.Viewed - 96, // 59: signalservice.SyncMessage.pniChangeNumber:type_name -> signalservice.SyncMessage.PniChangeNumber - 97, // 60: signalservice.SyncMessage.callEvent:type_name -> signalservice.SyncMessage.CallEvent - 98, // 61: signalservice.SyncMessage.callLinkUpdate:type_name -> signalservice.SyncMessage.CallLinkUpdate - 99, // 62: signalservice.SyncMessage.callLogEvent:type_name -> signalservice.SyncMessage.CallLogEvent - 100, // 63: signalservice.SyncMessage.deleteForMe:type_name -> signalservice.SyncMessage.DeleteForMe - 101, // 64: signalservice.SyncMessage.deviceNameChange:type_name -> signalservice.SyncMessage.DeviceNameChange - 102, // 65: signalservice.SyncMessage.attachmentBackfillRequest:type_name -> signalservice.SyncMessage.AttachmentBackfillRequest - 103, // 66: signalservice.SyncMessage.attachmentBackfillResponse:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse - 113, // 67: signalservice.ContactDetails.avatar:type_name -> signalservice.ContactDetails.Avatar - 114, // 68: signalservice.PaymentAddress.mobileCoin:type_name -> signalservice.PaymentAddress.MobileCoin - 31, // 69: signalservice.EditMessage.dataMessage:type_name -> signalservice.DataMessage - 27, // 70: signalservice.BodyRange.style:type_name -> signalservice.BodyRange.Style - 1, // 71: signalservice.CallMessage.Offer.type:type_name -> signalservice.CallMessage.Offer.Type - 2, // 72: signalservice.CallMessage.Hangup.type:type_name -> signalservice.CallMessage.Hangup.Type - 3, // 73: signalservice.CallMessage.Opaque.urgency:type_name -> signalservice.CallMessage.Opaque.Urgency - 71, // 74: signalservice.DataMessage.Payment.notification:type_name -> signalservice.DataMessage.Payment.Notification - 72, // 75: signalservice.DataMessage.Payment.activation:type_name -> signalservice.DataMessage.Payment.Activation - 75, // 76: signalservice.DataMessage.Quote.attachments:type_name -> signalservice.DataMessage.Quote.QuotedAttachment - 47, // 77: signalservice.DataMessage.Quote.bodyRanges:type_name -> signalservice.BodyRange - 7, // 78: signalservice.DataMessage.Quote.type:type_name -> signalservice.DataMessage.Quote.Type - 76, // 79: signalservice.DataMessage.Contact.name:type_name -> signalservice.DataMessage.Contact.Name - 77, // 80: signalservice.DataMessage.Contact.number:type_name -> signalservice.DataMessage.Contact.Phone - 78, // 81: signalservice.DataMessage.Contact.email:type_name -> signalservice.DataMessage.Contact.Email - 79, // 82: signalservice.DataMessage.Contact.address:type_name -> signalservice.DataMessage.Contact.PostalAddress - 80, // 83: signalservice.DataMessage.Contact.avatar:type_name -> signalservice.DataMessage.Contact.Avatar - 40, // 84: signalservice.DataMessage.Sticker.data:type_name -> signalservice.AttachmentPointer - 73, // 85: signalservice.DataMessage.Payment.Amount.mobileCoin:type_name -> signalservice.DataMessage.Payment.Amount.MobileCoin - 74, // 86: signalservice.DataMessage.Payment.Notification.mobileCoin:type_name -> signalservice.DataMessage.Payment.Notification.MobileCoin - 6, // 87: signalservice.DataMessage.Payment.Activation.type:type_name -> signalservice.DataMessage.Payment.Activation.Type - 40, // 88: signalservice.DataMessage.Quote.QuotedAttachment.thumbnail:type_name -> signalservice.AttachmentPointer - 8, // 89: signalservice.DataMessage.Contact.Phone.type:type_name -> signalservice.DataMessage.Contact.Phone.Type - 9, // 90: signalservice.DataMessage.Contact.Email.type:type_name -> signalservice.DataMessage.Contact.Email.Type - 10, // 91: signalservice.DataMessage.Contact.PostalAddress.type:type_name -> signalservice.DataMessage.Contact.PostalAddress.Type - 40, // 92: signalservice.DataMessage.Contact.Avatar.avatar:type_name -> signalservice.AttachmentPointer - 31, // 93: signalservice.SyncMessage.Sent.message:type_name -> signalservice.DataMessage - 104, // 94: signalservice.SyncMessage.Sent.unidentifiedStatus:type_name -> signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus - 35, // 95: signalservice.SyncMessage.Sent.storyMessage:type_name -> signalservice.StoryMessage - 105, // 96: signalservice.SyncMessage.Sent.storyMessageRecipients:type_name -> signalservice.SyncMessage.Sent.StoryMessageRecipient - 46, // 97: signalservice.SyncMessage.Sent.editMessage:type_name -> signalservice.EditMessage - 40, // 98: signalservice.SyncMessage.Contacts.blob:type_name -> signalservice.AttachmentPointer - 15, // 99: signalservice.SyncMessage.Request.type:type_name -> signalservice.SyncMessage.Request.Type - 16, // 100: signalservice.SyncMessage.StickerPackOperation.type:type_name -> signalservice.SyncMessage.StickerPackOperation.Type - 17, // 101: signalservice.SyncMessage.FetchLatest.type:type_name -> signalservice.SyncMessage.FetchLatest.Type - 18, // 102: signalservice.SyncMessage.MessageRequestResponse.type:type_name -> signalservice.SyncMessage.MessageRequestResponse.Type - 106, // 103: signalservice.SyncMessage.OutgoingPayment.mobileCoin:type_name -> signalservice.SyncMessage.OutgoingPayment.MobileCoin - 19, // 104: signalservice.SyncMessage.CallEvent.type:type_name -> signalservice.SyncMessage.CallEvent.Type - 20, // 105: signalservice.SyncMessage.CallEvent.direction:type_name -> signalservice.SyncMessage.CallEvent.Direction - 21, // 106: signalservice.SyncMessage.CallEvent.event:type_name -> signalservice.SyncMessage.CallEvent.Event - 22, // 107: signalservice.SyncMessage.CallLinkUpdate.type:type_name -> signalservice.SyncMessage.CallLinkUpdate.Type - 23, // 108: signalservice.SyncMessage.CallLogEvent.type:type_name -> signalservice.SyncMessage.CallLogEvent.Type - 107, // 109: signalservice.SyncMessage.DeleteForMe.messageDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.MessageDeletes - 109, // 110: signalservice.SyncMessage.DeleteForMe.conversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.ConversationDelete - 110, // 111: signalservice.SyncMessage.DeleteForMe.localOnlyConversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete - 108, // 112: signalservice.SyncMessage.DeleteForMe.attachmentDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.AttachmentDelete - 48, // 113: signalservice.SyncMessage.AttachmentBackfillRequest.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 114: signalservice.SyncMessage.AttachmentBackfillRequest.targetConversation:type_name -> signalservice.ConversationIdentifier - 48, // 115: signalservice.SyncMessage.AttachmentBackfillResponse.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 116: signalservice.SyncMessage.AttachmentBackfillResponse.targetConversation:type_name -> signalservice.ConversationIdentifier - 112, // 117: signalservice.SyncMessage.AttachmentBackfillResponse.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList - 24, // 118: signalservice.SyncMessage.AttachmentBackfillResponse.error:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.Error - 49, // 119: signalservice.SyncMessage.DeleteForMe.MessageDeletes.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 120: signalservice.SyncMessage.DeleteForMe.MessageDeletes.messages:type_name -> signalservice.AddressableMessage - 49, // 121: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 122: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.targetMessage:type_name -> signalservice.AddressableMessage - 49, // 123: signalservice.SyncMessage.DeleteForMe.ConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier - 48, // 124: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentMessages:type_name -> signalservice.AddressableMessage - 48, // 125: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentNonExpiringMessages:type_name -> signalservice.AddressableMessage - 49, // 126: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier - 40, // 127: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.attachment:type_name -> signalservice.AttachmentPointer - 25, // 128: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.status:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status - 111, // 129: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - 111, // 130: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.longText:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData - 131, // [131:131] is the sub-list for method output_type - 131, // [131:131] is the sub-list for method input_type - 131, // [131:131] is the sub-list for extension type_name - 131, // [131:131] is the sub-list for extension extendee - 0, // [0:131] is the sub-list for field type_name + 89, // 51: signalservice.SyncMessage.configuration:type_name -> signalservice.SyncMessage.Configuration + 91, // 52: signalservice.SyncMessage.viewOnceOpen:type_name -> signalservice.SyncMessage.ViewOnceOpen + 92, // 53: signalservice.SyncMessage.fetchLatest:type_name -> signalservice.SyncMessage.FetchLatest + 93, // 54: signalservice.SyncMessage.keys:type_name -> signalservice.SyncMessage.Keys + 95, // 55: signalservice.SyncMessage.messageRequestResponse:type_name -> signalservice.SyncMessage.MessageRequestResponse + 96, // 56: signalservice.SyncMessage.outgoingPayment:type_name -> signalservice.SyncMessage.OutgoingPayment + 97, // 57: signalservice.SyncMessage.pniChangeNumber:type_name -> signalservice.SyncMessage.PniChangeNumber + 98, // 58: signalservice.SyncMessage.callEvent:type_name -> signalservice.SyncMessage.CallEvent + 99, // 59: signalservice.SyncMessage.callLinkUpdate:type_name -> signalservice.SyncMessage.CallLinkUpdate + 100, // 60: signalservice.SyncMessage.callLogEvent:type_name -> signalservice.SyncMessage.CallLogEvent + 101, // 61: signalservice.SyncMessage.deleteForMe:type_name -> signalservice.SyncMessage.DeleteForMe + 102, // 62: signalservice.SyncMessage.deviceNameChange:type_name -> signalservice.SyncMessage.DeviceNameChange + 103, // 63: signalservice.SyncMessage.attachmentBackfillRequest:type_name -> signalservice.SyncMessage.AttachmentBackfillRequest + 104, // 64: signalservice.SyncMessage.attachmentBackfillResponse:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse + 87, // 65: signalservice.SyncMessage.read:type_name -> signalservice.SyncMessage.Read + 90, // 66: signalservice.SyncMessage.stickerPackOperation:type_name -> signalservice.SyncMessage.StickerPackOperation + 88, // 67: signalservice.SyncMessage.viewed:type_name -> signalservice.SyncMessage.Viewed + 114, // 68: signalservice.ContactDetails.avatar:type_name -> signalservice.ContactDetails.Avatar + 115, // 69: signalservice.PaymentAddress.mobileCoin:type_name -> signalservice.PaymentAddress.MobileCoin + 31, // 70: signalservice.EditMessage.dataMessage:type_name -> signalservice.DataMessage + 27, // 71: signalservice.BodyRange.style:type_name -> signalservice.BodyRange.Style + 1, // 72: signalservice.CallMessage.Offer.type:type_name -> signalservice.CallMessage.Offer.Type + 2, // 73: signalservice.CallMessage.Hangup.type:type_name -> signalservice.CallMessage.Hangup.Type + 3, // 74: signalservice.CallMessage.Opaque.urgency:type_name -> signalservice.CallMessage.Opaque.Urgency + 72, // 75: signalservice.DataMessage.Payment.notification:type_name -> signalservice.DataMessage.Payment.Notification + 73, // 76: signalservice.DataMessage.Payment.activation:type_name -> signalservice.DataMessage.Payment.Activation + 76, // 77: signalservice.DataMessage.Quote.attachments:type_name -> signalservice.DataMessage.Quote.QuotedAttachment + 47, // 78: signalservice.DataMessage.Quote.bodyRanges:type_name -> signalservice.BodyRange + 7, // 79: signalservice.DataMessage.Quote.type:type_name -> signalservice.DataMessage.Quote.Type + 77, // 80: signalservice.DataMessage.Contact.name:type_name -> signalservice.DataMessage.Contact.Name + 78, // 81: signalservice.DataMessage.Contact.number:type_name -> signalservice.DataMessage.Contact.Phone + 79, // 82: signalservice.DataMessage.Contact.email:type_name -> signalservice.DataMessage.Contact.Email + 80, // 83: signalservice.DataMessage.Contact.address:type_name -> signalservice.DataMessage.Contact.PostalAddress + 81, // 84: signalservice.DataMessage.Contact.avatar:type_name -> signalservice.DataMessage.Contact.Avatar + 40, // 85: signalservice.DataMessage.Sticker.data:type_name -> signalservice.AttachmentPointer + 74, // 86: signalservice.DataMessage.Payment.Amount.mobileCoin:type_name -> signalservice.DataMessage.Payment.Amount.MobileCoin + 75, // 87: signalservice.DataMessage.Payment.Notification.mobileCoin:type_name -> signalservice.DataMessage.Payment.Notification.MobileCoin + 6, // 88: signalservice.DataMessage.Payment.Activation.type:type_name -> signalservice.DataMessage.Payment.Activation.Type + 40, // 89: signalservice.DataMessage.Quote.QuotedAttachment.thumbnail:type_name -> signalservice.AttachmentPointer + 8, // 90: signalservice.DataMessage.Contact.Phone.type:type_name -> signalservice.DataMessage.Contact.Phone.Type + 9, // 91: signalservice.DataMessage.Contact.Email.type:type_name -> signalservice.DataMessage.Contact.Email.Type + 10, // 92: signalservice.DataMessage.Contact.PostalAddress.type:type_name -> signalservice.DataMessage.Contact.PostalAddress.Type + 40, // 93: signalservice.DataMessage.Contact.Avatar.avatar:type_name -> signalservice.AttachmentPointer + 31, // 94: signalservice.SyncMessage.Sent.message:type_name -> signalservice.DataMessage + 105, // 95: signalservice.SyncMessage.Sent.unidentifiedStatus:type_name -> signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus + 35, // 96: signalservice.SyncMessage.Sent.storyMessage:type_name -> signalservice.StoryMessage + 106, // 97: signalservice.SyncMessage.Sent.storyMessageRecipients:type_name -> signalservice.SyncMessage.Sent.StoryMessageRecipient + 46, // 98: signalservice.SyncMessage.Sent.editMessage:type_name -> signalservice.EditMessage + 40, // 99: signalservice.SyncMessage.Contacts.blob:type_name -> signalservice.AttachmentPointer + 15, // 100: signalservice.SyncMessage.Request.type:type_name -> signalservice.SyncMessage.Request.Type + 16, // 101: signalservice.SyncMessage.StickerPackOperation.type:type_name -> signalservice.SyncMessage.StickerPackOperation.Type + 17, // 102: signalservice.SyncMessage.FetchLatest.type:type_name -> signalservice.SyncMessage.FetchLatest.Type + 18, // 103: signalservice.SyncMessage.MessageRequestResponse.type:type_name -> signalservice.SyncMessage.MessageRequestResponse.Type + 107, // 104: signalservice.SyncMessage.OutgoingPayment.mobileCoin:type_name -> signalservice.SyncMessage.OutgoingPayment.MobileCoin + 19, // 105: signalservice.SyncMessage.CallEvent.type:type_name -> signalservice.SyncMessage.CallEvent.Type + 20, // 106: signalservice.SyncMessage.CallEvent.direction:type_name -> signalservice.SyncMessage.CallEvent.Direction + 21, // 107: signalservice.SyncMessage.CallEvent.event:type_name -> signalservice.SyncMessage.CallEvent.Event + 22, // 108: signalservice.SyncMessage.CallLinkUpdate.type:type_name -> signalservice.SyncMessage.CallLinkUpdate.Type + 23, // 109: signalservice.SyncMessage.CallLogEvent.type:type_name -> signalservice.SyncMessage.CallLogEvent.Type + 108, // 110: signalservice.SyncMessage.DeleteForMe.messageDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.MessageDeletes + 110, // 111: signalservice.SyncMessage.DeleteForMe.conversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.ConversationDelete + 111, // 112: signalservice.SyncMessage.DeleteForMe.localOnlyConversationDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete + 109, // 113: signalservice.SyncMessage.DeleteForMe.attachmentDeletes:type_name -> signalservice.SyncMessage.DeleteForMe.AttachmentDelete + 48, // 114: signalservice.SyncMessage.AttachmentBackfillRequest.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 115: signalservice.SyncMessage.AttachmentBackfillRequest.targetConversation:type_name -> signalservice.ConversationIdentifier + 48, // 116: signalservice.SyncMessage.AttachmentBackfillResponse.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 117: signalservice.SyncMessage.AttachmentBackfillResponse.targetConversation:type_name -> signalservice.ConversationIdentifier + 113, // 118: signalservice.SyncMessage.AttachmentBackfillResponse.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList + 24, // 119: signalservice.SyncMessage.AttachmentBackfillResponse.error:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.Error + 49, // 120: signalservice.SyncMessage.DeleteForMe.MessageDeletes.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 121: signalservice.SyncMessage.DeleteForMe.MessageDeletes.messages:type_name -> signalservice.AddressableMessage + 49, // 122: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 123: signalservice.SyncMessage.DeleteForMe.AttachmentDelete.targetMessage:type_name -> signalservice.AddressableMessage + 49, // 124: signalservice.SyncMessage.DeleteForMe.ConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier + 48, // 125: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentMessages:type_name -> signalservice.AddressableMessage + 48, // 126: signalservice.SyncMessage.DeleteForMe.ConversationDelete.mostRecentNonExpiringMessages:type_name -> signalservice.AddressableMessage + 49, // 127: signalservice.SyncMessage.DeleteForMe.LocalOnlyConversationDelete.conversation:type_name -> signalservice.ConversationIdentifier + 40, // 128: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.attachment:type_name -> signalservice.AttachmentPointer + 25, // 129: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.status:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData.Status + 112, // 130: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.attachments:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + 112, // 131: signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentDataList.longText:type_name -> signalservice.SyncMessage.AttachmentBackfillResponse.AttachmentData + 132, // [132:132] is the sub-list for method output_type + 132, // [132:132] is the sub-list for method input_type + 132, // [132:132] is the sub-list for extension type_name + 132, // [132:132] is the sub-list for extension extendee + 0, // [0:132] is the sub-list for field type_name } func init() { file_SignalService_proto_init() } @@ -9303,6 +9635,17 @@ func file_SignalService_proto_init() { if File_SignalService_proto != nil { return } + file_SignalService_proto_msgTypes[1].OneofWrappers = []any{ + (*Content_DataMessage)(nil), + (*Content_SyncMessage)(nil), + (*Content_CallMessage)(nil), + (*Content_NullMessage)(nil), + (*Content_ReceiptMessage)(nil), + (*Content_TypingMessage)(nil), + (*Content_DecryptionErrorMessage)(nil), + (*Content_StoryMessage)(nil), + (*Content_EditMessage)(nil), + } file_SignalService_proto_msgTypes[7].OneofWrappers = []any{ (*StoryMessage_FileAttachment)(nil), (*StoryMessage_TextAttachment)(nil), @@ -9311,6 +9654,27 @@ func file_SignalService_proto_init() { (*TextAttachment_Gradient_)(nil), (*TextAttachment_Color)(nil), } + file_SignalService_proto_msgTypes[11].OneofWrappers = []any{ + (*SyncMessage_Sent_)(nil), + (*SyncMessage_Contacts_)(nil), + (*SyncMessage_Request_)(nil), + (*SyncMessage_Blocked_)(nil), + (*SyncMessage_Verified)(nil), + (*SyncMessage_Configuration_)(nil), + (*SyncMessage_ViewOnceOpen_)(nil), + (*SyncMessage_FetchLatest_)(nil), + (*SyncMessage_Keys_)(nil), + (*SyncMessage_MessageRequestResponse_)(nil), + (*SyncMessage_OutgoingPayment_)(nil), + (*SyncMessage_PniChangeNumber_)(nil), + (*SyncMessage_CallEvent_)(nil), + (*SyncMessage_CallLinkUpdate_)(nil), + (*SyncMessage_CallLogEvent_)(nil), + (*SyncMessage_DeleteForMe_)(nil), + (*SyncMessage_DeviceNameChange_)(nil), + (*SyncMessage_AttachmentBackfillRequest_)(nil), + (*SyncMessage_AttachmentBackfillResponse_)(nil), + } file_SignalService_proto_msgTypes[12].OneofWrappers = []any{ (*AttachmentPointer_CdnId)(nil), (*AttachmentPointer_CdnKey)(nil), @@ -9342,20 +9706,20 @@ func file_SignalService_proto_init() { (*DataMessage_PinMessage_PinDurationSeconds)(nil), (*DataMessage_PinMessage_PinDurationForever)(nil), } - file_SignalService_proto_msgTypes[42].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[43].OneofWrappers = []any{ (*DataMessage_Payment_Amount_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[43].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[44].OneofWrappers = []any{ (*DataMessage_Payment_Notification_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[67].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[68].OneofWrappers = []any{ (*SyncMessage_OutgoingPayment_MobileCoin_)(nil), } - file_SignalService_proto_msgTypes[75].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[76].OneofWrappers = []any{ (*SyncMessage_AttachmentBackfillResponse_Attachments)(nil), (*SyncMessage_AttachmentBackfillResponse_Error_)(nil), } - file_SignalService_proto_msgTypes[83].OneofWrappers = []any{ + file_SignalService_proto_msgTypes[84].OneofWrappers = []any{ (*SyncMessage_AttachmentBackfillResponse_AttachmentData_Attachment)(nil), (*SyncMessage_AttachmentBackfillResponse_AttachmentData_Status_)(nil), } @@ -9365,7 +9729,7 @@ func file_SignalService_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_SignalService_proto_rawDesc), len(file_SignalService_proto_rawDesc)), NumEnums: 28, - NumMessages: 87, + NumMessages: 88, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/signalmeow/protobuf/SignalService.proto b/pkg/signalmeow/protobuf/SignalService.proto index da4d44f..0089a16 100644 --- a/pkg/signalmeow/protobuf/SignalService.proto +++ b/pkg/signalmeow/protobuf/SignalService.proto @@ -13,23 +13,79 @@ option java_outer_classname = "SignalServiceProtos"; message Envelope { enum Type { UNKNOWN = 0; - CIPHERTEXT = 1; // content => (version byte | SignalMessage{Content}) + + /** + * A double-ratchet message represents a "normal," "unsealed-sender" message + * encrypted using the Double Ratchet within an established Signal session. + * Double-ratchet messages include sender information in the plaintext + * portion of the `Envelope`. + */ + DOUBLE_RATCHET = 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) + + /** + * A prekey message begins a new Signal session. The `content` of a prekey + * message is a superset of a double-ratchet message's `content` and + * contains the sender's identity public key and information identifying the + * pre-keys used in the message's ciphertext. Like double-ratchet messages, + * prekey messages contain sender information in the plaintext portion of + * the `Envelope`. + */ + PREKEY_MESSAGE = 3; // content => (version byte | PreKeySignalMessage{Content}) + + /** + * Server delivery receipts are generated by the server when + * "unsealed-sender" messages are delivered to and acknowledged by the + * destination device. Server delivery receipts identify the sender in the + * plaintext portion of the `Envelope` and have no `content`. Note that + * receipts for sealed-sender messages are generated by clients as + * `UNIDENTIFIED_SENDER` messages. + * + * Note that, with server delivery receipts, the "client timestamp" on + * the envelope refers to the timestamp of the original message (i.e. the + * message the server just delivered) and not to the time of delivery. The + * "server timestamp" refers to the time of delivery. + */ + SERVER_DELIVERY_RECEIPT = 5; // content => [] + + /** + * An unidentified sender message represents a message with no sender + * information in the plaintext portion of the `Envelope`. Unidentified + * sender messages always contain an additional `subtype` in their + * `content`. They may or may not be part of an existing Signal session + * (i.e. an unidentified sender message may have a "prekey message" + * subtype or may indicate an encryption error). + */ + UNIDENTIFIED_SENDER = 6; // content => ((version byte | UnidentifiedSenderMessage) OR (version byte | Multi-Recipient Sealed Sender Format)) + + reserved 7; + reserved "SENDERKEY_MESSAGE"; + + /** + * A plaintext message is used solely to convey encryption error receipts + * and never contains encrypted message content. Encryption error receipts + * must be delivered in plaintext because, encryption/decryption of a prior + * message failed and there is no reason to believe that + * encryption/decryption of subsequent messages with the same key material + * would succeed. + * + * Critically, plaintext messages never have "real" message content + * generated by users. Plaintext messages include sender information. + */ + PLAINTEXT_CONTENT = 8; // content => (marker byte | Content) + + // next: 9 } optional Type type = 1; reserved 2; // formerly optional string sourceE164 = 2; optional string sourceServiceId = 11; - optional uint32 sourceDevice = 7; + optional uint32 sourceDeviceId = 7; optional string destinationServiceId = 13; reserved 3; // formerly optional string relay = 3; - optional uint64 timestamp = 5; + optional uint64 clientTimestamp = 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; @@ -48,17 +104,20 @@ message Envelope { } message Content { - optional DataMessage dataMessage = 1; - optional SyncMessage syncMessage = 2; - optional CallMessage callMessage = 3; - optional NullMessage nullMessage = 4; - optional ReceiptMessage receiptMessage = 5; - optional TypingMessage typingMessage = 6; + oneof content { + DataMessage dataMessage = 1; + SyncMessage syncMessage = 2; + CallMessage callMessage = 3; + NullMessage nullMessage = 4; + ReceiptMessage receiptMessage = 5; + TypingMessage typingMessage = 6; + bytes /* DecryptionErrorMessage */ decryptionErrorMessage = 8; + StoryMessage storyMessage = 9; + EditMessage editMessage = 11; + } + optional bytes /* SenderKeyDistributionMessage */ senderKeyDistributionMessage = 7; - optional bytes /* DecryptionErrorMessage */ decryptionErrorMessage = 8; - optional StoryMessage storyMessage = 9; optional PniSignatureMessage pniSignatureMessage = 10; - optional EditMessage editMessage = 11; } message CallMessage { @@ -331,8 +390,8 @@ message DataMessage { message PollVote { optional bytes targetAuthorAciBinary = 1; optional uint64 targetSentTimestamp = 2; - repeated uint32 optionIndexes = 3; // must be in the range [0, options.length) from the PollCreate - optional uint32 voteCount = 4; // increment this by 1 each time you vote on a given poll + repeated uint32 optionIndexes = 3; + optional uint32 voteCount = 4; } message PinMessage { @@ -349,6 +408,11 @@ message DataMessage { optional uint64 targetSentTimestamp = 2; } + message AdminDelete { + optional bytes targetAuthorAciBinary = 1; // 16-byte UUID + optional uint64 targetSentTimestamp = 2; + } + optional string body = 1; repeated AttachmentPointer attachments = 2; reserved /*groupV1*/ 3; @@ -376,7 +440,8 @@ message DataMessage { optional PollVote pollVote = 26; optional PinMessage pinMessage = 27; optional UnpinMessage unpinMessage = 28; - // NEXT ID: 29 + optional AdminDelete adminDelete = 29; + // NEXT ID: 30 } message NullMessage { @@ -435,6 +500,12 @@ message TextAttachment { } message Gradient { + // Color ordering: + // 0 degrees: bottom-to-top + // 90 degrees: left-to-right + // 180 degrees: top-to-bottom + // 270 degrees: right-to-left + 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. optional uint32 angle = 3; // degrees @@ -547,7 +618,7 @@ message SyncMessage { optional bool unidentifiedDeliveryIndicators = 2; optional bool typingIndicators = 3; reserved /* linkPreviews */ 4; - optional uint32 provisioningVersion = 5; + reserved /* provisioningVersion */ 5; optional bool linkPreviews = 6; } @@ -582,7 +653,7 @@ message SyncMessage { message Keys { reserved /* storageService */ 1; - optional bytes master = 2; // deprecated: this field will be removed in a future release. + reserved /* master */ 2; optional string accountEntropyPool = 3; optional bytes mediaRootBackupKey = 4; } @@ -682,7 +753,7 @@ message SyncMessage { optional bytes rootKey = 1; optional bytes adminPasskey = 2; optional Type type = 3; // defaults to UPDATE - optional bytes epoch = 4; + reserved /*epoch*/ 4; } message CallLogEvent { @@ -779,31 +850,40 @@ message SyncMessage { } } - optional Sent sent = 1; - optional Contacts contacts = 2; + oneof content { + Sent sent = 1; + Contacts contacts = 2; + Request request = 4; + Blocked blocked = 6; + Verified verified = 7; + Configuration configuration = 9; + ViewOnceOpen viewOnceOpen = 11; + FetchLatest fetchLatest = 12; + Keys keys = 13; + MessageRequestResponse messageRequestResponse = 14; + OutgoingPayment outgoingPayment = 15; + PniChangeNumber pniChangeNumber = 18; + CallEvent callEvent = 19; + CallLinkUpdate callLinkUpdate = 20; + CallLogEvent callLogEvent = 21; + DeleteForMe deleteForMe = 22; + DeviceNameChange deviceNameChange = 23; + AttachmentBackfillRequest attachmentBackfillRequest = 24; + AttachmentBackfillResponse attachmentBackfillResponse = 25; + } + reserved /*groups*/ 3; - optional Request request = 4; + + // Protobufs don't allow `repeated` fields to be inside of `oneof` so while + // the fields below are mutually exclusive with the rest of the values above + // we have to place them outside of `oneof`. 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; - optional MessageRequestResponse messageRequestResponse = 14; - optional OutgoingPayment outgoingPayment = 15; 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; - optional AttachmentBackfillRequest attachmentBackfillRequest = 24; - optional AttachmentBackfillResponse attachmentBackfillResponse = 25; + + optional bytes padding = 8; } message AttachmentPointer { diff --git a/pkg/signalmeow/protobuf/StorageService.pb.go b/pkg/signalmeow/protobuf/StorageService.pb.go index 9a27146..619221f 100644 --- a/pkg/signalmeow/protobuf/StorageService.pb.go +++ b/pkg/signalmeow/protobuf/StorageService.pb.go @@ -1598,6 +1598,7 @@ type AccountRecord struct { NotificationProfileManualOverride *AccountRecord_NotificationProfileManualOverride `protobuf:"bytes,44,opt,name=notificationProfileManualOverride,proto3" json:"notificationProfileManualOverride,omitempty"` NotificationProfileSyncDisabled bool `protobuf:"varint,45,opt,name=notificationProfileSyncDisabled,proto3" json:"notificationProfileSyncDisabled,omitempty"` AutomaticKeyVerificationDisabled bool `protobuf:"varint,46,opt,name=automaticKeyVerificationDisabled,proto3" json:"automaticKeyVerificationDisabled,omitempty"` + HasSeenAdminDeleteEducationDialog bool `protobuf:"varint,47,opt,name=hasSeenAdminDeleteEducationDialog,proto3" json:"hasSeenAdminDeleteEducationDialog,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1905,6 +1906,13 @@ func (x *AccountRecord) GetAutomaticKeyVerificationDisabled() bool { return false } +func (x *AccountRecord) GetHasSeenAdminDeleteEducationDialog() bool { + if x != nil { + return x.HasSeenAdminDeleteEducationDialog + } + return false +} + type StoryDistributionListRecord struct { state protoimpl.MessageState `protogen:"open.v1"` Identifier []byte `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` @@ -2002,7 +2010,6 @@ type CallLinkRecord struct { RootKey []byte `protobuf:"bytes,1,opt,name=rootKey,proto3" json:"rootKey,omitempty"` AdminPasskey []byte `protobuf:"bytes,2,opt,name=adminPasskey,proto3" json:"adminPasskey,omitempty"` DeletedAtTimestampMs uint64 `protobuf:"varint,3,opt,name=deletedAtTimestampMs,proto3" json:"deletedAtTimestampMs,omitempty"` - Epoch []byte `protobuf:"bytes,4,opt,name=epoch,proto3,oneof" json:"epoch,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2058,13 +2065,6 @@ func (x *CallLinkRecord) GetDeletedAtTimestampMs() uint64 { return 0 } -func (x *CallLinkRecord) GetEpoch() []byte { - if x != nil { - return x.Epoch - } - return nil -} - type Recipient struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Identifier: @@ -3216,7 +3216,7 @@ const file_StorageService_proto_rawDesc = "" + "\">\n" + "\bPayments\x12\x18\n" + "\aenabled\x18\x01 \x01(\bR\aenabled\x12\x18\n" + - "\aentropy\x18\x02 \x01(\fR\aentropy\"\xcb\x1c\n" + + "\aentropy\x18\x02 \x01(\fR\aentropy\"\x99\x1d\n" + "\rAccountRecord\x12\x1e\n" + "\n" + "profileKey\x18\x01 \x01(\fR\n" + @@ -3263,7 +3263,8 @@ const file_StorageService_proto_rawDesc = "" + "\x11backupTierHistory\x18+ \x01(\v2..signalservice.AccountRecord.BackupTierHistoryR\x11backupTierHistory\x12\x8c\x01\n" + "!notificationProfileManualOverride\x18, \x01(\v2>.signalservice.AccountRecord.NotificationProfileManualOverrideR!notificationProfileManualOverride\x12H\n" + "\x1fnotificationProfileSyncDisabled\x18- \x01(\bR\x1fnotificationProfileSyncDisabled\x12J\n" + - " automaticKeyVerificationDisabled\x18. \x01(\bR automaticKeyVerificationDisabled\x1a\xb0\x02\n" + + " automaticKeyVerificationDisabled\x18. \x01(\bR automaticKeyVerificationDisabled\x12L\n" + + "!hasSeenAdminDeleteEducationDialog\x18/ \x01(\bR!hasSeenAdminDeleteEducationDialog\x1a\xb0\x02\n" + "\x12PinnedConversation\x12S\n" + "\acontact\x18\x01 \x01(\v27.signalservice.AccountRecord.PinnedConversation.ContactH\x00R\acontact\x12&\n" + "\rlegacyGroupId\x18\x03 \x01(\fH\x00R\rlegacyGroupId\x12(\n" + @@ -3329,13 +3330,11 @@ const file_StorageService_proto_rawDesc = "" + "\x12deletedAtTimestamp\x18\x04 \x01(\x04R\x12deletedAtTimestamp\x12$\n" + "\rallowsReplies\x18\x05 \x01(\bR\rallowsReplies\x12 \n" + "\visBlockList\x18\x06 \x01(\bR\visBlockList\x12<\n" + - "\x19recipientServiceIdsBinary\x18\a \x03(\fR\x19recipientServiceIdsBinary\"\xa7\x01\n" + + "\x19recipientServiceIdsBinary\x18\a \x03(\fR\x19recipientServiceIdsBinary\"\x88\x01\n" + "\x0eCallLinkRecord\x12\x18\n" + "\arootKey\x18\x01 \x01(\fR\arootKey\x12\"\n" + "\fadminPasskey\x18\x02 \x01(\fR\fadminPasskey\x122\n" + - "\x14deletedAtTimestampMs\x18\x03 \x01(\x04R\x14deletedAtTimestampMs\x12\x19\n" + - "\x05epoch\x18\x04 \x01(\fH\x00R\x05epoch\x88\x01\x01B\b\n" + - "\x06_epoch\"\x90\x02\n" + + "\x14deletedAtTimestampMs\x18\x03 \x01(\x04R\x14deletedAtTimestampMsJ\x04\b\x04\x10\x05\"\x90\x02\n" + "\tRecipient\x12<\n" + "\acontact\x18\x01 \x01(\v2 .signalservice.Recipient.ContactH\x00R\acontact\x12&\n" + "\rlegacyGroupId\x18\x02 \x01(\fH\x00R\rlegacyGroupId\x12(\n" + @@ -3531,7 +3530,6 @@ func file_StorageService_proto_init() { file_StorageService_proto_msgTypes[7].OneofWrappers = []any{} file_StorageService_proto_msgTypes[9].OneofWrappers = []any{} file_StorageService_proto_msgTypes[11].OneofWrappers = []any{} - file_StorageService_proto_msgTypes[13].OneofWrappers = []any{} file_StorageService_proto_msgTypes[14].OneofWrappers = []any{ (*Recipient_Contact_)(nil), (*Recipient_LegacyGroupId)(nil), diff --git a/pkg/signalmeow/protobuf/StorageService.proto b/pkg/signalmeow/protobuf/StorageService.proto index 95ec845..d22babc 100644 --- a/pkg/signalmeow/protobuf/StorageService.proto +++ b/pkg/signalmeow/protobuf/StorageService.proto @@ -296,6 +296,7 @@ message AccountRecord { NotificationProfileManualOverride notificationProfileManualOverride = 44; bool notificationProfileSyncDisabled = 45; bool automaticKeyVerificationDisabled = 46; + bool hasSeenAdminDeleteEducationDialog = 47; } message StoryDistributionListRecord { @@ -312,7 +313,7 @@ message CallLinkRecord { bytes rootKey = 1; bytes adminPasskey = 2; uint64 deletedAtTimestampMs = 3; - optional bytes epoch = 4; + reserved 4; // was epoch field, never used } message Recipient { diff --git a/pkg/signalmeow/protobuf/backuppb/Backup.pb.go b/pkg/signalmeow/protobuf/backuppb/Backup.pb.go index 73930ae..326c170 100644 --- a/pkg/signalmeow/protobuf/backuppb/Backup.pb.go +++ b/pkg/signalmeow/protobuf/backuppb/Backup.pb.go @@ -1504,7 +1504,7 @@ func (x IndividualCall_Type) Number() protoreflect.EnumNumber { // Deprecated: Use IndividualCall_Type.Descriptor instead. func (IndividualCall_Type) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{34, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{35, 0} } type IndividualCall_Direction int32 @@ -1553,7 +1553,7 @@ func (x IndividualCall_Direction) Number() protoreflect.EnumNumber { // Deprecated: Use IndividualCall_Direction.Descriptor instead. func (IndividualCall_Direction) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{34, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{35, 1} } type IndividualCall_State int32 @@ -1612,7 +1612,7 @@ func (x IndividualCall_State) Number() protoreflect.EnumNumber { // Deprecated: Use IndividualCall_State.Descriptor instead. func (IndividualCall_State) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{34, 2} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{35, 2} } type GroupCall_State int32 @@ -1688,7 +1688,7 @@ func (x GroupCall_State) Number() protoreflect.EnumNumber { // Deprecated: Use GroupCall_State.Descriptor instead. func (GroupCall_State) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{35, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{36, 0} } type SimpleChatUpdate_Type int32 @@ -1779,7 +1779,7 @@ func (x SimpleChatUpdate_Type) Number() protoreflect.EnumNumber { // Deprecated: Use SimpleChatUpdate_Type.Descriptor instead. func (SimpleChatUpdate_Type) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{36, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{37, 0} } type ChatStyle_WallpaperPreset int32 @@ -1885,7 +1885,7 @@ func (x ChatStyle_WallpaperPreset) Number() protoreflect.EnumNumber { // Deprecated: Use ChatStyle_WallpaperPreset.Descriptor instead. func (ChatStyle_WallpaperPreset) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{83, 0} } type ChatStyle_BubbleColorPreset int32 @@ -1994,7 +1994,7 @@ func (x ChatStyle_BubbleColorPreset) Number() protoreflect.EnumNumber { // Deprecated: Use ChatStyle_BubbleColorPreset.Descriptor instead. func (ChatStyle_BubbleColorPreset) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{83, 1} } type NotificationProfile_DayOfWeek int32 @@ -2058,7 +2058,7 @@ func (x NotificationProfile_DayOfWeek) Number() protoreflect.EnumNumber { // Deprecated: Use NotificationProfile_DayOfWeek.Descriptor instead. func (NotificationProfile_DayOfWeek) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{81, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{84, 0} } // Represents the default "All chats" folder record vs all other custom folders @@ -2108,7 +2108,7 @@ func (x ChatFolder_FolderType) Number() protoreflect.EnumNumber { // Deprecated: Use ChatFolder_FolderType.Descriptor instead. func (ChatFolder_FolderType) EnumDescriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{82, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{85, 0} } type BackupInfo struct { @@ -3241,7 +3241,6 @@ type CallLink struct { Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` Restrictions CallLink_Restrictions `protobuf:"varint,4,opt,name=restrictions,proto3,enum=signal.backup.CallLink_Restrictions" json:"restrictions,omitempty"` ExpirationMs uint64 `protobuf:"varint,5,opt,name=expirationMs,proto3" json:"expirationMs,omitempty"` - Epoch []byte `protobuf:"bytes,6,opt,name=epoch,proto3,oneof" json:"epoch,omitempty"` // May be absent/empty for older links unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -3311,13 +3310,6 @@ func (x *CallLink) GetExpirationMs() uint64 { return 0 } -func (x *CallLink) GetEpoch() []byte { - if x != nil { - return x.Epoch - } - return nil -} - type AdHocCall struct { state protoimpl.MessageState `protogen:"open.v1"` CallId uint64 `protobuf:"varint,1,opt,name=callId,proto3" json:"callId,omitempty"` @@ -3580,6 +3572,7 @@ type ChatItem struct { // *ChatItem_ViewOnceMessage // *ChatItem_DirectStoryReplyMessage // *ChatItem_Poll + // *ChatItem_AdminDeletedMessage Item isChatItem_Item `protobuf_oneof:"item"` PinDetails *ChatItem_PinDetails `protobuf:"bytes,21,opt,name=pinDetails,proto3" json:"pinDetails,omitempty"` // only set if message is pinned unknownFields protoimpl.UnknownFields @@ -3796,6 +3789,15 @@ func (x *ChatItem) GetPoll() *Poll { return nil } +func (x *ChatItem) GetAdminDeletedMessage() *AdminDeletedMessage { + if x != nil { + if x, ok := x.Item.(*ChatItem_AdminDeletedMessage); ok { + return x.AdminDeletedMessage + } + } + return nil +} + func (x *ChatItem) GetPinDetails() *ChatItem_PinDetails { if x != nil { return x.PinDetails @@ -3869,6 +3871,10 @@ type ChatItem_Poll struct { Poll *Poll `protobuf:"bytes,20,opt,name=poll,proto3,oneof"` } +type ChatItem_AdminDeletedMessage struct { + AdminDeletedMessage *AdminDeletedMessage `protobuf:"bytes,22,opt,name=adminDeletedMessage,proto3,oneof"` +} + func (*ChatItem_StandardMessage) isChatItem_Item() {} func (*ChatItem_ContactMessage) isChatItem_Item() {} @@ -3889,6 +3895,8 @@ func (*ChatItem_DirectStoryReplyMessage) isChatItem_Item() {} func (*ChatItem_Poll) isChatItem_Item() {} +func (*ChatItem_AdminDeletedMessage) isChatItem_Item() {} + type SendStatus struct { state protoimpl.MessageState `protogen:"open.v1"` RecipientId uint64 `protobuf:"varint,1,opt,name=recipientId,proto3" json:"recipientId,omitempty"` @@ -5355,6 +5363,50 @@ func (x *Poll) GetReactions() []*Reaction { return nil } +type AdminDeletedMessage struct { + state protoimpl.MessageState `protogen:"open.v1"` + AdminId uint64 `protobuf:"varint,1,opt,name=adminId,proto3" json:"adminId,omitempty"` // id of the admin that deleted the message + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AdminDeletedMessage) Reset() { + *x = AdminDeletedMessage{} + mi := &file_backuppb_Backup_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AdminDeletedMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdminDeletedMessage) ProtoMessage() {} + +func (x *AdminDeletedMessage) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[33] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AdminDeletedMessage.ProtoReflect.Descriptor instead. +func (*AdminDeletedMessage) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{33} +} + +func (x *AdminDeletedMessage) GetAdminId() uint64 { + if x != nil { + return x.AdminId + } + return 0 +} + type ChatUpdateMessage struct { state protoimpl.MessageState `protogen:"open.v1"` // If unset, importers should ignore the update message without throwing an error. @@ -5379,7 +5431,7 @@ type ChatUpdateMessage struct { func (x *ChatUpdateMessage) Reset() { *x = ChatUpdateMessage{} - mi := &file_backuppb_Backup_proto_msgTypes[33] + mi := &file_backuppb_Backup_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5391,7 +5443,7 @@ func (x *ChatUpdateMessage) String() string { func (*ChatUpdateMessage) ProtoMessage() {} func (x *ChatUpdateMessage) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[33] + mi := &file_backuppb_Backup_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5404,7 +5456,7 @@ func (x *ChatUpdateMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatUpdateMessage.ProtoReflect.Descriptor instead. func (*ChatUpdateMessage) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{33} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{34} } func (x *ChatUpdateMessage) GetUpdate() isChatUpdateMessage_Update { @@ -5597,7 +5649,7 @@ type IndividualCall struct { func (x *IndividualCall) Reset() { *x = IndividualCall{} - mi := &file_backuppb_Backup_proto_msgTypes[34] + mi := &file_backuppb_Backup_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5609,7 +5661,7 @@ func (x *IndividualCall) String() string { func (*IndividualCall) ProtoMessage() {} func (x *IndividualCall) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[34] + mi := &file_backuppb_Backup_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5622,7 +5674,7 @@ func (x *IndividualCall) ProtoReflect() protoreflect.Message { // Deprecated: Use IndividualCall.ProtoReflect.Descriptor instead. func (*IndividualCall) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{34} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{35} } func (x *IndividualCall) GetCallId() uint64 { @@ -5682,7 +5734,7 @@ type GroupCall struct { func (x *GroupCall) Reset() { *x = GroupCall{} - mi := &file_backuppb_Backup_proto_msgTypes[35] + mi := &file_backuppb_Backup_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5694,7 +5746,7 @@ func (x *GroupCall) String() string { func (*GroupCall) ProtoMessage() {} func (x *GroupCall) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[35] + mi := &file_backuppb_Backup_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5707,7 +5759,7 @@ func (x *GroupCall) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupCall.ProtoReflect.Descriptor instead. func (*GroupCall) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{35} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{36} } func (x *GroupCall) GetCallId() uint64 { @@ -5768,7 +5820,7 @@ type SimpleChatUpdate struct { func (x *SimpleChatUpdate) Reset() { *x = SimpleChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[36] + mi := &file_backuppb_Backup_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5780,7 +5832,7 @@ func (x *SimpleChatUpdate) String() string { func (*SimpleChatUpdate) ProtoMessage() {} func (x *SimpleChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[36] + mi := &file_backuppb_Backup_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5793,7 +5845,7 @@ func (x *SimpleChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use SimpleChatUpdate.ProtoReflect.Descriptor instead. func (*SimpleChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{36} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{37} } func (x *SimpleChatUpdate) GetType() SimpleChatUpdate_Type { @@ -5814,7 +5866,7 @@ type ExpirationTimerChatUpdate struct { func (x *ExpirationTimerChatUpdate) Reset() { *x = ExpirationTimerChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[37] + mi := &file_backuppb_Backup_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5826,7 +5878,7 @@ func (x *ExpirationTimerChatUpdate) String() string { func (*ExpirationTimerChatUpdate) ProtoMessage() {} func (x *ExpirationTimerChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[37] + mi := &file_backuppb_Backup_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5839,7 +5891,7 @@ func (x *ExpirationTimerChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpirationTimerChatUpdate.ProtoReflect.Descriptor instead. func (*ExpirationTimerChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{37} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{38} } func (x *ExpirationTimerChatUpdate) GetExpiresInMs() uint64 { @@ -5859,7 +5911,7 @@ type ProfileChangeChatUpdate struct { func (x *ProfileChangeChatUpdate) Reset() { *x = ProfileChangeChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[38] + mi := &file_backuppb_Backup_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5871,7 +5923,7 @@ func (x *ProfileChangeChatUpdate) String() string { func (*ProfileChangeChatUpdate) ProtoMessage() {} func (x *ProfileChangeChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[38] + mi := &file_backuppb_Backup_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5884,7 +5936,7 @@ func (x *ProfileChangeChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileChangeChatUpdate.ProtoReflect.Descriptor instead. func (*ProfileChangeChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{38} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{39} } func (x *ProfileChangeChatUpdate) GetPreviousName() string { @@ -5916,7 +5968,7 @@ type LearnedProfileChatUpdate struct { func (x *LearnedProfileChatUpdate) Reset() { *x = LearnedProfileChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[39] + mi := &file_backuppb_Backup_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5928,7 +5980,7 @@ func (x *LearnedProfileChatUpdate) String() string { func (*LearnedProfileChatUpdate) ProtoMessage() {} func (x *LearnedProfileChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[39] + mi := &file_backuppb_Backup_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5941,7 +5993,7 @@ func (x *LearnedProfileChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use LearnedProfileChatUpdate.ProtoReflect.Descriptor instead. func (*LearnedProfileChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{39} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{40} } func (x *LearnedProfileChatUpdate) GetPreviousName() isLearnedProfileChatUpdate_PreviousName { @@ -5994,7 +6046,7 @@ type ThreadMergeChatUpdate struct { func (x *ThreadMergeChatUpdate) Reset() { *x = ThreadMergeChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[40] + mi := &file_backuppb_Backup_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6006,7 +6058,7 @@ func (x *ThreadMergeChatUpdate) String() string { func (*ThreadMergeChatUpdate) ProtoMessage() {} func (x *ThreadMergeChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[40] + mi := &file_backuppb_Backup_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6019,7 +6071,7 @@ func (x *ThreadMergeChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ThreadMergeChatUpdate.ProtoReflect.Descriptor instead. func (*ThreadMergeChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{40} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{41} } func (x *ThreadMergeChatUpdate) GetPreviousE164() uint64 { @@ -6038,7 +6090,7 @@ type SessionSwitchoverChatUpdate struct { func (x *SessionSwitchoverChatUpdate) Reset() { *x = SessionSwitchoverChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[41] + mi := &file_backuppb_Backup_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6050,7 +6102,7 @@ func (x *SessionSwitchoverChatUpdate) String() string { func (*SessionSwitchoverChatUpdate) ProtoMessage() {} func (x *SessionSwitchoverChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[41] + mi := &file_backuppb_Backup_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6063,7 +6115,7 @@ func (x *SessionSwitchoverChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionSwitchoverChatUpdate.ProtoReflect.Descriptor instead. func (*SessionSwitchoverChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{41} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{42} } func (x *SessionSwitchoverChatUpdate) GetE164() uint64 { @@ -6084,7 +6136,7 @@ type GroupChangeChatUpdate struct { func (x *GroupChangeChatUpdate) Reset() { *x = GroupChangeChatUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[42] + mi := &file_backuppb_Backup_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6096,7 +6148,7 @@ func (x *GroupChangeChatUpdate) String() string { func (*GroupChangeChatUpdate) ProtoMessage() {} func (x *GroupChangeChatUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[42] + mi := &file_backuppb_Backup_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6109,7 +6161,7 @@ func (x *GroupChangeChatUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupChangeChatUpdate.ProtoReflect.Descriptor instead. func (*GroupChangeChatUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{42} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{43} } func (x *GroupChangeChatUpdate) GetUpdates() []*GroupChangeChatUpdate_Update { @@ -6128,7 +6180,7 @@ type GenericGroupUpdate struct { func (x *GenericGroupUpdate) Reset() { *x = GenericGroupUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[43] + mi := &file_backuppb_Backup_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6140,7 +6192,7 @@ func (x *GenericGroupUpdate) String() string { func (*GenericGroupUpdate) ProtoMessage() {} func (x *GenericGroupUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[43] + mi := &file_backuppb_Backup_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6153,7 +6205,7 @@ func (x *GenericGroupUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GenericGroupUpdate.ProtoReflect.Descriptor instead. func (*GenericGroupUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{43} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{44} } func (x *GenericGroupUpdate) GetUpdaterAci() []byte { @@ -6172,7 +6224,7 @@ type GroupCreationUpdate struct { func (x *GroupCreationUpdate) Reset() { *x = GroupCreationUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[44] + mi := &file_backuppb_Backup_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6184,7 +6236,7 @@ func (x *GroupCreationUpdate) String() string { func (*GroupCreationUpdate) ProtoMessage() {} func (x *GroupCreationUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[44] + mi := &file_backuppb_Backup_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6197,7 +6249,7 @@ func (x *GroupCreationUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupCreationUpdate.ProtoReflect.Descriptor instead. func (*GroupCreationUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{44} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{45} } func (x *GroupCreationUpdate) GetUpdaterAci() []byte { @@ -6218,7 +6270,7 @@ type GroupNameUpdate struct { func (x *GroupNameUpdate) Reset() { *x = GroupNameUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[45] + mi := &file_backuppb_Backup_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6230,7 +6282,7 @@ func (x *GroupNameUpdate) String() string { func (*GroupNameUpdate) ProtoMessage() {} func (x *GroupNameUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[45] + mi := &file_backuppb_Backup_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6243,7 +6295,7 @@ func (x *GroupNameUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupNameUpdate.ProtoReflect.Descriptor instead. func (*GroupNameUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{45} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{46} } func (x *GroupNameUpdate) GetUpdaterAci() []byte { @@ -6270,7 +6322,7 @@ type GroupAvatarUpdate struct { func (x *GroupAvatarUpdate) Reset() { *x = GroupAvatarUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[46] + mi := &file_backuppb_Backup_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6282,7 +6334,7 @@ func (x *GroupAvatarUpdate) String() string { func (*GroupAvatarUpdate) ProtoMessage() {} func (x *GroupAvatarUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[46] + mi := &file_backuppb_Backup_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6295,7 +6347,7 @@ func (x *GroupAvatarUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupAvatarUpdate.ProtoReflect.Descriptor instead. func (*GroupAvatarUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{46} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{47} } func (x *GroupAvatarUpdate) GetUpdaterAci() []byte { @@ -6323,7 +6375,7 @@ type GroupDescriptionUpdate struct { func (x *GroupDescriptionUpdate) Reset() { *x = GroupDescriptionUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[47] + mi := &file_backuppb_Backup_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6335,7 +6387,7 @@ func (x *GroupDescriptionUpdate) String() string { func (*GroupDescriptionUpdate) ProtoMessage() {} func (x *GroupDescriptionUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[47] + mi := &file_backuppb_Backup_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6348,7 +6400,7 @@ func (x *GroupDescriptionUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupDescriptionUpdate.ProtoReflect.Descriptor instead. func (*GroupDescriptionUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{47} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{48} } func (x *GroupDescriptionUpdate) GetUpdaterAci() []byte { @@ -6375,7 +6427,7 @@ type GroupMembershipAccessLevelChangeUpdate struct { func (x *GroupMembershipAccessLevelChangeUpdate) Reset() { *x = GroupMembershipAccessLevelChangeUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[48] + mi := &file_backuppb_Backup_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6387,7 +6439,7 @@ func (x *GroupMembershipAccessLevelChangeUpdate) String() string { func (*GroupMembershipAccessLevelChangeUpdate) ProtoMessage() {} func (x *GroupMembershipAccessLevelChangeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[48] + mi := &file_backuppb_Backup_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6400,7 +6452,7 @@ func (x *GroupMembershipAccessLevelChangeUpdate) ProtoReflect() protoreflect.Mes // Deprecated: Use GroupMembershipAccessLevelChangeUpdate.ProtoReflect.Descriptor instead. func (*GroupMembershipAccessLevelChangeUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{48} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{49} } func (x *GroupMembershipAccessLevelChangeUpdate) GetUpdaterAci() []byte { @@ -6427,7 +6479,7 @@ type GroupAttributesAccessLevelChangeUpdate struct { func (x *GroupAttributesAccessLevelChangeUpdate) Reset() { *x = GroupAttributesAccessLevelChangeUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[49] + mi := &file_backuppb_Backup_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6439,7 +6491,7 @@ func (x *GroupAttributesAccessLevelChangeUpdate) String() string { func (*GroupAttributesAccessLevelChangeUpdate) ProtoMessage() {} func (x *GroupAttributesAccessLevelChangeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[49] + mi := &file_backuppb_Backup_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6452,7 +6504,7 @@ func (x *GroupAttributesAccessLevelChangeUpdate) ProtoReflect() protoreflect.Mes // Deprecated: Use GroupAttributesAccessLevelChangeUpdate.ProtoReflect.Descriptor instead. func (*GroupAttributesAccessLevelChangeUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{49} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{50} } func (x *GroupAttributesAccessLevelChangeUpdate) GetUpdaterAci() []byte { @@ -6469,6 +6521,102 @@ func (x *GroupAttributesAccessLevelChangeUpdate) GetAccessLevel() GroupV2AccessL return GroupV2AccessLevel_UNKNOWN } +type GroupMemberLabelAccessLevelChangeUpdate struct { + state protoimpl.MessageState `protogen:"open.v1"` + UpdaterAci []byte `protobuf:"bytes,1,opt,name=updaterAci,proto3,oneof" json:"updaterAci,omitempty"` + AccessLevel GroupV2AccessLevel `protobuf:"varint,2,opt,name=accessLevel,proto3,enum=signal.backup.GroupV2AccessLevel" json:"accessLevel,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupMemberLabelAccessLevelChangeUpdate) Reset() { + *x = GroupMemberLabelAccessLevelChangeUpdate{} + mi := &file_backuppb_Backup_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupMemberLabelAccessLevelChangeUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupMemberLabelAccessLevelChangeUpdate) ProtoMessage() {} + +func (x *GroupMemberLabelAccessLevelChangeUpdate) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[51] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupMemberLabelAccessLevelChangeUpdate.ProtoReflect.Descriptor instead. +func (*GroupMemberLabelAccessLevelChangeUpdate) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{51} +} + +func (x *GroupMemberLabelAccessLevelChangeUpdate) GetUpdaterAci() []byte { + if x != nil { + return x.UpdaterAci + } + return nil +} + +func (x *GroupMemberLabelAccessLevelChangeUpdate) GetAccessLevel() GroupV2AccessLevel { + if x != nil { + return x.AccessLevel + } + return GroupV2AccessLevel_UNKNOWN +} + +type GroupTerminateChangeUpdate struct { + state protoimpl.MessageState `protogen:"open.v1"` + UpdaterAci []byte `protobuf:"bytes,1,opt,name=updaterAci,proto3,oneof" json:"updaterAci,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GroupTerminateChangeUpdate) Reset() { + *x = GroupTerminateChangeUpdate{} + mi := &file_backuppb_Backup_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GroupTerminateChangeUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupTerminateChangeUpdate) ProtoMessage() {} + +func (x *GroupTerminateChangeUpdate) ProtoReflect() protoreflect.Message { + mi := &file_backuppb_Backup_proto_msgTypes[52] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupTerminateChangeUpdate.ProtoReflect.Descriptor instead. +func (*GroupTerminateChangeUpdate) Descriptor() ([]byte, []int) { + return file_backuppb_Backup_proto_rawDescGZIP(), []int{52} +} + +func (x *GroupTerminateChangeUpdate) GetUpdaterAci() []byte { + if x != nil { + return x.UpdaterAci + } + return nil +} + type GroupAnnouncementOnlyChangeUpdate struct { state protoimpl.MessageState `protogen:"open.v1"` UpdaterAci []byte `protobuf:"bytes,1,opt,name=updaterAci,proto3,oneof" json:"updaterAci,omitempty"` @@ -6479,7 +6627,7 @@ type GroupAnnouncementOnlyChangeUpdate struct { func (x *GroupAnnouncementOnlyChangeUpdate) Reset() { *x = GroupAnnouncementOnlyChangeUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[50] + mi := &file_backuppb_Backup_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6491,7 +6639,7 @@ func (x *GroupAnnouncementOnlyChangeUpdate) String() string { func (*GroupAnnouncementOnlyChangeUpdate) ProtoMessage() {} func (x *GroupAnnouncementOnlyChangeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[50] + mi := &file_backuppb_Backup_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6504,7 +6652,7 @@ func (x *GroupAnnouncementOnlyChangeUpdate) ProtoReflect() protoreflect.Message // Deprecated: Use GroupAnnouncementOnlyChangeUpdate.ProtoReflect.Descriptor instead. func (*GroupAnnouncementOnlyChangeUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{50} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{53} } func (x *GroupAnnouncementOnlyChangeUpdate) GetUpdaterAci() []byte { @@ -6533,7 +6681,7 @@ type GroupAdminStatusUpdate struct { func (x *GroupAdminStatusUpdate) Reset() { *x = GroupAdminStatusUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[51] + mi := &file_backuppb_Backup_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6545,7 +6693,7 @@ func (x *GroupAdminStatusUpdate) String() string { func (*GroupAdminStatusUpdate) ProtoMessage() {} func (x *GroupAdminStatusUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[51] + mi := &file_backuppb_Backup_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6558,7 +6706,7 @@ func (x *GroupAdminStatusUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupAdminStatusUpdate.ProtoReflect.Descriptor instead. func (*GroupAdminStatusUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{51} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{54} } func (x *GroupAdminStatusUpdate) GetUpdaterAci() []byte { @@ -6591,7 +6739,7 @@ type GroupMemberLeftUpdate struct { func (x *GroupMemberLeftUpdate) Reset() { *x = GroupMemberLeftUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[52] + mi := &file_backuppb_Backup_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6603,7 +6751,7 @@ func (x *GroupMemberLeftUpdate) String() string { func (*GroupMemberLeftUpdate) ProtoMessage() {} func (x *GroupMemberLeftUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[52] + mi := &file_backuppb_Backup_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6616,7 +6764,7 @@ func (x *GroupMemberLeftUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberLeftUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberLeftUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{52} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{55} } func (x *GroupMemberLeftUpdate) GetAci() []byte { @@ -6636,7 +6784,7 @@ type GroupMemberRemovedUpdate struct { func (x *GroupMemberRemovedUpdate) Reset() { *x = GroupMemberRemovedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[53] + mi := &file_backuppb_Backup_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6648,7 +6796,7 @@ func (x *GroupMemberRemovedUpdate) String() string { func (*GroupMemberRemovedUpdate) ProtoMessage() {} func (x *GroupMemberRemovedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[53] + mi := &file_backuppb_Backup_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6661,7 +6809,7 @@ func (x *GroupMemberRemovedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberRemovedUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberRemovedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{53} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{56} } func (x *GroupMemberRemovedUpdate) GetRemoverAci() []byte { @@ -6687,7 +6835,7 @@ type SelfInvitedToGroupUpdate struct { func (x *SelfInvitedToGroupUpdate) Reset() { *x = SelfInvitedToGroupUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[54] + mi := &file_backuppb_Backup_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6699,7 +6847,7 @@ func (x *SelfInvitedToGroupUpdate) String() string { func (*SelfInvitedToGroupUpdate) ProtoMessage() {} func (x *SelfInvitedToGroupUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[54] + mi := &file_backuppb_Backup_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6712,7 +6860,7 @@ func (x *SelfInvitedToGroupUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfInvitedToGroupUpdate.ProtoReflect.Descriptor instead. func (*SelfInvitedToGroupUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{54} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{57} } func (x *SelfInvitedToGroupUpdate) GetInviterAci() []byte { @@ -6732,7 +6880,7 @@ type SelfInvitedOtherUserToGroupUpdate struct { func (x *SelfInvitedOtherUserToGroupUpdate) Reset() { *x = SelfInvitedOtherUserToGroupUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[55] + mi := &file_backuppb_Backup_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6744,7 +6892,7 @@ func (x *SelfInvitedOtherUserToGroupUpdate) String() string { func (*SelfInvitedOtherUserToGroupUpdate) ProtoMessage() {} func (x *SelfInvitedOtherUserToGroupUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[55] + mi := &file_backuppb_Backup_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6757,7 +6905,7 @@ func (x *SelfInvitedOtherUserToGroupUpdate) ProtoReflect() protoreflect.Message // Deprecated: Use SelfInvitedOtherUserToGroupUpdate.ProtoReflect.Descriptor instead. func (*SelfInvitedOtherUserToGroupUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{55} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{58} } func (x *SelfInvitedOtherUserToGroupUpdate) GetInviteeServiceId() []byte { @@ -6778,7 +6926,7 @@ type GroupUnknownInviteeUpdate struct { func (x *GroupUnknownInviteeUpdate) Reset() { *x = GroupUnknownInviteeUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[56] + mi := &file_backuppb_Backup_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6790,7 +6938,7 @@ func (x *GroupUnknownInviteeUpdate) String() string { func (*GroupUnknownInviteeUpdate) ProtoMessage() {} func (x *GroupUnknownInviteeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[56] + mi := &file_backuppb_Backup_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6803,7 +6951,7 @@ func (x *GroupUnknownInviteeUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupUnknownInviteeUpdate.ProtoReflect.Descriptor instead. func (*GroupUnknownInviteeUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{56} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{59} } func (x *GroupUnknownInviteeUpdate) GetInviterAci() []byte { @@ -6830,7 +6978,7 @@ type GroupInvitationAcceptedUpdate struct { func (x *GroupInvitationAcceptedUpdate) Reset() { *x = GroupInvitationAcceptedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[57] + mi := &file_backuppb_Backup_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6842,7 +6990,7 @@ func (x *GroupInvitationAcceptedUpdate) String() string { func (*GroupInvitationAcceptedUpdate) ProtoMessage() {} func (x *GroupInvitationAcceptedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[57] + mi := &file_backuppb_Backup_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6855,7 +7003,7 @@ func (x *GroupInvitationAcceptedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInvitationAcceptedUpdate.ProtoReflect.Descriptor instead. func (*GroupInvitationAcceptedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{57} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{60} } func (x *GroupInvitationAcceptedUpdate) GetInviterAci() []byte { @@ -6883,7 +7031,7 @@ type GroupInvitationDeclinedUpdate struct { func (x *GroupInvitationDeclinedUpdate) Reset() { *x = GroupInvitationDeclinedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[58] + mi := &file_backuppb_Backup_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6895,7 +7043,7 @@ func (x *GroupInvitationDeclinedUpdate) String() string { func (*GroupInvitationDeclinedUpdate) ProtoMessage() {} func (x *GroupInvitationDeclinedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[58] + mi := &file_backuppb_Backup_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6908,7 +7056,7 @@ func (x *GroupInvitationDeclinedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInvitationDeclinedUpdate.ProtoReflect.Descriptor instead. func (*GroupInvitationDeclinedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{58} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{61} } func (x *GroupInvitationDeclinedUpdate) GetInviterAci() []byte { @@ -6934,7 +7082,7 @@ type GroupMemberJoinedUpdate struct { func (x *GroupMemberJoinedUpdate) Reset() { *x = GroupMemberJoinedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[59] + mi := &file_backuppb_Backup_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6946,7 +7094,7 @@ func (x *GroupMemberJoinedUpdate) String() string { func (*GroupMemberJoinedUpdate) ProtoMessage() {} func (x *GroupMemberJoinedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[59] + mi := &file_backuppb_Backup_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6959,7 +7107,7 @@ func (x *GroupMemberJoinedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberJoinedUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberJoinedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{59} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{62} } func (x *GroupMemberJoinedUpdate) GetNewMemberAci() []byte { @@ -6982,7 +7130,7 @@ type GroupMemberAddedUpdate struct { func (x *GroupMemberAddedUpdate) Reset() { *x = GroupMemberAddedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[60] + mi := &file_backuppb_Backup_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6994,7 +7142,7 @@ func (x *GroupMemberAddedUpdate) String() string { func (*GroupMemberAddedUpdate) ProtoMessage() {} func (x *GroupMemberAddedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[60] + mi := &file_backuppb_Backup_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7007,7 +7155,7 @@ func (x *GroupMemberAddedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberAddedUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberAddedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{60} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{63} } func (x *GroupMemberAddedUpdate) GetUpdaterAci() []byte { @@ -7048,7 +7196,7 @@ type GroupSelfInvitationRevokedUpdate struct { func (x *GroupSelfInvitationRevokedUpdate) Reset() { *x = GroupSelfInvitationRevokedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[61] + mi := &file_backuppb_Backup_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7060,7 +7208,7 @@ func (x *GroupSelfInvitationRevokedUpdate) String() string { func (*GroupSelfInvitationRevokedUpdate) ProtoMessage() {} func (x *GroupSelfInvitationRevokedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[61] + mi := &file_backuppb_Backup_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7073,7 +7221,7 @@ func (x *GroupSelfInvitationRevokedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupSelfInvitationRevokedUpdate.ProtoReflect.Descriptor instead. func (*GroupSelfInvitationRevokedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{61} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{64} } func (x *GroupSelfInvitationRevokedUpdate) GetRevokerAci() []byte { @@ -7099,7 +7247,7 @@ type GroupInvitationRevokedUpdate struct { func (x *GroupInvitationRevokedUpdate) Reset() { *x = GroupInvitationRevokedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[62] + mi := &file_backuppb_Backup_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7111,7 +7259,7 @@ func (x *GroupInvitationRevokedUpdate) String() string { func (*GroupInvitationRevokedUpdate) ProtoMessage() {} func (x *GroupInvitationRevokedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[62] + mi := &file_backuppb_Backup_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7124,7 +7272,7 @@ func (x *GroupInvitationRevokedUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInvitationRevokedUpdate.ProtoReflect.Descriptor instead. func (*GroupInvitationRevokedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{62} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{65} } func (x *GroupInvitationRevokedUpdate) GetUpdaterAci() []byte { @@ -7150,7 +7298,7 @@ type GroupJoinRequestUpdate struct { func (x *GroupJoinRequestUpdate) Reset() { *x = GroupJoinRequestUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[63] + mi := &file_backuppb_Backup_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7162,7 +7310,7 @@ func (x *GroupJoinRequestUpdate) String() string { func (*GroupJoinRequestUpdate) ProtoMessage() {} func (x *GroupJoinRequestUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[63] + mi := &file_backuppb_Backup_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7175,7 +7323,7 @@ func (x *GroupJoinRequestUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupJoinRequestUpdate.ProtoReflect.Descriptor instead. func (*GroupJoinRequestUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{63} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{66} } func (x *GroupJoinRequestUpdate) GetRequestorAci() []byte { @@ -7197,7 +7345,7 @@ type GroupJoinRequestApprovalUpdate struct { func (x *GroupJoinRequestApprovalUpdate) Reset() { *x = GroupJoinRequestApprovalUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[64] + mi := &file_backuppb_Backup_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7209,7 +7357,7 @@ func (x *GroupJoinRequestApprovalUpdate) String() string { func (*GroupJoinRequestApprovalUpdate) ProtoMessage() {} func (x *GroupJoinRequestApprovalUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[64] + mi := &file_backuppb_Backup_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7222,7 +7370,7 @@ func (x *GroupJoinRequestApprovalUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupJoinRequestApprovalUpdate.ProtoReflect.Descriptor instead. func (*GroupJoinRequestApprovalUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{64} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{67} } func (x *GroupJoinRequestApprovalUpdate) GetRequestorAci() []byte { @@ -7255,7 +7403,7 @@ type GroupJoinRequestCanceledUpdate struct { func (x *GroupJoinRequestCanceledUpdate) Reset() { *x = GroupJoinRequestCanceledUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[65] + mi := &file_backuppb_Backup_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7267,7 +7415,7 @@ func (x *GroupJoinRequestCanceledUpdate) String() string { func (*GroupJoinRequestCanceledUpdate) ProtoMessage() {} func (x *GroupJoinRequestCanceledUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[65] + mi := &file_backuppb_Backup_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7280,7 +7428,7 @@ func (x *GroupJoinRequestCanceledUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupJoinRequestCanceledUpdate.ProtoReflect.Descriptor instead. func (*GroupJoinRequestCanceledUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{65} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{68} } func (x *GroupJoinRequestCanceledUpdate) GetRequestorAci() []byte { @@ -7306,7 +7454,7 @@ type GroupSequenceOfRequestsAndCancelsUpdate struct { func (x *GroupSequenceOfRequestsAndCancelsUpdate) Reset() { *x = GroupSequenceOfRequestsAndCancelsUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[66] + mi := &file_backuppb_Backup_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7318,7 +7466,7 @@ func (x *GroupSequenceOfRequestsAndCancelsUpdate) String() string { func (*GroupSequenceOfRequestsAndCancelsUpdate) ProtoMessage() {} func (x *GroupSequenceOfRequestsAndCancelsUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[66] + mi := &file_backuppb_Backup_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7331,7 +7479,7 @@ func (x *GroupSequenceOfRequestsAndCancelsUpdate) ProtoReflect() protoreflect.Me // Deprecated: Use GroupSequenceOfRequestsAndCancelsUpdate.ProtoReflect.Descriptor instead. func (*GroupSequenceOfRequestsAndCancelsUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{66} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{69} } func (x *GroupSequenceOfRequestsAndCancelsUpdate) GetRequestorAci() []byte { @@ -7357,7 +7505,7 @@ type GroupInviteLinkResetUpdate struct { func (x *GroupInviteLinkResetUpdate) Reset() { *x = GroupInviteLinkResetUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[67] + mi := &file_backuppb_Backup_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7369,7 +7517,7 @@ func (x *GroupInviteLinkResetUpdate) String() string { func (*GroupInviteLinkResetUpdate) ProtoMessage() {} func (x *GroupInviteLinkResetUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[67] + mi := &file_backuppb_Backup_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7382,7 +7530,7 @@ func (x *GroupInviteLinkResetUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInviteLinkResetUpdate.ProtoReflect.Descriptor instead. func (*GroupInviteLinkResetUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{67} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{70} } func (x *GroupInviteLinkResetUpdate) GetUpdaterAci() []byte { @@ -7402,7 +7550,7 @@ type GroupInviteLinkEnabledUpdate struct { func (x *GroupInviteLinkEnabledUpdate) Reset() { *x = GroupInviteLinkEnabledUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[68] + mi := &file_backuppb_Backup_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7414,7 +7562,7 @@ func (x *GroupInviteLinkEnabledUpdate) String() string { func (*GroupInviteLinkEnabledUpdate) ProtoMessage() {} func (x *GroupInviteLinkEnabledUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[68] + mi := &file_backuppb_Backup_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7427,7 +7575,7 @@ func (x *GroupInviteLinkEnabledUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInviteLinkEnabledUpdate.ProtoReflect.Descriptor instead. func (*GroupInviteLinkEnabledUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{68} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{71} } func (x *GroupInviteLinkEnabledUpdate) GetUpdaterAci() []byte { @@ -7454,7 +7602,7 @@ type GroupInviteLinkAdminApprovalUpdate struct { func (x *GroupInviteLinkAdminApprovalUpdate) Reset() { *x = GroupInviteLinkAdminApprovalUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[69] + mi := &file_backuppb_Backup_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7466,7 +7614,7 @@ func (x *GroupInviteLinkAdminApprovalUpdate) String() string { func (*GroupInviteLinkAdminApprovalUpdate) ProtoMessage() {} func (x *GroupInviteLinkAdminApprovalUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[69] + mi := &file_backuppb_Backup_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7479,7 +7627,7 @@ func (x *GroupInviteLinkAdminApprovalUpdate) ProtoReflect() protoreflect.Message // Deprecated: Use GroupInviteLinkAdminApprovalUpdate.ProtoReflect.Descriptor instead. func (*GroupInviteLinkAdminApprovalUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{69} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{72} } func (x *GroupInviteLinkAdminApprovalUpdate) GetUpdaterAci() []byte { @@ -7505,7 +7653,7 @@ type GroupInviteLinkDisabledUpdate struct { func (x *GroupInviteLinkDisabledUpdate) Reset() { *x = GroupInviteLinkDisabledUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[70] + mi := &file_backuppb_Backup_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7517,7 +7665,7 @@ func (x *GroupInviteLinkDisabledUpdate) String() string { func (*GroupInviteLinkDisabledUpdate) ProtoMessage() {} func (x *GroupInviteLinkDisabledUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[70] + mi := &file_backuppb_Backup_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7530,7 +7678,7 @@ func (x *GroupInviteLinkDisabledUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupInviteLinkDisabledUpdate.ProtoReflect.Descriptor instead. func (*GroupInviteLinkDisabledUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{70} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{73} } func (x *GroupInviteLinkDisabledUpdate) GetUpdaterAci() []byte { @@ -7549,7 +7697,7 @@ type GroupMemberJoinedByLinkUpdate struct { func (x *GroupMemberJoinedByLinkUpdate) Reset() { *x = GroupMemberJoinedByLinkUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[71] + mi := &file_backuppb_Backup_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7561,7 +7709,7 @@ func (x *GroupMemberJoinedByLinkUpdate) String() string { func (*GroupMemberJoinedByLinkUpdate) ProtoMessage() {} func (x *GroupMemberJoinedByLinkUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[71] + mi := &file_backuppb_Backup_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7574,7 +7722,7 @@ func (x *GroupMemberJoinedByLinkUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupMemberJoinedByLinkUpdate.ProtoReflect.Descriptor instead. func (*GroupMemberJoinedByLinkUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{71} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{74} } func (x *GroupMemberJoinedByLinkUpdate) GetNewMemberAci() []byte { @@ -7593,7 +7741,7 @@ type GroupV2MigrationUpdate struct { func (x *GroupV2MigrationUpdate) Reset() { *x = GroupV2MigrationUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[72] + mi := &file_backuppb_Backup_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7605,7 +7753,7 @@ func (x *GroupV2MigrationUpdate) String() string { func (*GroupV2MigrationUpdate) ProtoMessage() {} func (x *GroupV2MigrationUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[72] + mi := &file_backuppb_Backup_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7618,7 +7766,7 @@ func (x *GroupV2MigrationUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupV2MigrationUpdate.ProtoReflect.Descriptor instead. func (*GroupV2MigrationUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{72} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{75} } // Another user migrated gv1->gv2 but was unable to add @@ -7631,7 +7779,7 @@ type GroupV2MigrationSelfInvitedUpdate struct { func (x *GroupV2MigrationSelfInvitedUpdate) Reset() { *x = GroupV2MigrationSelfInvitedUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[73] + mi := &file_backuppb_Backup_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7643,7 +7791,7 @@ func (x *GroupV2MigrationSelfInvitedUpdate) String() string { func (*GroupV2MigrationSelfInvitedUpdate) ProtoMessage() {} func (x *GroupV2MigrationSelfInvitedUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[73] + mi := &file_backuppb_Backup_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7656,7 +7804,7 @@ func (x *GroupV2MigrationSelfInvitedUpdate) ProtoReflect() protoreflect.Message // Deprecated: Use GroupV2MigrationSelfInvitedUpdate.ProtoReflect.Descriptor instead. func (*GroupV2MigrationSelfInvitedUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{73} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{76} } // The local user migrated gv1->gv2 but was unable to @@ -7671,7 +7819,7 @@ type GroupV2MigrationInvitedMembersUpdate struct { func (x *GroupV2MigrationInvitedMembersUpdate) Reset() { *x = GroupV2MigrationInvitedMembersUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[74] + mi := &file_backuppb_Backup_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7683,7 +7831,7 @@ func (x *GroupV2MigrationInvitedMembersUpdate) String() string { func (*GroupV2MigrationInvitedMembersUpdate) ProtoMessage() {} func (x *GroupV2MigrationInvitedMembersUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[74] + mi := &file_backuppb_Backup_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7696,7 +7844,7 @@ func (x *GroupV2MigrationInvitedMembersUpdate) ProtoReflect() protoreflect.Messa // Deprecated: Use GroupV2MigrationInvitedMembersUpdate.ProtoReflect.Descriptor instead. func (*GroupV2MigrationInvitedMembersUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{74} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{77} } func (x *GroupV2MigrationInvitedMembersUpdate) GetInvitedMembersCount() uint32 { @@ -7718,7 +7866,7 @@ type GroupV2MigrationDroppedMembersUpdate struct { func (x *GroupV2MigrationDroppedMembersUpdate) Reset() { *x = GroupV2MigrationDroppedMembersUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[75] + mi := &file_backuppb_Backup_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7730,7 +7878,7 @@ func (x *GroupV2MigrationDroppedMembersUpdate) String() string { func (*GroupV2MigrationDroppedMembersUpdate) ProtoMessage() {} func (x *GroupV2MigrationDroppedMembersUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[75] + mi := &file_backuppb_Backup_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7743,7 +7891,7 @@ func (x *GroupV2MigrationDroppedMembersUpdate) ProtoReflect() protoreflect.Messa // Deprecated: Use GroupV2MigrationDroppedMembersUpdate.ProtoReflect.Descriptor instead. func (*GroupV2MigrationDroppedMembersUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{75} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{78} } func (x *GroupV2MigrationDroppedMembersUpdate) GetDroppedMembersCount() uint32 { @@ -7764,7 +7912,7 @@ type GroupExpirationTimerUpdate struct { func (x *GroupExpirationTimerUpdate) Reset() { *x = GroupExpirationTimerUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[76] + mi := &file_backuppb_Backup_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7776,7 +7924,7 @@ func (x *GroupExpirationTimerUpdate) String() string { func (*GroupExpirationTimerUpdate) ProtoMessage() {} func (x *GroupExpirationTimerUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[76] + mi := &file_backuppb_Backup_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7789,7 +7937,7 @@ func (x *GroupExpirationTimerUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupExpirationTimerUpdate.ProtoReflect.Descriptor instead. func (*GroupExpirationTimerUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{76} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{79} } func (x *GroupExpirationTimerUpdate) GetExpiresInMs() uint64 { @@ -7816,7 +7964,7 @@ type PollTerminateUpdate struct { func (x *PollTerminateUpdate) Reset() { *x = PollTerminateUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[77] + mi := &file_backuppb_Backup_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7828,7 +7976,7 @@ func (x *PollTerminateUpdate) String() string { func (*PollTerminateUpdate) ProtoMessage() {} func (x *PollTerminateUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[77] + mi := &file_backuppb_Backup_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7841,7 +7989,7 @@ func (x *PollTerminateUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use PollTerminateUpdate.ProtoReflect.Descriptor instead. func (*PollTerminateUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{77} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{80} } func (x *PollTerminateUpdate) GetTargetSentTimestamp() uint64 { @@ -7868,7 +8016,7 @@ type PinMessageUpdate struct { func (x *PinMessageUpdate) Reset() { *x = PinMessageUpdate{} - mi := &file_backuppb_Backup_proto_msgTypes[78] + mi := &file_backuppb_Backup_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7880,7 +8028,7 @@ func (x *PinMessageUpdate) String() string { func (*PinMessageUpdate) ProtoMessage() {} func (x *PinMessageUpdate) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[78] + mi := &file_backuppb_Backup_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7893,7 +8041,7 @@ func (x *PinMessageUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use PinMessageUpdate.ProtoReflect.Descriptor instead. func (*PinMessageUpdate) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{78} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{81} } func (x *PinMessageUpdate) GetTargetSentTimestamp() uint64 { @@ -7920,7 +8068,7 @@ type StickerPack struct { func (x *StickerPack) Reset() { *x = StickerPack{} - mi := &file_backuppb_Backup_proto_msgTypes[79] + mi := &file_backuppb_Backup_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7932,7 +8080,7 @@ func (x *StickerPack) String() string { func (*StickerPack) ProtoMessage() {} func (x *StickerPack) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[79] + mi := &file_backuppb_Backup_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7945,7 +8093,7 @@ func (x *StickerPack) ProtoReflect() protoreflect.Message { // Deprecated: Use StickerPack.ProtoReflect.Descriptor instead. func (*StickerPack) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{79} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{82} } func (x *StickerPack) GetPackId() []byte { @@ -7986,7 +8134,7 @@ type ChatStyle struct { func (x *ChatStyle) Reset() { *x = ChatStyle{} - mi := &file_backuppb_Backup_proto_msgTypes[80] + mi := &file_backuppb_Backup_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7998,7 +8146,7 @@ func (x *ChatStyle) String() string { func (*ChatStyle) ProtoMessage() {} func (x *ChatStyle) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[80] + mi := &file_backuppb_Backup_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8011,7 +8159,7 @@ func (x *ChatStyle) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle.ProtoReflect.Descriptor instead. func (*ChatStyle) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{80} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{83} } func (x *ChatStyle) GetWallpaper() isChatStyle_Wallpaper { @@ -8143,7 +8291,7 @@ type NotificationProfile struct { func (x *NotificationProfile) Reset() { *x = NotificationProfile{} - mi := &file_backuppb_Backup_proto_msgTypes[81] + mi := &file_backuppb_Backup_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8155,7 +8303,7 @@ func (x *NotificationProfile) String() string { func (*NotificationProfile) ProtoMessage() {} func (x *NotificationProfile) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[81] + mi := &file_backuppb_Backup_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8168,7 +8316,7 @@ func (x *NotificationProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use NotificationProfile.ProtoReflect.Descriptor instead. func (*NotificationProfile) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{81} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{84} } func (x *NotificationProfile) GetName() string { @@ -8274,7 +8422,7 @@ type ChatFolder struct { func (x *ChatFolder) Reset() { *x = ChatFolder{} - mi := &file_backuppb_Backup_proto_msgTypes[82] + mi := &file_backuppb_Backup_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8286,7 +8434,7 @@ func (x *ChatFolder) String() string { func (*ChatFolder) ProtoMessage() {} func (x *ChatFolder) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[82] + mi := &file_backuppb_Backup_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8299,7 +8447,7 @@ func (x *ChatFolder) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatFolder.ProtoReflect.Descriptor instead. func (*ChatFolder) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{82} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{85} } func (x *ChatFolder) GetName() string { @@ -8376,7 +8524,7 @@ type AccountData_UsernameLink struct { func (x *AccountData_UsernameLink) Reset() { *x = AccountData_UsernameLink{} - mi := &file_backuppb_Backup_proto_msgTypes[83] + mi := &file_backuppb_Backup_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8388,7 +8536,7 @@ func (x *AccountData_UsernameLink) String() string { func (*AccountData_UsernameLink) ProtoMessage() {} func (x *AccountData_UsernameLink) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[83] + mi := &file_backuppb_Backup_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8437,7 +8585,7 @@ type AccountData_AutoDownloadSettings struct { func (x *AccountData_AutoDownloadSettings) Reset() { *x = AccountData_AutoDownloadSettings{} - mi := &file_backuppb_Backup_proto_msgTypes[84] + mi := &file_backuppb_Backup_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8449,7 +8597,7 @@ func (x *AccountData_AutoDownloadSettings) String() string { func (*AccountData_AutoDownloadSettings) ProtoMessage() {} func (x *AccountData_AutoDownloadSettings) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[84] + mi := &file_backuppb_Backup_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8516,22 +8664,23 @@ type AccountData_AccountSettings struct { CustomChatColors []*ChatStyle_CustomChatColor `protobuf:"bytes,19,rep,name=customChatColors,proto3" json:"customChatColors,omitempty"` OptimizeOnDeviceStorage bool `protobuf:"varint,20,opt,name=optimizeOnDeviceStorage,proto3" json:"optimizeOnDeviceStorage,omitempty"` // See zkgroup for integer particular values. Unset if backups are not enabled. - BackupTier *uint64 `protobuf:"varint,21,opt,name=backupTier,proto3,oneof" json:"backupTier,omitempty"` - DefaultSentMediaQuality AccountData_SentMediaQuality `protobuf:"varint,23,opt,name=defaultSentMediaQuality,proto3,enum=signal.backup.AccountData_SentMediaQuality" json:"defaultSentMediaQuality,omitempty"` - AutoDownloadSettings *AccountData_AutoDownloadSettings `protobuf:"bytes,24,opt,name=autoDownloadSettings,proto3" json:"autoDownloadSettings,omitempty"` - ScreenLockTimeoutMinutes *uint32 `protobuf:"varint,26,opt,name=screenLockTimeoutMinutes,proto3,oneof" json:"screenLockTimeoutMinutes,omitempty"` // If unset, consider screen lock to be disabled. - PinReminders *bool `protobuf:"varint,27,opt,name=pinReminders,proto3,oneof" json:"pinReminders,omitempty"` // If unset, consider pin reminders to be enabled. - AppTheme AccountData_AppTheme `protobuf:"varint,28,opt,name=appTheme,proto3,enum=signal.backup.AccountData_AppTheme" json:"appTheme,omitempty"` // If unset, treat the same as "Unknown" case - CallsUseLessDataSetting AccountData_CallsUseLessDataSetting `protobuf:"varint,29,opt,name=callsUseLessDataSetting,proto3,enum=signal.backup.AccountData_CallsUseLessDataSetting" json:"callsUseLessDataSetting,omitempty"` // If unset, treat the same as "Unknown" case - AllowSealedSenderFromAnyone bool `protobuf:"varint,30,opt,name=allowSealedSenderFromAnyone,proto3" json:"allowSealedSenderFromAnyone,omitempty"` - AllowAutomaticKeyVerification bool `protobuf:"varint,31,opt,name=allowAutomaticKeyVerification,proto3" json:"allowAutomaticKeyVerification,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + BackupTier *uint64 `protobuf:"varint,21,opt,name=backupTier,proto3,oneof" json:"backupTier,omitempty"` + DefaultSentMediaQuality AccountData_SentMediaQuality `protobuf:"varint,23,opt,name=defaultSentMediaQuality,proto3,enum=signal.backup.AccountData_SentMediaQuality" json:"defaultSentMediaQuality,omitempty"` + AutoDownloadSettings *AccountData_AutoDownloadSettings `protobuf:"bytes,24,opt,name=autoDownloadSettings,proto3" json:"autoDownloadSettings,omitempty"` + ScreenLockTimeoutMinutes *uint32 `protobuf:"varint,26,opt,name=screenLockTimeoutMinutes,proto3,oneof" json:"screenLockTimeoutMinutes,omitempty"` // If unset, consider screen lock to be disabled. + PinReminders *bool `protobuf:"varint,27,opt,name=pinReminders,proto3,oneof" json:"pinReminders,omitempty"` // If unset, consider pin reminders to be enabled. + AppTheme AccountData_AppTheme `protobuf:"varint,28,opt,name=appTheme,proto3,enum=signal.backup.AccountData_AppTheme" json:"appTheme,omitempty"` // If unset, treat the same as "Unknown" case + CallsUseLessDataSetting AccountData_CallsUseLessDataSetting `protobuf:"varint,29,opt,name=callsUseLessDataSetting,proto3,enum=signal.backup.AccountData_CallsUseLessDataSetting" json:"callsUseLessDataSetting,omitempty"` // If unset, treat the same as "Unknown" case + AllowSealedSenderFromAnyone bool `protobuf:"varint,30,opt,name=allowSealedSenderFromAnyone,proto3" json:"allowSealedSenderFromAnyone,omitempty"` + AllowAutomaticKeyVerification bool `protobuf:"varint,31,opt,name=allowAutomaticKeyVerification,proto3" json:"allowAutomaticKeyVerification,omitempty"` + HasSeenAdminDeleteEducationDialog bool `protobuf:"varint,32,opt,name=hasSeenAdminDeleteEducationDialog,proto3" json:"hasSeenAdminDeleteEducationDialog,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AccountData_AccountSettings) Reset() { *x = AccountData_AccountSettings{} - mi := &file_backuppb_Backup_proto_msgTypes[85] + mi := &file_backuppb_Backup_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8543,7 +8692,7 @@ func (x *AccountData_AccountSettings) String() string { func (*AccountData_AccountSettings) ProtoMessage() {} func (x *AccountData_AccountSettings) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[85] + mi := &file_backuppb_Backup_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8762,6 +8911,13 @@ func (x *AccountData_AccountSettings) GetAllowAutomaticKeyVerification() bool { return false } +func (x *AccountData_AccountSettings) GetHasSeenAdminDeleteEducationDialog() bool { + if x != nil { + return x.HasSeenAdminDeleteEducationDialog + } + return false +} + type AccountData_SubscriberData struct { state protoimpl.MessageState `protogen:"open.v1"` SubscriberId []byte `protobuf:"bytes,1,opt,name=subscriberId,proto3" json:"subscriberId,omitempty"` @@ -8773,7 +8929,7 @@ type AccountData_SubscriberData struct { func (x *AccountData_SubscriberData) Reset() { *x = AccountData_SubscriberData{} - mi := &file_backuppb_Backup_proto_msgTypes[86] + mi := &file_backuppb_Backup_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8785,7 +8941,7 @@ func (x *AccountData_SubscriberData) String() string { func (*AccountData_SubscriberData) ProtoMessage() {} func (x *AccountData_SubscriberData) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[86] + mi := &file_backuppb_Backup_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8838,7 +8994,7 @@ type AccountData_IAPSubscriberData struct { func (x *AccountData_IAPSubscriberData) Reset() { *x = AccountData_IAPSubscriberData{} - mi := &file_backuppb_Backup_proto_msgTypes[87] + mi := &file_backuppb_Backup_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8850,7 +9006,7 @@ func (x *AccountData_IAPSubscriberData) String() string { func (*AccountData_IAPSubscriberData) ProtoMessage() {} func (x *AccountData_IAPSubscriberData) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[87] + mi := &file_backuppb_Backup_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8929,7 +9085,7 @@ type AccountData_AndroidSpecificSettings struct { func (x *AccountData_AndroidSpecificSettings) Reset() { *x = AccountData_AndroidSpecificSettings{} - mi := &file_backuppb_Backup_proto_msgTypes[88] + mi := &file_backuppb_Backup_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8941,7 +9097,7 @@ func (x *AccountData_AndroidSpecificSettings) String() string { func (*AccountData_AndroidSpecificSettings) ProtoMessage() {} func (x *AccountData_AndroidSpecificSettings) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[88] + mi := &file_backuppb_Backup_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8986,7 +9142,7 @@ type Contact_Registered struct { func (x *Contact_Registered) Reset() { *x = Contact_Registered{} - mi := &file_backuppb_Backup_proto_msgTypes[89] + mi := &file_backuppb_Backup_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8998,7 +9154,7 @@ func (x *Contact_Registered) String() string { func (*Contact_Registered) ProtoMessage() {} func (x *Contact_Registered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[89] + mi := &file_backuppb_Backup_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9023,7 +9179,7 @@ type Contact_NotRegistered struct { func (x *Contact_NotRegistered) Reset() { *x = Contact_NotRegistered{} - mi := &file_backuppb_Backup_proto_msgTypes[90] + mi := &file_backuppb_Backup_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9035,7 +9191,7 @@ func (x *Contact_NotRegistered) String() string { func (*Contact_NotRegistered) ProtoMessage() {} func (x *Contact_NotRegistered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[90] + mi := &file_backuppb_Backup_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9068,7 +9224,7 @@ type Contact_Name struct { func (x *Contact_Name) Reset() { *x = Contact_Name{} - mi := &file_backuppb_Backup_proto_msgTypes[91] + mi := &file_backuppb_Backup_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9080,7 +9236,7 @@ func (x *Contact_Name) String() string { func (*Contact_Name) ProtoMessage() {} func (x *Contact_Name) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[91] + mi := &file_backuppb_Backup_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9129,13 +9285,14 @@ type Group_GroupSnapshot struct { InviteLinkPassword []byte `protobuf:"bytes,10,opt,name=inviteLinkPassword,proto3" json:"inviteLinkPassword,omitempty"` AnnouncementsOnly bool `protobuf:"varint,12,opt,name=announcements_only,json=announcementsOnly,proto3" json:"announcements_only,omitempty"` MembersBanned []*Group_MemberBanned `protobuf:"bytes,13,rep,name=members_banned,json=membersBanned,proto3" json:"members_banned,omitempty"` + Terminated bool `protobuf:"varint,14,opt,name=terminated,proto3" json:"terminated,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *Group_GroupSnapshot) Reset() { *x = Group_GroupSnapshot{} - mi := &file_backuppb_Backup_proto_msgTypes[92] + mi := &file_backuppb_Backup_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9147,7 +9304,7 @@ func (x *Group_GroupSnapshot) String() string { func (*Group_GroupSnapshot) ProtoMessage() {} func (x *Group_GroupSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[92] + mi := &file_backuppb_Backup_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9247,6 +9404,13 @@ func (x *Group_GroupSnapshot) GetMembersBanned() []*Group_MemberBanned { return nil } +func (x *Group_GroupSnapshot) GetTerminated() bool { + if x != nil { + return x.Terminated + } + return false +} + type Group_GroupAttributeBlob struct { state protoimpl.MessageState `protogen:"open.v1"` // If unset, consider the field it represents to not be present @@ -9264,7 +9428,7 @@ type Group_GroupAttributeBlob struct { func (x *Group_GroupAttributeBlob) Reset() { *x = Group_GroupAttributeBlob{} - mi := &file_backuppb_Backup_proto_msgTypes[93] + mi := &file_backuppb_Backup_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9276,7 +9440,7 @@ func (x *Group_GroupAttributeBlob) String() string { func (*Group_GroupAttributeBlob) ProtoMessage() {} func (x *Group_GroupAttributeBlob) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[93] + mi := &file_backuppb_Backup_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9368,13 +9532,15 @@ type Group_Member struct { UserId []byte `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` Role Group_Member_Role `protobuf:"varint,2,opt,name=role,proto3,enum=signal.backup.Group_Member_Role" json:"role,omitempty"` JoinedAtVersion uint32 `protobuf:"varint,5,opt,name=joinedAtVersion,proto3" json:"joinedAtVersion,omitempty"` + LabelEmoji string `protobuf:"bytes,6,opt,name=labelEmoji,proto3" json:"labelEmoji,omitempty"` + LabelString string `protobuf:"bytes,7,opt,name=labelString,proto3" json:"labelString,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *Group_Member) Reset() { *x = Group_Member{} - mi := &file_backuppb_Backup_proto_msgTypes[94] + mi := &file_backuppb_Backup_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9386,7 +9552,7 @@ func (x *Group_Member) String() string { func (*Group_Member) ProtoMessage() {} func (x *Group_Member) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[94] + mi := &file_backuppb_Backup_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9423,6 +9589,20 @@ func (x *Group_Member) GetJoinedAtVersion() uint32 { return 0 } +func (x *Group_Member) GetLabelEmoji() string { + if x != nil { + return x.LabelEmoji + } + return "" +} + +func (x *Group_Member) GetLabelString() string { + if x != nil { + return x.LabelString + } + return "" +} + type Group_MemberPendingProfileKey struct { state protoimpl.MessageState `protogen:"open.v1"` Member *Group_Member `protobuf:"bytes,1,opt,name=member,proto3" json:"member,omitempty"` @@ -9434,7 +9614,7 @@ type Group_MemberPendingProfileKey struct { func (x *Group_MemberPendingProfileKey) Reset() { *x = Group_MemberPendingProfileKey{} - mi := &file_backuppb_Backup_proto_msgTypes[95] + mi := &file_backuppb_Backup_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9446,7 +9626,7 @@ func (x *Group_MemberPendingProfileKey) String() string { func (*Group_MemberPendingProfileKey) ProtoMessage() {} func (x *Group_MemberPendingProfileKey) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[95] + mi := &file_backuppb_Backup_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9493,7 +9673,7 @@ type Group_MemberPendingAdminApproval struct { func (x *Group_MemberPendingAdminApproval) Reset() { *x = Group_MemberPendingAdminApproval{} - mi := &file_backuppb_Backup_proto_msgTypes[96] + mi := &file_backuppb_Backup_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9505,7 +9685,7 @@ func (x *Group_MemberPendingAdminApproval) String() string { func (*Group_MemberPendingAdminApproval) ProtoMessage() {} func (x *Group_MemberPendingAdminApproval) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[96] + mi := &file_backuppb_Backup_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9545,7 +9725,7 @@ type Group_MemberBanned struct { func (x *Group_MemberBanned) Reset() { *x = Group_MemberBanned{} - mi := &file_backuppb_Backup_proto_msgTypes[97] + mi := &file_backuppb_Backup_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9557,7 +9737,7 @@ func (x *Group_MemberBanned) String() string { func (*Group_MemberBanned) ProtoMessage() {} func (x *Group_MemberBanned) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[97] + mi := &file_backuppb_Backup_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9592,13 +9772,14 @@ type Group_AccessControl struct { Attributes Group_AccessControl_AccessRequired `protobuf:"varint,1,opt,name=attributes,proto3,enum=signal.backup.Group_AccessControl_AccessRequired" json:"attributes,omitempty"` Members Group_AccessControl_AccessRequired `protobuf:"varint,2,opt,name=members,proto3,enum=signal.backup.Group_AccessControl_AccessRequired" json:"members,omitempty"` AddFromInviteLink Group_AccessControl_AccessRequired `protobuf:"varint,3,opt,name=addFromInviteLink,proto3,enum=signal.backup.Group_AccessControl_AccessRequired" json:"addFromInviteLink,omitempty"` + MemberLabel Group_AccessControl_AccessRequired `protobuf:"varint,4,opt,name=memberLabel,proto3,enum=signal.backup.Group_AccessControl_AccessRequired" json:"memberLabel,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *Group_AccessControl) Reset() { *x = Group_AccessControl{} - mi := &file_backuppb_Backup_proto_msgTypes[98] + mi := &file_backuppb_Backup_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9610,7 +9791,7 @@ func (x *Group_AccessControl) String() string { func (*Group_AccessControl) ProtoMessage() {} func (x *Group_AccessControl) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[98] + mi := &file_backuppb_Backup_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9647,6 +9828,13 @@ func (x *Group_AccessControl) GetAddFromInviteLink() Group_AccessControl_AccessR return Group_AccessControl_UNKNOWN } +func (x *Group_AccessControl) GetMemberLabel() Group_AccessControl_AccessRequired { + if x != nil { + return x.MemberLabel + } + return Group_AccessControl_UNKNOWN +} + type ChatItem_IncomingMessageDetails struct { state protoimpl.MessageState `protogen:"open.v1"` DateReceived uint64 `protobuf:"varint,1,opt,name=dateReceived,proto3" json:"dateReceived,omitempty"` @@ -9659,7 +9847,7 @@ type ChatItem_IncomingMessageDetails struct { func (x *ChatItem_IncomingMessageDetails) Reset() { *x = ChatItem_IncomingMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[99] + mi := &file_backuppb_Backup_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9671,7 +9859,7 @@ func (x *ChatItem_IncomingMessageDetails) String() string { func (*ChatItem_IncomingMessageDetails) ProtoMessage() {} func (x *ChatItem_IncomingMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[99] + mi := &file_backuppb_Backup_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9725,7 +9913,7 @@ type ChatItem_OutgoingMessageDetails struct { func (x *ChatItem_OutgoingMessageDetails) Reset() { *x = ChatItem_OutgoingMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[100] + mi := &file_backuppb_Backup_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9737,7 +9925,7 @@ func (x *ChatItem_OutgoingMessageDetails) String() string { func (*ChatItem_OutgoingMessageDetails) ProtoMessage() {} func (x *ChatItem_OutgoingMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[100] + mi := &file_backuppb_Backup_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9775,7 +9963,7 @@ type ChatItem_DirectionlessMessageDetails struct { func (x *ChatItem_DirectionlessMessageDetails) Reset() { *x = ChatItem_DirectionlessMessageDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[101] + mi := &file_backuppb_Backup_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9787,7 +9975,7 @@ func (x *ChatItem_DirectionlessMessageDetails) String() string { func (*ChatItem_DirectionlessMessageDetails) ProtoMessage() {} func (x *ChatItem_DirectionlessMessageDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[101] + mi := &file_backuppb_Backup_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9817,7 +10005,7 @@ type ChatItem_PinDetails struct { func (x *ChatItem_PinDetails) Reset() { *x = ChatItem_PinDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[102] + mi := &file_backuppb_Backup_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9829,7 +10017,7 @@ func (x *ChatItem_PinDetails) String() string { func (*ChatItem_PinDetails) ProtoMessage() {} func (x *ChatItem_PinDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[102] + mi := &file_backuppb_Backup_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9901,7 +10089,7 @@ type SendStatus_Pending struct { func (x *SendStatus_Pending) Reset() { *x = SendStatus_Pending{} - mi := &file_backuppb_Backup_proto_msgTypes[103] + mi := &file_backuppb_Backup_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9913,7 +10101,7 @@ func (x *SendStatus_Pending) String() string { func (*SendStatus_Pending) ProtoMessage() {} func (x *SendStatus_Pending) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[103] + mi := &file_backuppb_Backup_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9938,7 +10126,7 @@ type SendStatus_Sent struct { func (x *SendStatus_Sent) Reset() { *x = SendStatus_Sent{} - mi := &file_backuppb_Backup_proto_msgTypes[104] + mi := &file_backuppb_Backup_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9950,7 +10138,7 @@ func (x *SendStatus_Sent) String() string { func (*SendStatus_Sent) ProtoMessage() {} func (x *SendStatus_Sent) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[104] + mi := &file_backuppb_Backup_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9982,7 +10170,7 @@ type SendStatus_Delivered struct { func (x *SendStatus_Delivered) Reset() { *x = SendStatus_Delivered{} - mi := &file_backuppb_Backup_proto_msgTypes[105] + mi := &file_backuppb_Backup_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9994,7 +10182,7 @@ func (x *SendStatus_Delivered) String() string { func (*SendStatus_Delivered) ProtoMessage() {} func (x *SendStatus_Delivered) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[105] + mi := &file_backuppb_Backup_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10026,7 +10214,7 @@ type SendStatus_Read struct { func (x *SendStatus_Read) Reset() { *x = SendStatus_Read{} - mi := &file_backuppb_Backup_proto_msgTypes[106] + mi := &file_backuppb_Backup_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10038,7 +10226,7 @@ func (x *SendStatus_Read) String() string { func (*SendStatus_Read) ProtoMessage() {} func (x *SendStatus_Read) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[106] + mi := &file_backuppb_Backup_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10070,7 +10258,7 @@ type SendStatus_Viewed struct { func (x *SendStatus_Viewed) Reset() { *x = SendStatus_Viewed{} - mi := &file_backuppb_Backup_proto_msgTypes[107] + mi := &file_backuppb_Backup_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10082,7 +10270,7 @@ func (x *SendStatus_Viewed) String() string { func (*SendStatus_Viewed) ProtoMessage() {} func (x *SendStatus_Viewed) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[107] + mi := &file_backuppb_Backup_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10114,7 +10302,7 @@ type SendStatus_Skipped struct { func (x *SendStatus_Skipped) Reset() { *x = SendStatus_Skipped{} - mi := &file_backuppb_Backup_proto_msgTypes[108] + mi := &file_backuppb_Backup_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10126,7 +10314,7 @@ func (x *SendStatus_Skipped) String() string { func (*SendStatus_Skipped) ProtoMessage() {} func (x *SendStatus_Skipped) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[108] + mi := &file_backuppb_Backup_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10151,7 +10339,7 @@ type SendStatus_Failed struct { func (x *SendStatus_Failed) Reset() { *x = SendStatus_Failed{} - mi := &file_backuppb_Backup_proto_msgTypes[109] + mi := &file_backuppb_Backup_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10163,7 +10351,7 @@ func (x *SendStatus_Failed) String() string { func (*SendStatus_Failed) ProtoMessage() {} func (x *SendStatus_Failed) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[109] + mi := &file_backuppb_Backup_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10196,7 +10384,7 @@ type DirectStoryReplyMessage_TextReply struct { func (x *DirectStoryReplyMessage_TextReply) Reset() { *x = DirectStoryReplyMessage_TextReply{} - mi := &file_backuppb_Backup_proto_msgTypes[110] + mi := &file_backuppb_Backup_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10208,7 +10396,7 @@ func (x *DirectStoryReplyMessage_TextReply) String() string { func (*DirectStoryReplyMessage_TextReply) ProtoMessage() {} func (x *DirectStoryReplyMessage_TextReply) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[110] + mi := &file_backuppb_Backup_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10253,7 +10441,7 @@ type PaymentNotification_TransactionDetails struct { func (x *PaymentNotification_TransactionDetails) Reset() { *x = PaymentNotification_TransactionDetails{} - mi := &file_backuppb_Backup_proto_msgTypes[111] + mi := &file_backuppb_Backup_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10265,7 +10453,7 @@ func (x *PaymentNotification_TransactionDetails) String() string { func (*PaymentNotification_TransactionDetails) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[111] + mi := &file_backuppb_Backup_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10334,7 +10522,7 @@ type PaymentNotification_TransactionDetails_MobileCoinTxoIdentification struct { func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) Reset() { *x = PaymentNotification_TransactionDetails_MobileCoinTxoIdentification{} - mi := &file_backuppb_Backup_proto_msgTypes[112] + mi := &file_backuppb_Backup_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10346,7 +10534,7 @@ func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) Str func (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_MobileCoinTxoIdentification) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[112] + mi := &file_backuppb_Backup_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10385,7 +10573,7 @@ type PaymentNotification_TransactionDetails_FailedTransaction struct { func (x *PaymentNotification_TransactionDetails_FailedTransaction) Reset() { *x = PaymentNotification_TransactionDetails_FailedTransaction{} - mi := &file_backuppb_Backup_proto_msgTypes[113] + mi := &file_backuppb_Backup_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10397,7 +10585,7 @@ func (x *PaymentNotification_TransactionDetails_FailedTransaction) String() stri func (*PaymentNotification_TransactionDetails_FailedTransaction) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_FailedTransaction) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[113] + mi := &file_backuppb_Backup_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10438,7 +10626,7 @@ type PaymentNotification_TransactionDetails_Transaction struct { func (x *PaymentNotification_TransactionDetails_Transaction) Reset() { *x = PaymentNotification_TransactionDetails_Transaction{} - mi := &file_backuppb_Backup_proto_msgTypes[114] + mi := &file_backuppb_Backup_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10450,7 +10638,7 @@ func (x *PaymentNotification_TransactionDetails_Transaction) String() string { func (*PaymentNotification_TransactionDetails_Transaction) ProtoMessage() {} func (x *PaymentNotification_TransactionDetails_Transaction) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[114] + mi := &file_backuppb_Backup_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10529,7 +10717,7 @@ type ContactAttachment_Name struct { func (x *ContactAttachment_Name) Reset() { *x = ContactAttachment_Name{} - mi := &file_backuppb_Backup_proto_msgTypes[115] + mi := &file_backuppb_Backup_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10541,7 +10729,7 @@ func (x *ContactAttachment_Name) String() string { func (*ContactAttachment_Name) ProtoMessage() {} func (x *ContactAttachment_Name) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[115] + mi := &file_backuppb_Backup_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10610,7 +10798,7 @@ type ContactAttachment_Phone struct { func (x *ContactAttachment_Phone) Reset() { *x = ContactAttachment_Phone{} - mi := &file_backuppb_Backup_proto_msgTypes[116] + mi := &file_backuppb_Backup_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10622,7 +10810,7 @@ func (x *ContactAttachment_Phone) String() string { func (*ContactAttachment_Phone) ProtoMessage() {} func (x *ContactAttachment_Phone) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[116] + mi := &file_backuppb_Backup_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10670,7 +10858,7 @@ type ContactAttachment_Email struct { func (x *ContactAttachment_Email) Reset() { *x = ContactAttachment_Email{} - mi := &file_backuppb_Backup_proto_msgTypes[117] + mi := &file_backuppb_Backup_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10682,7 +10870,7 @@ func (x *ContactAttachment_Email) String() string { func (*ContactAttachment_Email) ProtoMessage() {} func (x *ContactAttachment_Email) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[117] + mi := &file_backuppb_Backup_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10736,7 +10924,7 @@ type ContactAttachment_PostalAddress struct { func (x *ContactAttachment_PostalAddress) Reset() { *x = ContactAttachment_PostalAddress{} - mi := &file_backuppb_Backup_proto_msgTypes[118] + mi := &file_backuppb_Backup_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10748,7 +10936,7 @@ func (x *ContactAttachment_PostalAddress) String() string { func (*ContactAttachment_PostalAddress) ProtoMessage() {} func (x *ContactAttachment_PostalAddress) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[118] + mi := &file_backuppb_Backup_proto_msgTypes[121] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10863,7 +11051,7 @@ type FilePointer_LocatorInfo struct { func (x *FilePointer_LocatorInfo) Reset() { *x = FilePointer_LocatorInfo{} - mi := &file_backuppb_Backup_proto_msgTypes[119] + mi := &file_backuppb_Backup_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10875,7 +11063,7 @@ func (x *FilePointer_LocatorInfo) String() string { func (*FilePointer_LocatorInfo) ProtoMessage() {} func (x *FilePointer_LocatorInfo) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[119] + mi := &file_backuppb_Backup_proto_msgTypes[122] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10995,7 +11183,7 @@ type Quote_QuotedAttachment struct { func (x *Quote_QuotedAttachment) Reset() { *x = Quote_QuotedAttachment{} - mi := &file_backuppb_Backup_proto_msgTypes[120] + mi := &file_backuppb_Backup_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11007,7 +11195,7 @@ func (x *Quote_QuotedAttachment) String() string { func (*Quote_QuotedAttachment) ProtoMessage() {} func (x *Quote_QuotedAttachment) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[120] + mi := &file_backuppb_Backup_proto_msgTypes[123] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11054,7 +11242,7 @@ type Poll_PollOption struct { func (x *Poll_PollOption) Reset() { *x = Poll_PollOption{} - mi := &file_backuppb_Backup_proto_msgTypes[121] + mi := &file_backuppb_Backup_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11066,7 +11254,7 @@ func (x *Poll_PollOption) String() string { func (*Poll_PollOption) ProtoMessage() {} func (x *Poll_PollOption) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[121] + mi := &file_backuppb_Backup_proto_msgTypes[124] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11106,7 +11294,7 @@ type Poll_PollOption_PollVote struct { func (x *Poll_PollOption_PollVote) Reset() { *x = Poll_PollOption_PollVote{} - mi := &file_backuppb_Backup_proto_msgTypes[122] + mi := &file_backuppb_Backup_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11118,7 +11306,7 @@ func (x *Poll_PollOption_PollVote) String() string { func (*Poll_PollOption_PollVote) ProtoMessage() {} func (x *Poll_PollOption_PollVote) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[122] + mi := &file_backuppb_Backup_proto_msgTypes[125] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11188,6 +11376,8 @@ type GroupChangeChatUpdate_Update struct { // *GroupChangeChatUpdate_Update_GroupV2MigrationDroppedMembersUpdate // *GroupChangeChatUpdate_Update_GroupSequenceOfRequestsAndCancelsUpdate // *GroupChangeChatUpdate_Update_GroupExpirationTimerUpdate + // *GroupChangeChatUpdate_Update_GroupMemberLabelAccessLevelChangeUpdate + // *GroupChangeChatUpdate_Update_GroupTerminateChangeUpdate Update isGroupChangeChatUpdate_Update_Update `protobuf_oneof:"update"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -11195,7 +11385,7 @@ type GroupChangeChatUpdate_Update struct { func (x *GroupChangeChatUpdate_Update) Reset() { *x = GroupChangeChatUpdate_Update{} - mi := &file_backuppb_Backup_proto_msgTypes[123] + mi := &file_backuppb_Backup_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11207,7 +11397,7 @@ func (x *GroupChangeChatUpdate_Update) String() string { func (*GroupChangeChatUpdate_Update) ProtoMessage() {} func (x *GroupChangeChatUpdate_Update) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[123] + mi := &file_backuppb_Backup_proto_msgTypes[126] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11220,7 +11410,7 @@ func (x *GroupChangeChatUpdate_Update) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupChangeChatUpdate_Update.ProtoReflect.Descriptor instead. func (*GroupChangeChatUpdate_Update) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{42, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{43, 0} } func (x *GroupChangeChatUpdate_Update) GetUpdate() isGroupChangeChatUpdate_Update_Update { @@ -11536,6 +11726,24 @@ func (x *GroupChangeChatUpdate_Update) GetGroupExpirationTimerUpdate() *GroupExp return nil } +func (x *GroupChangeChatUpdate_Update) GetGroupMemberLabelAccessLevelChangeUpdate() *GroupMemberLabelAccessLevelChangeUpdate { + if x != nil { + if x, ok := x.Update.(*GroupChangeChatUpdate_Update_GroupMemberLabelAccessLevelChangeUpdate); ok { + return x.GroupMemberLabelAccessLevelChangeUpdate + } + } + return nil +} + +func (x *GroupChangeChatUpdate_Update) GetGroupTerminateChangeUpdate() *GroupTerminateChangeUpdate { + if x != nil { + if x, ok := x.Update.(*GroupChangeChatUpdate_Update_GroupTerminateChangeUpdate); ok { + return x.GroupTerminateChangeUpdate + } + } + return nil +} + type isGroupChangeChatUpdate_Update_Update interface { isGroupChangeChatUpdate_Update_Update() } @@ -11676,6 +11884,14 @@ type GroupChangeChatUpdate_Update_GroupExpirationTimerUpdate struct { GroupExpirationTimerUpdate *GroupExpirationTimerUpdate `protobuf:"bytes,34,opt,name=groupExpirationTimerUpdate,proto3,oneof"` } +type GroupChangeChatUpdate_Update_GroupMemberLabelAccessLevelChangeUpdate struct { + GroupMemberLabelAccessLevelChangeUpdate *GroupMemberLabelAccessLevelChangeUpdate `protobuf:"bytes,35,opt,name=groupMemberLabelAccessLevelChangeUpdate,proto3,oneof"` +} + +type GroupChangeChatUpdate_Update_GroupTerminateChangeUpdate struct { + GroupTerminateChangeUpdate *GroupTerminateChangeUpdate `protobuf:"bytes,36,opt,name=groupTerminateChangeUpdate,proto3,oneof"` +} + func (*GroupChangeChatUpdate_Update_GenericGroupUpdate) isGroupChangeChatUpdate_Update_Update() {} func (*GroupChangeChatUpdate_Update_GroupCreationUpdate) isGroupChangeChatUpdate_Update_Update() {} @@ -11768,6 +11984,12 @@ func (*GroupChangeChatUpdate_Update_GroupSequenceOfRequestsAndCancelsUpdate) isG func (*GroupChangeChatUpdate_Update_GroupExpirationTimerUpdate) isGroupChangeChatUpdate_Update_Update() { } +func (*GroupChangeChatUpdate_Update_GroupMemberLabelAccessLevelChangeUpdate) isGroupChangeChatUpdate_Update_Update() { +} + +func (*GroupChangeChatUpdate_Update_GroupTerminateChangeUpdate) isGroupChangeChatUpdate_Update_Update() { +} + type GroupInvitationRevokedUpdate_Invitee struct { state protoimpl.MessageState `protogen:"open.v1"` InviterAci []byte `protobuf:"bytes,1,opt,name=inviterAci,proto3,oneof" json:"inviterAci,omitempty"` @@ -11781,7 +12003,7 @@ type GroupInvitationRevokedUpdate_Invitee struct { func (x *GroupInvitationRevokedUpdate_Invitee) Reset() { *x = GroupInvitationRevokedUpdate_Invitee{} - mi := &file_backuppb_Backup_proto_msgTypes[124] + mi := &file_backuppb_Backup_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11793,7 +12015,7 @@ func (x *GroupInvitationRevokedUpdate_Invitee) String() string { func (*GroupInvitationRevokedUpdate_Invitee) ProtoMessage() {} func (x *GroupInvitationRevokedUpdate_Invitee) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[124] + mi := &file_backuppb_Backup_proto_msgTypes[127] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11806,7 +12028,7 @@ func (x *GroupInvitationRevokedUpdate_Invitee) ProtoReflect() protoreflect.Messa // Deprecated: Use GroupInvitationRevokedUpdate_Invitee.ProtoReflect.Descriptor instead. func (*GroupInvitationRevokedUpdate_Invitee) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{62, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{65, 0} } func (x *GroupInvitationRevokedUpdate_Invitee) GetInviterAci() []byte { @@ -11841,7 +12063,7 @@ type ChatStyle_Gradient struct { func (x *ChatStyle_Gradient) Reset() { *x = ChatStyle_Gradient{} - mi := &file_backuppb_Backup_proto_msgTypes[125] + mi := &file_backuppb_Backup_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11853,7 +12075,7 @@ func (x *ChatStyle_Gradient) String() string { func (*ChatStyle_Gradient) ProtoMessage() {} func (x *ChatStyle_Gradient) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[125] + mi := &file_backuppb_Backup_proto_msgTypes[128] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11866,7 +12088,7 @@ func (x *ChatStyle_Gradient) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_Gradient.ProtoReflect.Descriptor instead. func (*ChatStyle_Gradient) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 0} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{83, 0} } func (x *ChatStyle_Gradient) GetAngle() uint32 { @@ -11906,7 +12128,7 @@ type ChatStyle_CustomChatColor struct { func (x *ChatStyle_CustomChatColor) Reset() { *x = ChatStyle_CustomChatColor{} - mi := &file_backuppb_Backup_proto_msgTypes[126] + mi := &file_backuppb_Backup_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11918,7 +12140,7 @@ func (x *ChatStyle_CustomChatColor) String() string { func (*ChatStyle_CustomChatColor) ProtoMessage() {} func (x *ChatStyle_CustomChatColor) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[126] + mi := &file_backuppb_Backup_proto_msgTypes[129] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11931,7 +12153,7 @@ func (x *ChatStyle_CustomChatColor) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_CustomChatColor.ProtoReflect.Descriptor instead. func (*ChatStyle_CustomChatColor) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 1} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{83, 1} } func (x *ChatStyle_CustomChatColor) GetId() uint64 { @@ -11990,7 +12212,7 @@ type ChatStyle_AutomaticBubbleColor struct { func (x *ChatStyle_AutomaticBubbleColor) Reset() { *x = ChatStyle_AutomaticBubbleColor{} - mi := &file_backuppb_Backup_proto_msgTypes[127] + mi := &file_backuppb_Backup_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12002,7 +12224,7 @@ func (x *ChatStyle_AutomaticBubbleColor) String() string { func (*ChatStyle_AutomaticBubbleColor) ProtoMessage() {} func (x *ChatStyle_AutomaticBubbleColor) ProtoReflect() protoreflect.Message { - mi := &file_backuppb_Backup_proto_msgTypes[127] + mi := &file_backuppb_Backup_proto_msgTypes[130] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12015,7 +12237,7 @@ func (x *ChatStyle_AutomaticBubbleColor) ProtoReflect() protoreflect.Message { // Deprecated: Use ChatStyle_AutomaticBubbleColor.ProtoReflect.Descriptor instead. func (*ChatStyle_AutomaticBubbleColor) Descriptor() ([]byte, []int) { - return file_backuppb_Backup_proto_rawDescGZIP(), []int{80, 2} + return file_backuppb_Backup_proto_rawDescGZIP(), []int{83, 2} } var File_backuppb_Backup_proto protoreflect.FileDescriptor @@ -12042,7 +12264,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\n" + "chatFolder\x18\b \x01(\v2\x19.signal.backup.ChatFolderH\x00R\n" + "chatFolderB\x06\n" + - "\x04item\"\xf9\"\n" + + "\x04item\"\xc7#\n" + "\vAccountData\x12\x1e\n" + "\n" + "profileKey\x18\x01 \x01(\fR\n" + @@ -12088,7 +12310,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\aUNKNOWN\x10\x00\x12\t\n" + "\x05NEVER\x10\x01\x12\b\n" + "\x04WIFI\x10\x02\x12\x15\n" + - "\x11WIFI_AND_CELLULAR\x10\x03\x1a\xc9\x0f\n" + + "\x11WIFI_AND_CELLULAR\x10\x03\x1a\x97\x10\n" + "\x0fAccountSettings\x12\"\n" + "\freadReceipts\x18\x01 \x01(\bR\freadReceipts\x126\n" + "\x16sealedSenderIndicators\x18\x02 \x01(\bR\x16sealedSenderIndicators\x12*\n" + @@ -12121,7 +12343,8 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\bappTheme\x18\x1c \x01(\x0e2#.signal.backup.AccountData.AppThemeR\bappTheme\x12l\n" + "\x17callsUseLessDataSetting\x18\x1d \x01(\x0e22.signal.backup.AccountData.CallsUseLessDataSettingR\x17callsUseLessDataSetting\x12@\n" + "\x1ballowSealedSenderFromAnyone\x18\x1e \x01(\bR\x1ballowSealedSenderFromAnyone\x12D\n" + - "\x1dallowAutomaticKeyVerification\x18\x1f \x01(\bR\x1dallowAutomaticKeyVerificationB\x1b\n" + + "\x1dallowAutomaticKeyVerification\x18\x1f \x01(\bR\x1dallowAutomaticKeyVerification\x12L\n" + + "!hasSeenAdminDeleteEducationDialog\x18 \x01(\bR!hasSeenAdminDeleteEducationDialogB\x1b\n" + "\x19_storyViewReceiptsEnabledB\r\n" + "\v_backupTierB\x1b\n" + "\x19_screenLockTimeoutMinutesB\x0f\n" + @@ -12234,7 +12457,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x12_profileFamilyNameB\x0e\n" + "\f_identityKeyB\x0e\n" + "\f_avatarColorB\x16\n" + - "\x14_keyTransparencyData\"\x8f\x12\n" + + "\x14_keyTransparencyData\"\xc6\x13\n" + "\x05Group\x12\x1c\n" + "\tmasterKey\x18\x01 \x01(\fR\tmasterKey\x12 \n" + "\vwhitelisted\x18\x02 \x01(\bR\vwhitelisted\x12\x1c\n" + @@ -12242,7 +12465,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\rstorySendMode\x18\x04 \x01(\x0e2\".signal.backup.Group.StorySendModeR\rstorySendMode\x12>\n" + "\bsnapshot\x18\x05 \x01(\v2\".signal.backup.Group.GroupSnapshotR\bsnapshot\x12\x18\n" + "\ablocked\x18\x06 \x01(\bR\ablocked\x12A\n" + - "\vavatarColor\x18\a \x01(\x0e2\x1a.signal.backup.AvatarColorH\x00R\vavatarColor\x88\x01\x01\x1a\xc5\x06\n" + + "\vavatarColor\x18\a \x01(\x0e2\x1a.signal.backup.AvatarColorH\x00R\vavatarColor\x88\x01\x01\x1a\xe5\x06\n" + "\rGroupSnapshot\x12=\n" + "\x05title\x18\x02 \x01(\v2'.signal.backup.Group.GroupAttributeBlobR\x05title\x12I\n" + "\vdescription\x18\v \x01(\v2'.signal.backup.Group.GroupAttributeBlobR\vdescription\x12\x1c\n" + @@ -12256,17 +12479,24 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x12inviteLinkPassword\x18\n" + " \x01(\fR\x12inviteLinkPassword\x12-\n" + "\x12announcements_only\x18\f \x01(\bR\x11announcementsOnly\x12H\n" + - "\x0emembers_banned\x18\r \x03(\v2!.signal.backup.Group.MemberBannedR\rmembersBannedJ\x04\b\x01\x10\x02\x1a\xc3\x01\n" + + "\x0emembers_banned\x18\r \x03(\v2!.signal.backup.Group.MemberBannedR\rmembersBanned\x12\x1e\n" + + "\n" + + "terminated\x18\x0e \x01(\bR\n" + + "terminatedJ\x04\b\x01\x10\x02\x1a\xc3\x01\n" + "\x12GroupAttributeBlob\x12\x16\n" + "\x05title\x18\x01 \x01(\tH\x00R\x05title\x12\x18\n" + "\x06avatar\x18\x02 \x01(\fH\x00R\x06avatar\x12D\n" + "\x1cdisappearingMessagesDuration\x18\x03 \x01(\rH\x00R\x1cdisappearingMessagesDuration\x12*\n" + "\x0fdescriptionText\x18\x04 \x01(\tH\x00R\x0fdescriptionTextB\t\n" + - "\acontent\x1a\xc1\x01\n" + + "\acontent\x1a\x83\x02\n" + "\x06Member\x12\x16\n" + "\x06userId\x18\x01 \x01(\fR\x06userId\x124\n" + "\x04role\x18\x02 \x01(\x0e2 .signal.backup.Group.Member.RoleR\x04role\x12(\n" + - "\x0fjoinedAtVersion\x18\x05 \x01(\rR\x0fjoinedAtVersion\"3\n" + + "\x0fjoinedAtVersion\x18\x05 \x01(\rR\x0fjoinedAtVersion\x12\x1e\n" + + "\n" + + "labelEmoji\x18\x06 \x01(\tR\n" + + "labelEmoji\x12 \n" + + "\vlabelString\x18\a \x01(\tR\vlabelString\"3\n" + "\x04Role\x12\v\n" + "\aUNKNOWN\x10\x00\x12\v\n" + "\aDEFAULT\x10\x01\x12\x11\n" + @@ -12280,13 +12510,14 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\ttimestamp\x18\x04 \x01(\x04R\ttimestampJ\x04\b\x02\x10\x03J\x04\b\x03\x10\x04\x1aD\n" + "\fMemberBanned\x12\x16\n" + "\x06userId\x18\x01 \x01(\fR\x06userId\x12\x1c\n" + - "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\x1a\xea\x02\n" + + "\ttimestamp\x18\x02 \x01(\x04R\ttimestamp\x1a\xbf\x03\n" + "\rAccessControl\x12Q\n" + "\n" + "attributes\x18\x01 \x01(\x0e21.signal.backup.Group.AccessControl.AccessRequiredR\n" + "attributes\x12K\n" + "\amembers\x18\x02 \x01(\x0e21.signal.backup.Group.AccessControl.AccessRequiredR\amembers\x12_\n" + - "\x11addFromInviteLink\x18\x03 \x01(\x0e21.signal.backup.Group.AccessControl.AccessRequiredR\x11addFromInviteLink\"X\n" + + "\x11addFromInviteLink\x18\x03 \x01(\x0e21.signal.backup.Group.AccessControl.AccessRequiredR\x11addFromInviteLink\x12S\n" + + "\vmemberLabel\x18\x04 \x01(\x0e21.signal.backup.Group.AccessControl.AccessRequiredR\vmemberLabel\"X\n" + "\x0eAccessRequired\x12\v\n" + "\aUNKNOWN\x10\x00\x12\a\n" + "\x03ANY\x10\x01\x12\n" + @@ -12317,20 +12548,18 @@ const file_backuppb_Backup_proto_rawDesc = "" + " \x01(\rR\x12expireTimerVersionB\x0e\n" + "\f_pinnedOrderB\x14\n" + "\x12_expirationTimerMsB\x0e\n" + - "\f_muteUntilMs\"\xb4\x02\n" + + "\f_muteUntilMs\"\x95\x02\n" + "\bCallLink\x12\x18\n" + "\arootKey\x18\x01 \x01(\fR\arootKey\x12\x1f\n" + "\badminKey\x18\x02 \x01(\fH\x00R\badminKey\x88\x01\x01\x12\x12\n" + "\x04name\x18\x03 \x01(\tR\x04name\x12H\n" + "\frestrictions\x18\x04 \x01(\x0e2$.signal.backup.CallLink.RestrictionsR\frestrictions\x12\"\n" + - "\fexpirationMs\x18\x05 \x01(\x04R\fexpirationMs\x12\x19\n" + - "\x05epoch\x18\x06 \x01(\fH\x01R\x05epoch\x88\x01\x01\"9\n" + + "\fexpirationMs\x18\x05 \x01(\x04R\fexpirationMs\"9\n" + "\fRestrictions\x12\v\n" + "\aUNKNOWN\x10\x00\x12\b\n" + "\x04NONE\x10\x01\x12\x12\n" + "\x0eADMIN_APPROVAL\x10\x02B\v\n" + - "\t_adminKeyB\b\n" + - "\x06_epoch\"\xca\x01\n" + + "\t_adminKeyJ\x04\b\x06\x10\a\"\xca\x01\n" + "\tAdHocCall\x12\x16\n" + "\x06callId\x18\x01 \x01(\x04R\x06callId\x12 \n" + "\vrecipientId\x18\x02 \x01(\x04R\vrecipientId\x124\n" + @@ -12354,7 +12583,7 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\tONLY_WITH\x10\x01\x12\x0e\n" + "\n" + "ALL_EXCEPT\x10\x02\x12\a\n" + - "\x03ALL\x10\x03\"\xe5\x0e\n" + + "\x03ALL\x10\x03\"\xbd\x0f\n" + "\bChatItem\x12\x16\n" + "\x06chatId\x18\x01 \x01(\x04R\x06chatId\x12\x1a\n" + "\bauthorId\x18\x02 \x01(\x04R\bauthorId\x12\x1a\n" + @@ -12376,7 +12605,8 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\tgiftBadge\x18\x11 \x01(\v2\x18.signal.backup.GiftBadgeH\x01R\tgiftBadge\x12J\n" + "\x0fviewOnceMessage\x18\x12 \x01(\v2\x1e.signal.backup.ViewOnceMessageH\x01R\x0fviewOnceMessage\x12b\n" + "\x17directStoryReplyMessage\x18\x13 \x01(\v2&.signal.backup.DirectStoryReplyMessageH\x01R\x17directStoryReplyMessage\x12)\n" + - "\x04poll\x18\x14 \x01(\v2\x13.signal.backup.PollH\x01R\x04poll\x12B\n" + + "\x04poll\x18\x14 \x01(\v2\x13.signal.backup.PollH\x01R\x04poll\x12V\n" + + "\x13adminDeletedMessage\x18\x16 \x01(\v2\".signal.backup.AdminDeletedMessageH\x01R\x13adminDeletedMessage\x12B\n" + "\n" + "pinDetails\x18\x15 \x01(\v2\".signal.backup.ChatItem.PinDetailsR\n" + "pinDetails\x1a\xb4\x01\n" + @@ -12706,7 +12936,9 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x05votes\x18\x02 \x03(\v2'.signal.backup.Poll.PollOption.PollVoteR\x05votes\x1aB\n" + "\bPollVote\x12\x18\n" + "\avoterId\x18\x01 \x01(\x04R\avoterId\x12\x1c\n" + - "\tvoteCount\x18\x02 \x01(\rR\tvoteCount\"\xf7\x06\n" + + "\tvoteCount\x18\x02 \x01(\rR\tvoteCount\"/\n" + + "\x13AdminDeletedMessage\x12\x18\n" + + "\aadminId\x18\x01 \x01(\x04R\aadminId\"\xf7\x06\n" + "\x11ChatUpdateMessage\x12E\n" + "\fsimpleUpdate\x18\x01 \x01(\v2\x1f.signal.backup.SimpleChatUpdateH\x00R\fsimpleUpdate\x12H\n" + "\vgroupChange\x18\x02 \x01(\v2$.signal.backup.GroupChangeChatUpdateH\x00R\vgroupChange\x12`\n" + @@ -12805,9 +13037,9 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\x15ThreadMergeChatUpdate\x12\"\n" + "\fpreviousE164\x18\x01 \x01(\x04R\fpreviousE164\"1\n" + "\x1bSessionSwitchoverChatUpdate\x12\x12\n" + - "\x04e164\x18\x01 \x01(\x04R\x04e164\"\x86\x1f\n" + + "\x04e164\x18\x01 \x01(\x04R\x04e164\"\x88!\n" + "\x15GroupChangeChatUpdate\x12E\n" + - "\aupdates\x18\x01 \x03(\v2+.signal.backup.GroupChangeChatUpdate.UpdateR\aupdates\x1a\xa5\x1e\n" + + "\aupdates\x18\x01 \x03(\v2+.signal.backup.GroupChangeChatUpdate.UpdateR\aupdates\x1a\xa7 \n" + "\x06Update\x12S\n" + "\x12genericGroupUpdate\x18\x01 \x01(\v2!.signal.backup.GenericGroupUpdateH\x00R\x12genericGroupUpdate\x12V\n" + "\x13groupCreationUpdate\x18\x02 \x01(\v2\".signal.backup.GroupCreationUpdateH\x00R\x13groupCreationUpdate\x12J\n" + @@ -12843,7 +13075,9 @@ const file_backuppb_Backup_proto_rawDesc = "" + "$groupV2MigrationInvitedMembersUpdate\x18\x1f \x01(\v23.signal.backup.GroupV2MigrationInvitedMembersUpdateH\x00R$groupV2MigrationInvitedMembersUpdate\x12\x89\x01\n" + "$groupV2MigrationDroppedMembersUpdate\x18 \x01(\v23.signal.backup.GroupV2MigrationDroppedMembersUpdateH\x00R$groupV2MigrationDroppedMembersUpdate\x12\x92\x01\n" + "'groupSequenceOfRequestsAndCancelsUpdate\x18! \x01(\v26.signal.backup.GroupSequenceOfRequestsAndCancelsUpdateH\x00R'groupSequenceOfRequestsAndCancelsUpdate\x12k\n" + - "\x1agroupExpirationTimerUpdate\x18\" \x01(\v2).signal.backup.GroupExpirationTimerUpdateH\x00R\x1agroupExpirationTimerUpdateB\b\n" + + "\x1agroupExpirationTimerUpdate\x18\" \x01(\v2).signal.backup.GroupExpirationTimerUpdateH\x00R\x1agroupExpirationTimerUpdate\x12\x92\x01\n" + + "'groupMemberLabelAccessLevelChangeUpdate\x18# \x01(\v26.signal.backup.GroupMemberLabelAccessLevelChangeUpdateH\x00R'groupMemberLabelAccessLevelChangeUpdate\x12k\n" + + "\x1agroupTerminateChangeUpdate\x18$ \x01(\v2).signal.backup.GroupTerminateChangeUpdateH\x00R\x1agroupTerminateChangeUpdateB\b\n" + "\x06update\"H\n" + "\x12GenericGroupUpdate\x12#\n" + "\n" + @@ -12888,6 +13122,17 @@ const file_backuppb_Backup_proto_rawDesc = "" + "updaterAci\x18\x01 \x01(\fH\x00R\n" + "updaterAci\x88\x01\x01\x12C\n" + "\vaccessLevel\x18\x02 \x01(\x0e2!.signal.backup.GroupV2AccessLevelR\vaccessLevelB\r\n" + + "\v_updaterAci\"\xa2\x01\n" + + "'GroupMemberLabelAccessLevelChangeUpdate\x12#\n" + + "\n" + + "updaterAci\x18\x01 \x01(\fH\x00R\n" + + "updaterAci\x88\x01\x01\x12C\n" + + "\vaccessLevel\x18\x02 \x01(\x0e2!.signal.backup.GroupV2AccessLevelR\vaccessLevelB\r\n" + + "\v_updaterAci\"P\n" + + "\x1aGroupTerminateChangeUpdate\x12#\n" + + "\n" + + "updaterAci\x18\x01 \x01(\fH\x00R\n" + + "updaterAci\x88\x01\x01B\r\n" + "\v_updaterAci\"\x87\x01\n" + "!GroupAnnouncementOnlyChangeUpdate\x12#\n" + "\n" + @@ -13176,8 +13421,8 @@ const file_backuppb_Backup_proto_rawDesc = "" + "\n" + "\x06MEMBER\x10\x02\x12\x11\n" + "\rADMINISTRATOR\x10\x03\x12\x11\n" + - "\rUNSATISFIABLE\x10\x04B;\n" + - "*org.thoughtcrime.securesms.backup.v2.proto\xba\x02\fBackupProto_b\x06proto3" + "\rUNSATISFIABLE\x10\x04B)\n" + + "\x18org.signal.archive.proto\xba\x02\fBackupProto_b\x06proto3" var ( file_backuppb_Backup_proto_rawDescOnce sync.Once @@ -13192,7 +13437,7 @@ func file_backuppb_Backup_proto_rawDescGZIP() []byte { } var file_backuppb_Backup_proto_enumTypes = make([]protoimpl.EnumInfo, 36) -var file_backuppb_Backup_proto_msgTypes = make([]protoimpl.MessageInfo, 128) +var file_backuppb_Backup_proto_msgTypes = make([]protoimpl.MessageInfo, 131) var file_backuppb_Backup_proto_goTypes = []any{ (AvatarColor)(0), // 0: signal.backup.AvatarColor (GroupV2AccessLevel)(0), // 1: signal.backup.GroupV2AccessLevel @@ -13263,116 +13508,119 @@ var file_backuppb_Backup_proto_goTypes = []any{ (*BodyRange)(nil), // 66: signal.backup.BodyRange (*Reaction)(nil), // 67: signal.backup.Reaction (*Poll)(nil), // 68: signal.backup.Poll - (*ChatUpdateMessage)(nil), // 69: signal.backup.ChatUpdateMessage - (*IndividualCall)(nil), // 70: signal.backup.IndividualCall - (*GroupCall)(nil), // 71: signal.backup.GroupCall - (*SimpleChatUpdate)(nil), // 72: signal.backup.SimpleChatUpdate - (*ExpirationTimerChatUpdate)(nil), // 73: signal.backup.ExpirationTimerChatUpdate - (*ProfileChangeChatUpdate)(nil), // 74: signal.backup.ProfileChangeChatUpdate - (*LearnedProfileChatUpdate)(nil), // 75: signal.backup.LearnedProfileChatUpdate - (*ThreadMergeChatUpdate)(nil), // 76: signal.backup.ThreadMergeChatUpdate - (*SessionSwitchoverChatUpdate)(nil), // 77: signal.backup.SessionSwitchoverChatUpdate - (*GroupChangeChatUpdate)(nil), // 78: signal.backup.GroupChangeChatUpdate - (*GenericGroupUpdate)(nil), // 79: signal.backup.GenericGroupUpdate - (*GroupCreationUpdate)(nil), // 80: signal.backup.GroupCreationUpdate - (*GroupNameUpdate)(nil), // 81: signal.backup.GroupNameUpdate - (*GroupAvatarUpdate)(nil), // 82: signal.backup.GroupAvatarUpdate - (*GroupDescriptionUpdate)(nil), // 83: signal.backup.GroupDescriptionUpdate - (*GroupMembershipAccessLevelChangeUpdate)(nil), // 84: signal.backup.GroupMembershipAccessLevelChangeUpdate - (*GroupAttributesAccessLevelChangeUpdate)(nil), // 85: signal.backup.GroupAttributesAccessLevelChangeUpdate - (*GroupAnnouncementOnlyChangeUpdate)(nil), // 86: signal.backup.GroupAnnouncementOnlyChangeUpdate - (*GroupAdminStatusUpdate)(nil), // 87: signal.backup.GroupAdminStatusUpdate - (*GroupMemberLeftUpdate)(nil), // 88: signal.backup.GroupMemberLeftUpdate - (*GroupMemberRemovedUpdate)(nil), // 89: signal.backup.GroupMemberRemovedUpdate - (*SelfInvitedToGroupUpdate)(nil), // 90: signal.backup.SelfInvitedToGroupUpdate - (*SelfInvitedOtherUserToGroupUpdate)(nil), // 91: signal.backup.SelfInvitedOtherUserToGroupUpdate - (*GroupUnknownInviteeUpdate)(nil), // 92: signal.backup.GroupUnknownInviteeUpdate - (*GroupInvitationAcceptedUpdate)(nil), // 93: signal.backup.GroupInvitationAcceptedUpdate - (*GroupInvitationDeclinedUpdate)(nil), // 94: signal.backup.GroupInvitationDeclinedUpdate - (*GroupMemberJoinedUpdate)(nil), // 95: signal.backup.GroupMemberJoinedUpdate - (*GroupMemberAddedUpdate)(nil), // 96: signal.backup.GroupMemberAddedUpdate - (*GroupSelfInvitationRevokedUpdate)(nil), // 97: signal.backup.GroupSelfInvitationRevokedUpdate - (*GroupInvitationRevokedUpdate)(nil), // 98: signal.backup.GroupInvitationRevokedUpdate - (*GroupJoinRequestUpdate)(nil), // 99: signal.backup.GroupJoinRequestUpdate - (*GroupJoinRequestApprovalUpdate)(nil), // 100: signal.backup.GroupJoinRequestApprovalUpdate - (*GroupJoinRequestCanceledUpdate)(nil), // 101: signal.backup.GroupJoinRequestCanceledUpdate - (*GroupSequenceOfRequestsAndCancelsUpdate)(nil), // 102: signal.backup.GroupSequenceOfRequestsAndCancelsUpdate - (*GroupInviteLinkResetUpdate)(nil), // 103: signal.backup.GroupInviteLinkResetUpdate - (*GroupInviteLinkEnabledUpdate)(nil), // 104: signal.backup.GroupInviteLinkEnabledUpdate - (*GroupInviteLinkAdminApprovalUpdate)(nil), // 105: signal.backup.GroupInviteLinkAdminApprovalUpdate - (*GroupInviteLinkDisabledUpdate)(nil), // 106: signal.backup.GroupInviteLinkDisabledUpdate - (*GroupMemberJoinedByLinkUpdate)(nil), // 107: signal.backup.GroupMemberJoinedByLinkUpdate - (*GroupV2MigrationUpdate)(nil), // 108: signal.backup.GroupV2MigrationUpdate - (*GroupV2MigrationSelfInvitedUpdate)(nil), // 109: signal.backup.GroupV2MigrationSelfInvitedUpdate - (*GroupV2MigrationInvitedMembersUpdate)(nil), // 110: signal.backup.GroupV2MigrationInvitedMembersUpdate - (*GroupV2MigrationDroppedMembersUpdate)(nil), // 111: signal.backup.GroupV2MigrationDroppedMembersUpdate - (*GroupExpirationTimerUpdate)(nil), // 112: signal.backup.GroupExpirationTimerUpdate - (*PollTerminateUpdate)(nil), // 113: signal.backup.PollTerminateUpdate - (*PinMessageUpdate)(nil), // 114: signal.backup.PinMessageUpdate - (*StickerPack)(nil), // 115: signal.backup.StickerPack - (*ChatStyle)(nil), // 116: signal.backup.ChatStyle - (*NotificationProfile)(nil), // 117: signal.backup.NotificationProfile - (*ChatFolder)(nil), // 118: signal.backup.ChatFolder - (*AccountData_UsernameLink)(nil), // 119: signal.backup.AccountData.UsernameLink - (*AccountData_AutoDownloadSettings)(nil), // 120: signal.backup.AccountData.AutoDownloadSettings - (*AccountData_AccountSettings)(nil), // 121: signal.backup.AccountData.AccountSettings - (*AccountData_SubscriberData)(nil), // 122: signal.backup.AccountData.SubscriberData - (*AccountData_IAPSubscriberData)(nil), // 123: signal.backup.AccountData.IAPSubscriberData - (*AccountData_AndroidSpecificSettings)(nil), // 124: signal.backup.AccountData.AndroidSpecificSettings - (*Contact_Registered)(nil), // 125: signal.backup.Contact.Registered - (*Contact_NotRegistered)(nil), // 126: signal.backup.Contact.NotRegistered - (*Contact_Name)(nil), // 127: signal.backup.Contact.Name - (*Group_GroupSnapshot)(nil), // 128: signal.backup.Group.GroupSnapshot - (*Group_GroupAttributeBlob)(nil), // 129: signal.backup.Group.GroupAttributeBlob - (*Group_Member)(nil), // 130: signal.backup.Group.Member - (*Group_MemberPendingProfileKey)(nil), // 131: signal.backup.Group.MemberPendingProfileKey - (*Group_MemberPendingAdminApproval)(nil), // 132: signal.backup.Group.MemberPendingAdminApproval - (*Group_MemberBanned)(nil), // 133: signal.backup.Group.MemberBanned - (*Group_AccessControl)(nil), // 134: signal.backup.Group.AccessControl - (*ChatItem_IncomingMessageDetails)(nil), // 135: signal.backup.ChatItem.IncomingMessageDetails - (*ChatItem_OutgoingMessageDetails)(nil), // 136: signal.backup.ChatItem.OutgoingMessageDetails - (*ChatItem_DirectionlessMessageDetails)(nil), // 137: signal.backup.ChatItem.DirectionlessMessageDetails - (*ChatItem_PinDetails)(nil), // 138: signal.backup.ChatItem.PinDetails - (*SendStatus_Pending)(nil), // 139: signal.backup.SendStatus.Pending - (*SendStatus_Sent)(nil), // 140: signal.backup.SendStatus.Sent - (*SendStatus_Delivered)(nil), // 141: signal.backup.SendStatus.Delivered - (*SendStatus_Read)(nil), // 142: signal.backup.SendStatus.Read - (*SendStatus_Viewed)(nil), // 143: signal.backup.SendStatus.Viewed - (*SendStatus_Skipped)(nil), // 144: signal.backup.SendStatus.Skipped - (*SendStatus_Failed)(nil), // 145: signal.backup.SendStatus.Failed - (*DirectStoryReplyMessage_TextReply)(nil), // 146: signal.backup.DirectStoryReplyMessage.TextReply - (*PaymentNotification_TransactionDetails)(nil), // 147: signal.backup.PaymentNotification.TransactionDetails - (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification)(nil), // 148: signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification - (*PaymentNotification_TransactionDetails_FailedTransaction)(nil), // 149: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction - (*PaymentNotification_TransactionDetails_Transaction)(nil), // 150: signal.backup.PaymentNotification.TransactionDetails.Transaction - (*ContactAttachment_Name)(nil), // 151: signal.backup.ContactAttachment.Name - (*ContactAttachment_Phone)(nil), // 152: signal.backup.ContactAttachment.Phone - (*ContactAttachment_Email)(nil), // 153: signal.backup.ContactAttachment.Email - (*ContactAttachment_PostalAddress)(nil), // 154: signal.backup.ContactAttachment.PostalAddress - (*FilePointer_LocatorInfo)(nil), // 155: signal.backup.FilePointer.LocatorInfo - (*Quote_QuotedAttachment)(nil), // 156: signal.backup.Quote.QuotedAttachment - (*Poll_PollOption)(nil), // 157: signal.backup.Poll.PollOption - (*Poll_PollOption_PollVote)(nil), // 158: signal.backup.Poll.PollOption.PollVote - (*GroupChangeChatUpdate_Update)(nil), // 159: signal.backup.GroupChangeChatUpdate.Update - (*GroupInvitationRevokedUpdate_Invitee)(nil), // 160: signal.backup.GroupInvitationRevokedUpdate.Invitee - (*ChatStyle_Gradient)(nil), // 161: signal.backup.ChatStyle.Gradient - (*ChatStyle_CustomChatColor)(nil), // 162: signal.backup.ChatStyle.CustomChatColor - (*ChatStyle_AutomaticBubbleColor)(nil), // 163: signal.backup.ChatStyle.AutomaticBubbleColor + (*AdminDeletedMessage)(nil), // 69: signal.backup.AdminDeletedMessage + (*ChatUpdateMessage)(nil), // 70: signal.backup.ChatUpdateMessage + (*IndividualCall)(nil), // 71: signal.backup.IndividualCall + (*GroupCall)(nil), // 72: signal.backup.GroupCall + (*SimpleChatUpdate)(nil), // 73: signal.backup.SimpleChatUpdate + (*ExpirationTimerChatUpdate)(nil), // 74: signal.backup.ExpirationTimerChatUpdate + (*ProfileChangeChatUpdate)(nil), // 75: signal.backup.ProfileChangeChatUpdate + (*LearnedProfileChatUpdate)(nil), // 76: signal.backup.LearnedProfileChatUpdate + (*ThreadMergeChatUpdate)(nil), // 77: signal.backup.ThreadMergeChatUpdate + (*SessionSwitchoverChatUpdate)(nil), // 78: signal.backup.SessionSwitchoverChatUpdate + (*GroupChangeChatUpdate)(nil), // 79: signal.backup.GroupChangeChatUpdate + (*GenericGroupUpdate)(nil), // 80: signal.backup.GenericGroupUpdate + (*GroupCreationUpdate)(nil), // 81: signal.backup.GroupCreationUpdate + (*GroupNameUpdate)(nil), // 82: signal.backup.GroupNameUpdate + (*GroupAvatarUpdate)(nil), // 83: signal.backup.GroupAvatarUpdate + (*GroupDescriptionUpdate)(nil), // 84: signal.backup.GroupDescriptionUpdate + (*GroupMembershipAccessLevelChangeUpdate)(nil), // 85: signal.backup.GroupMembershipAccessLevelChangeUpdate + (*GroupAttributesAccessLevelChangeUpdate)(nil), // 86: signal.backup.GroupAttributesAccessLevelChangeUpdate + (*GroupMemberLabelAccessLevelChangeUpdate)(nil), // 87: signal.backup.GroupMemberLabelAccessLevelChangeUpdate + (*GroupTerminateChangeUpdate)(nil), // 88: signal.backup.GroupTerminateChangeUpdate + (*GroupAnnouncementOnlyChangeUpdate)(nil), // 89: signal.backup.GroupAnnouncementOnlyChangeUpdate + (*GroupAdminStatusUpdate)(nil), // 90: signal.backup.GroupAdminStatusUpdate + (*GroupMemberLeftUpdate)(nil), // 91: signal.backup.GroupMemberLeftUpdate + (*GroupMemberRemovedUpdate)(nil), // 92: signal.backup.GroupMemberRemovedUpdate + (*SelfInvitedToGroupUpdate)(nil), // 93: signal.backup.SelfInvitedToGroupUpdate + (*SelfInvitedOtherUserToGroupUpdate)(nil), // 94: signal.backup.SelfInvitedOtherUserToGroupUpdate + (*GroupUnknownInviteeUpdate)(nil), // 95: signal.backup.GroupUnknownInviteeUpdate + (*GroupInvitationAcceptedUpdate)(nil), // 96: signal.backup.GroupInvitationAcceptedUpdate + (*GroupInvitationDeclinedUpdate)(nil), // 97: signal.backup.GroupInvitationDeclinedUpdate + (*GroupMemberJoinedUpdate)(nil), // 98: signal.backup.GroupMemberJoinedUpdate + (*GroupMemberAddedUpdate)(nil), // 99: signal.backup.GroupMemberAddedUpdate + (*GroupSelfInvitationRevokedUpdate)(nil), // 100: signal.backup.GroupSelfInvitationRevokedUpdate + (*GroupInvitationRevokedUpdate)(nil), // 101: signal.backup.GroupInvitationRevokedUpdate + (*GroupJoinRequestUpdate)(nil), // 102: signal.backup.GroupJoinRequestUpdate + (*GroupJoinRequestApprovalUpdate)(nil), // 103: signal.backup.GroupJoinRequestApprovalUpdate + (*GroupJoinRequestCanceledUpdate)(nil), // 104: signal.backup.GroupJoinRequestCanceledUpdate + (*GroupSequenceOfRequestsAndCancelsUpdate)(nil), // 105: signal.backup.GroupSequenceOfRequestsAndCancelsUpdate + (*GroupInviteLinkResetUpdate)(nil), // 106: signal.backup.GroupInviteLinkResetUpdate + (*GroupInviteLinkEnabledUpdate)(nil), // 107: signal.backup.GroupInviteLinkEnabledUpdate + (*GroupInviteLinkAdminApprovalUpdate)(nil), // 108: signal.backup.GroupInviteLinkAdminApprovalUpdate + (*GroupInviteLinkDisabledUpdate)(nil), // 109: signal.backup.GroupInviteLinkDisabledUpdate + (*GroupMemberJoinedByLinkUpdate)(nil), // 110: signal.backup.GroupMemberJoinedByLinkUpdate + (*GroupV2MigrationUpdate)(nil), // 111: signal.backup.GroupV2MigrationUpdate + (*GroupV2MigrationSelfInvitedUpdate)(nil), // 112: signal.backup.GroupV2MigrationSelfInvitedUpdate + (*GroupV2MigrationInvitedMembersUpdate)(nil), // 113: signal.backup.GroupV2MigrationInvitedMembersUpdate + (*GroupV2MigrationDroppedMembersUpdate)(nil), // 114: signal.backup.GroupV2MigrationDroppedMembersUpdate + (*GroupExpirationTimerUpdate)(nil), // 115: signal.backup.GroupExpirationTimerUpdate + (*PollTerminateUpdate)(nil), // 116: signal.backup.PollTerminateUpdate + (*PinMessageUpdate)(nil), // 117: signal.backup.PinMessageUpdate + (*StickerPack)(nil), // 118: signal.backup.StickerPack + (*ChatStyle)(nil), // 119: signal.backup.ChatStyle + (*NotificationProfile)(nil), // 120: signal.backup.NotificationProfile + (*ChatFolder)(nil), // 121: signal.backup.ChatFolder + (*AccountData_UsernameLink)(nil), // 122: signal.backup.AccountData.UsernameLink + (*AccountData_AutoDownloadSettings)(nil), // 123: signal.backup.AccountData.AutoDownloadSettings + (*AccountData_AccountSettings)(nil), // 124: signal.backup.AccountData.AccountSettings + (*AccountData_SubscriberData)(nil), // 125: signal.backup.AccountData.SubscriberData + (*AccountData_IAPSubscriberData)(nil), // 126: signal.backup.AccountData.IAPSubscriberData + (*AccountData_AndroidSpecificSettings)(nil), // 127: signal.backup.AccountData.AndroidSpecificSettings + (*Contact_Registered)(nil), // 128: signal.backup.Contact.Registered + (*Contact_NotRegistered)(nil), // 129: signal.backup.Contact.NotRegistered + (*Contact_Name)(nil), // 130: signal.backup.Contact.Name + (*Group_GroupSnapshot)(nil), // 131: signal.backup.Group.GroupSnapshot + (*Group_GroupAttributeBlob)(nil), // 132: signal.backup.Group.GroupAttributeBlob + (*Group_Member)(nil), // 133: signal.backup.Group.Member + (*Group_MemberPendingProfileKey)(nil), // 134: signal.backup.Group.MemberPendingProfileKey + (*Group_MemberPendingAdminApproval)(nil), // 135: signal.backup.Group.MemberPendingAdminApproval + (*Group_MemberBanned)(nil), // 136: signal.backup.Group.MemberBanned + (*Group_AccessControl)(nil), // 137: signal.backup.Group.AccessControl + (*ChatItem_IncomingMessageDetails)(nil), // 138: signal.backup.ChatItem.IncomingMessageDetails + (*ChatItem_OutgoingMessageDetails)(nil), // 139: signal.backup.ChatItem.OutgoingMessageDetails + (*ChatItem_DirectionlessMessageDetails)(nil), // 140: signal.backup.ChatItem.DirectionlessMessageDetails + (*ChatItem_PinDetails)(nil), // 141: signal.backup.ChatItem.PinDetails + (*SendStatus_Pending)(nil), // 142: signal.backup.SendStatus.Pending + (*SendStatus_Sent)(nil), // 143: signal.backup.SendStatus.Sent + (*SendStatus_Delivered)(nil), // 144: signal.backup.SendStatus.Delivered + (*SendStatus_Read)(nil), // 145: signal.backup.SendStatus.Read + (*SendStatus_Viewed)(nil), // 146: signal.backup.SendStatus.Viewed + (*SendStatus_Skipped)(nil), // 147: signal.backup.SendStatus.Skipped + (*SendStatus_Failed)(nil), // 148: signal.backup.SendStatus.Failed + (*DirectStoryReplyMessage_TextReply)(nil), // 149: signal.backup.DirectStoryReplyMessage.TextReply + (*PaymentNotification_TransactionDetails)(nil), // 150: signal.backup.PaymentNotification.TransactionDetails + (*PaymentNotification_TransactionDetails_MobileCoinTxoIdentification)(nil), // 151: signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification + (*PaymentNotification_TransactionDetails_FailedTransaction)(nil), // 152: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction + (*PaymentNotification_TransactionDetails_Transaction)(nil), // 153: signal.backup.PaymentNotification.TransactionDetails.Transaction + (*ContactAttachment_Name)(nil), // 154: signal.backup.ContactAttachment.Name + (*ContactAttachment_Phone)(nil), // 155: signal.backup.ContactAttachment.Phone + (*ContactAttachment_Email)(nil), // 156: signal.backup.ContactAttachment.Email + (*ContactAttachment_PostalAddress)(nil), // 157: signal.backup.ContactAttachment.PostalAddress + (*FilePointer_LocatorInfo)(nil), // 158: signal.backup.FilePointer.LocatorInfo + (*Quote_QuotedAttachment)(nil), // 159: signal.backup.Quote.QuotedAttachment + (*Poll_PollOption)(nil), // 160: signal.backup.Poll.PollOption + (*Poll_PollOption_PollVote)(nil), // 161: signal.backup.Poll.PollOption.PollVote + (*GroupChangeChatUpdate_Update)(nil), // 162: signal.backup.GroupChangeChatUpdate.Update + (*GroupInvitationRevokedUpdate_Invitee)(nil), // 163: signal.backup.GroupInvitationRevokedUpdate.Invitee + (*ChatStyle_Gradient)(nil), // 164: signal.backup.ChatStyle.Gradient + (*ChatStyle_CustomChatColor)(nil), // 165: signal.backup.ChatStyle.CustomChatColor + (*ChatStyle_AutomaticBubbleColor)(nil), // 166: signal.backup.ChatStyle.AutomaticBubbleColor } var file_backuppb_Backup_proto_depIdxs = []int32{ 38, // 0: signal.backup.Frame.account:type_name -> signal.backup.AccountData 39, // 1: signal.backup.Frame.recipient:type_name -> signal.backup.Recipient 44, // 2: signal.backup.Frame.chat:type_name -> signal.backup.Chat 49, // 3: signal.backup.Frame.chatItem:type_name -> signal.backup.ChatItem - 115, // 4: signal.backup.Frame.stickerPack:type_name -> signal.backup.StickerPack + 118, // 4: signal.backup.Frame.stickerPack:type_name -> signal.backup.StickerPack 46, // 5: signal.backup.Frame.adHocCall:type_name -> signal.backup.AdHocCall - 117, // 6: signal.backup.Frame.notificationProfile:type_name -> signal.backup.NotificationProfile - 118, // 7: signal.backup.Frame.chatFolder:type_name -> signal.backup.ChatFolder - 119, // 8: signal.backup.AccountData.usernameLink:type_name -> signal.backup.AccountData.UsernameLink - 122, // 9: signal.backup.AccountData.donationSubscriberData:type_name -> signal.backup.AccountData.SubscriberData - 121, // 10: signal.backup.AccountData.accountSettings:type_name -> signal.backup.AccountData.AccountSettings - 123, // 11: signal.backup.AccountData.backupsSubscriberData:type_name -> signal.backup.AccountData.IAPSubscriberData - 124, // 12: signal.backup.AccountData.androidSpecificSettings:type_name -> signal.backup.AccountData.AndroidSpecificSettings + 120, // 6: signal.backup.Frame.notificationProfile:type_name -> signal.backup.NotificationProfile + 121, // 7: signal.backup.Frame.chatFolder:type_name -> signal.backup.ChatFolder + 122, // 8: signal.backup.AccountData.usernameLink:type_name -> signal.backup.AccountData.UsernameLink + 125, // 9: signal.backup.AccountData.donationSubscriberData:type_name -> signal.backup.AccountData.SubscriberData + 124, // 10: signal.backup.AccountData.accountSettings:type_name -> signal.backup.AccountData.AccountSettings + 126, // 11: signal.backup.AccountData.backupsSubscriberData:type_name -> signal.backup.AccountData.IAPSubscriberData + 127, // 12: signal.backup.AccountData.androidSpecificSettings:type_name -> signal.backup.AccountData.AndroidSpecificSettings 40, // 13: signal.backup.Recipient.contact:type_name -> signal.backup.Contact 41, // 14: signal.backup.Recipient.group:type_name -> signal.backup.Group 47, // 15: signal.backup.Recipient.distributionList:type_name -> signal.backup.DistributionListItem @@ -13380,181 +13628,186 @@ var file_backuppb_Backup_proto_depIdxs = []int32{ 43, // 17: signal.backup.Recipient.releaseNotes:type_name -> signal.backup.ReleaseNotes 45, // 18: signal.backup.Recipient.callLink:type_name -> signal.backup.CallLink 10, // 19: signal.backup.Contact.visibility:type_name -> signal.backup.Contact.Visibility - 125, // 20: signal.backup.Contact.registered:type_name -> signal.backup.Contact.Registered - 126, // 21: signal.backup.Contact.notRegistered:type_name -> signal.backup.Contact.NotRegistered + 128, // 20: signal.backup.Contact.registered:type_name -> signal.backup.Contact.Registered + 129, // 21: signal.backup.Contact.notRegistered:type_name -> signal.backup.Contact.NotRegistered 9, // 22: signal.backup.Contact.identityState:type_name -> signal.backup.Contact.IdentityState - 127, // 23: signal.backup.Contact.nickname:type_name -> signal.backup.Contact.Name + 130, // 23: signal.backup.Contact.nickname:type_name -> signal.backup.Contact.Name 0, // 24: signal.backup.Contact.avatarColor:type_name -> signal.backup.AvatarColor 11, // 25: signal.backup.Group.storySendMode:type_name -> signal.backup.Group.StorySendMode - 128, // 26: signal.backup.Group.snapshot:type_name -> signal.backup.Group.GroupSnapshot + 131, // 26: signal.backup.Group.snapshot:type_name -> signal.backup.Group.GroupSnapshot 0, // 27: signal.backup.Group.avatarColor:type_name -> signal.backup.AvatarColor 0, // 28: signal.backup.Self.avatarColor:type_name -> signal.backup.AvatarColor - 116, // 29: signal.backup.Chat.style:type_name -> signal.backup.ChatStyle + 119, // 29: signal.backup.Chat.style:type_name -> signal.backup.ChatStyle 14, // 30: signal.backup.CallLink.restrictions:type_name -> signal.backup.CallLink.Restrictions 15, // 31: signal.backup.AdHocCall.state:type_name -> signal.backup.AdHocCall.State 48, // 32: signal.backup.DistributionListItem.distributionList:type_name -> signal.backup.DistributionList 16, // 33: signal.backup.DistributionList.privacyMode:type_name -> signal.backup.DistributionList.PrivacyMode 49, // 34: signal.backup.ChatItem.revisions:type_name -> signal.backup.ChatItem - 135, // 35: signal.backup.ChatItem.incoming:type_name -> signal.backup.ChatItem.IncomingMessageDetails - 136, // 36: signal.backup.ChatItem.outgoing:type_name -> signal.backup.ChatItem.OutgoingMessageDetails - 137, // 37: signal.backup.ChatItem.directionless:type_name -> signal.backup.ChatItem.DirectionlessMessageDetails + 138, // 35: signal.backup.ChatItem.incoming:type_name -> signal.backup.ChatItem.IncomingMessageDetails + 139, // 36: signal.backup.ChatItem.outgoing:type_name -> signal.backup.ChatItem.OutgoingMessageDetails + 140, // 37: signal.backup.ChatItem.directionless:type_name -> signal.backup.ChatItem.DirectionlessMessageDetails 52, // 38: signal.backup.ChatItem.standardMessage:type_name -> signal.backup.StandardMessage 53, // 39: signal.backup.ChatItem.contactMessage:type_name -> signal.backup.ContactMessage 59, // 40: signal.backup.ChatItem.stickerMessage:type_name -> signal.backup.StickerMessage 60, // 41: signal.backup.ChatItem.remoteDeletedMessage:type_name -> signal.backup.RemoteDeletedMessage - 69, // 42: signal.backup.ChatItem.updateMessage:type_name -> signal.backup.ChatUpdateMessage + 70, // 42: signal.backup.ChatItem.updateMessage:type_name -> signal.backup.ChatUpdateMessage 55, // 43: signal.backup.ChatItem.paymentNotification:type_name -> signal.backup.PaymentNotification 56, // 44: signal.backup.ChatItem.giftBadge:type_name -> signal.backup.GiftBadge 57, // 45: signal.backup.ChatItem.viewOnceMessage:type_name -> signal.backup.ViewOnceMessage 54, // 46: signal.backup.ChatItem.directStoryReplyMessage:type_name -> signal.backup.DirectStoryReplyMessage 68, // 47: signal.backup.ChatItem.poll:type_name -> signal.backup.Poll - 138, // 48: signal.backup.ChatItem.pinDetails:type_name -> signal.backup.ChatItem.PinDetails - 139, // 49: signal.backup.SendStatus.pending:type_name -> signal.backup.SendStatus.Pending - 140, // 50: signal.backup.SendStatus.sent:type_name -> signal.backup.SendStatus.Sent - 141, // 51: signal.backup.SendStatus.delivered:type_name -> signal.backup.SendStatus.Delivered - 142, // 52: signal.backup.SendStatus.read:type_name -> signal.backup.SendStatus.Read - 143, // 53: signal.backup.SendStatus.viewed:type_name -> signal.backup.SendStatus.Viewed - 144, // 54: signal.backup.SendStatus.skipped:type_name -> signal.backup.SendStatus.Skipped - 145, // 55: signal.backup.SendStatus.failed:type_name -> signal.backup.SendStatus.Failed - 66, // 56: signal.backup.Text.bodyRanges:type_name -> signal.backup.BodyRange - 65, // 57: signal.backup.StandardMessage.quote:type_name -> signal.backup.Quote - 51, // 58: signal.backup.StandardMessage.text:type_name -> signal.backup.Text - 63, // 59: signal.backup.StandardMessage.attachments:type_name -> signal.backup.MessageAttachment - 62, // 60: signal.backup.StandardMessage.linkPreview:type_name -> signal.backup.LinkPreview - 64, // 61: signal.backup.StandardMessage.longText:type_name -> signal.backup.FilePointer - 67, // 62: signal.backup.StandardMessage.reactions:type_name -> signal.backup.Reaction - 58, // 63: signal.backup.ContactMessage.contact:type_name -> signal.backup.ContactAttachment - 67, // 64: signal.backup.ContactMessage.reactions:type_name -> signal.backup.Reaction - 146, // 65: signal.backup.DirectStoryReplyMessage.textReply:type_name -> signal.backup.DirectStoryReplyMessage.TextReply - 67, // 66: signal.backup.DirectStoryReplyMessage.reactions:type_name -> signal.backup.Reaction - 147, // 67: signal.backup.PaymentNotification.transactionDetails:type_name -> signal.backup.PaymentNotification.TransactionDetails - 20, // 68: signal.backup.GiftBadge.state:type_name -> signal.backup.GiftBadge.State - 63, // 69: signal.backup.ViewOnceMessage.attachment:type_name -> signal.backup.MessageAttachment - 67, // 70: signal.backup.ViewOnceMessage.reactions:type_name -> signal.backup.Reaction - 151, // 71: signal.backup.ContactAttachment.name:type_name -> signal.backup.ContactAttachment.Name - 152, // 72: signal.backup.ContactAttachment.number:type_name -> signal.backup.ContactAttachment.Phone - 153, // 73: signal.backup.ContactAttachment.email:type_name -> signal.backup.ContactAttachment.Email - 154, // 74: signal.backup.ContactAttachment.address:type_name -> signal.backup.ContactAttachment.PostalAddress - 64, // 75: signal.backup.ContactAttachment.avatar:type_name -> signal.backup.FilePointer - 61, // 76: signal.backup.StickerMessage.sticker:type_name -> signal.backup.Sticker - 67, // 77: signal.backup.StickerMessage.reactions:type_name -> signal.backup.Reaction - 64, // 78: signal.backup.Sticker.data:type_name -> signal.backup.FilePointer - 64, // 79: signal.backup.LinkPreview.image:type_name -> signal.backup.FilePointer - 64, // 80: signal.backup.MessageAttachment.pointer:type_name -> signal.backup.FilePointer - 24, // 81: signal.backup.MessageAttachment.flag:type_name -> signal.backup.MessageAttachment.Flag - 155, // 82: signal.backup.FilePointer.locatorInfo:type_name -> signal.backup.FilePointer.LocatorInfo - 51, // 83: signal.backup.Quote.text:type_name -> signal.backup.Text - 156, // 84: signal.backup.Quote.attachments:type_name -> signal.backup.Quote.QuotedAttachment - 25, // 85: signal.backup.Quote.type:type_name -> signal.backup.Quote.Type - 26, // 86: signal.backup.BodyRange.style:type_name -> signal.backup.BodyRange.Style - 157, // 87: signal.backup.Poll.options:type_name -> signal.backup.Poll.PollOption - 67, // 88: signal.backup.Poll.reactions:type_name -> signal.backup.Reaction - 72, // 89: signal.backup.ChatUpdateMessage.simpleUpdate:type_name -> signal.backup.SimpleChatUpdate - 78, // 90: signal.backup.ChatUpdateMessage.groupChange:type_name -> signal.backup.GroupChangeChatUpdate - 73, // 91: signal.backup.ChatUpdateMessage.expirationTimerChange:type_name -> signal.backup.ExpirationTimerChatUpdate - 74, // 92: signal.backup.ChatUpdateMessage.profileChange:type_name -> signal.backup.ProfileChangeChatUpdate - 76, // 93: signal.backup.ChatUpdateMessage.threadMerge:type_name -> signal.backup.ThreadMergeChatUpdate - 77, // 94: signal.backup.ChatUpdateMessage.sessionSwitchover:type_name -> signal.backup.SessionSwitchoverChatUpdate - 70, // 95: signal.backup.ChatUpdateMessage.individualCall:type_name -> signal.backup.IndividualCall - 71, // 96: signal.backup.ChatUpdateMessage.groupCall:type_name -> signal.backup.GroupCall - 75, // 97: signal.backup.ChatUpdateMessage.learnedProfileChange:type_name -> signal.backup.LearnedProfileChatUpdate - 113, // 98: signal.backup.ChatUpdateMessage.pollTerminate:type_name -> signal.backup.PollTerminateUpdate - 114, // 99: signal.backup.ChatUpdateMessage.pinMessage:type_name -> signal.backup.PinMessageUpdate - 27, // 100: signal.backup.IndividualCall.type:type_name -> signal.backup.IndividualCall.Type - 28, // 101: signal.backup.IndividualCall.direction:type_name -> signal.backup.IndividualCall.Direction - 29, // 102: signal.backup.IndividualCall.state:type_name -> signal.backup.IndividualCall.State - 30, // 103: signal.backup.GroupCall.state:type_name -> signal.backup.GroupCall.State - 31, // 104: signal.backup.SimpleChatUpdate.type:type_name -> signal.backup.SimpleChatUpdate.Type - 159, // 105: signal.backup.GroupChangeChatUpdate.updates:type_name -> signal.backup.GroupChangeChatUpdate.Update - 1, // 106: signal.backup.GroupMembershipAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel - 1, // 107: signal.backup.GroupAttributesAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel - 160, // 108: signal.backup.GroupInvitationRevokedUpdate.invitees:type_name -> signal.backup.GroupInvitationRevokedUpdate.Invitee - 32, // 109: signal.backup.ChatStyle.wallpaperPreset:type_name -> signal.backup.ChatStyle.WallpaperPreset - 64, // 110: signal.backup.ChatStyle.wallpaperPhoto:type_name -> signal.backup.FilePointer - 163, // 111: signal.backup.ChatStyle.autoBubbleColor:type_name -> signal.backup.ChatStyle.AutomaticBubbleColor - 33, // 112: signal.backup.ChatStyle.bubbleColorPreset:type_name -> signal.backup.ChatStyle.BubbleColorPreset - 34, // 113: signal.backup.NotificationProfile.scheduleDaysEnabled:type_name -> signal.backup.NotificationProfile.DayOfWeek - 35, // 114: signal.backup.ChatFolder.folderType:type_name -> signal.backup.ChatFolder.FolderType - 6, // 115: signal.backup.AccountData.UsernameLink.color:type_name -> signal.backup.AccountData.UsernameLink.Color - 7, // 116: signal.backup.AccountData.AutoDownloadSettings.images:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption - 7, // 117: signal.backup.AccountData.AutoDownloadSettings.audio:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption - 7, // 118: signal.backup.AccountData.AutoDownloadSettings.video:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption - 7, // 119: signal.backup.AccountData.AutoDownloadSettings.documents:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption - 2, // 120: signal.backup.AccountData.AccountSettings.phoneNumberSharingMode:type_name -> signal.backup.AccountData.PhoneNumberSharingMode - 116, // 121: signal.backup.AccountData.AccountSettings.defaultChatStyle:type_name -> signal.backup.ChatStyle - 162, // 122: signal.backup.AccountData.AccountSettings.customChatColors:type_name -> signal.backup.ChatStyle.CustomChatColor - 3, // 123: signal.backup.AccountData.AccountSettings.defaultSentMediaQuality:type_name -> signal.backup.AccountData.SentMediaQuality - 120, // 124: signal.backup.AccountData.AccountSettings.autoDownloadSettings:type_name -> signal.backup.AccountData.AutoDownloadSettings - 4, // 125: signal.backup.AccountData.AccountSettings.appTheme:type_name -> signal.backup.AccountData.AppTheme - 5, // 126: signal.backup.AccountData.AccountSettings.callsUseLessDataSetting:type_name -> signal.backup.AccountData.CallsUseLessDataSetting - 8, // 127: signal.backup.AccountData.AndroidSpecificSettings.navigationBarSize:type_name -> signal.backup.AccountData.AndroidSpecificSettings.NavigationBarSize - 129, // 128: signal.backup.Group.GroupSnapshot.title:type_name -> signal.backup.Group.GroupAttributeBlob - 129, // 129: signal.backup.Group.GroupSnapshot.description:type_name -> signal.backup.Group.GroupAttributeBlob - 129, // 130: signal.backup.Group.GroupSnapshot.disappearingMessagesTimer:type_name -> signal.backup.Group.GroupAttributeBlob - 134, // 131: signal.backup.Group.GroupSnapshot.accessControl:type_name -> signal.backup.Group.AccessControl - 130, // 132: signal.backup.Group.GroupSnapshot.members:type_name -> signal.backup.Group.Member - 131, // 133: signal.backup.Group.GroupSnapshot.membersPendingProfileKey:type_name -> signal.backup.Group.MemberPendingProfileKey - 132, // 134: signal.backup.Group.GroupSnapshot.membersPendingAdminApproval:type_name -> signal.backup.Group.MemberPendingAdminApproval - 133, // 135: signal.backup.Group.GroupSnapshot.members_banned:type_name -> signal.backup.Group.MemberBanned - 12, // 136: signal.backup.Group.Member.role:type_name -> signal.backup.Group.Member.Role - 130, // 137: signal.backup.Group.MemberPendingProfileKey.member:type_name -> signal.backup.Group.Member - 13, // 138: signal.backup.Group.AccessControl.attributes:type_name -> signal.backup.Group.AccessControl.AccessRequired - 13, // 139: signal.backup.Group.AccessControl.members:type_name -> signal.backup.Group.AccessControl.AccessRequired - 13, // 140: signal.backup.Group.AccessControl.addFromInviteLink:type_name -> signal.backup.Group.AccessControl.AccessRequired - 50, // 141: signal.backup.ChatItem.OutgoingMessageDetails.sendStatus:type_name -> signal.backup.SendStatus - 17, // 142: signal.backup.SendStatus.Failed.reason:type_name -> signal.backup.SendStatus.Failed.FailureReason - 51, // 143: signal.backup.DirectStoryReplyMessage.TextReply.text:type_name -> signal.backup.Text - 64, // 144: signal.backup.DirectStoryReplyMessage.TextReply.longText:type_name -> signal.backup.FilePointer - 150, // 145: signal.backup.PaymentNotification.TransactionDetails.transaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction - 149, // 146: signal.backup.PaymentNotification.TransactionDetails.failedTransaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction - 18, // 147: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.reason:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason - 19, // 148: signal.backup.PaymentNotification.TransactionDetails.Transaction.status:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction.Status - 148, // 149: signal.backup.PaymentNotification.TransactionDetails.Transaction.mobileCoinIdentification:type_name -> signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification - 21, // 150: signal.backup.ContactAttachment.Phone.type:type_name -> signal.backup.ContactAttachment.Phone.Type - 22, // 151: signal.backup.ContactAttachment.Email.type:type_name -> signal.backup.ContactAttachment.Email.Type - 23, // 152: signal.backup.ContactAttachment.PostalAddress.type:type_name -> signal.backup.ContactAttachment.PostalAddress.Type - 63, // 153: signal.backup.Quote.QuotedAttachment.thumbnail:type_name -> signal.backup.MessageAttachment - 158, // 154: signal.backup.Poll.PollOption.votes:type_name -> signal.backup.Poll.PollOption.PollVote - 79, // 155: signal.backup.GroupChangeChatUpdate.Update.genericGroupUpdate:type_name -> signal.backup.GenericGroupUpdate - 80, // 156: signal.backup.GroupChangeChatUpdate.Update.groupCreationUpdate:type_name -> signal.backup.GroupCreationUpdate - 81, // 157: signal.backup.GroupChangeChatUpdate.Update.groupNameUpdate:type_name -> signal.backup.GroupNameUpdate - 82, // 158: signal.backup.GroupChangeChatUpdate.Update.groupAvatarUpdate:type_name -> signal.backup.GroupAvatarUpdate - 83, // 159: signal.backup.GroupChangeChatUpdate.Update.groupDescriptionUpdate:type_name -> signal.backup.GroupDescriptionUpdate - 84, // 160: signal.backup.GroupChangeChatUpdate.Update.groupMembershipAccessLevelChangeUpdate:type_name -> signal.backup.GroupMembershipAccessLevelChangeUpdate - 85, // 161: signal.backup.GroupChangeChatUpdate.Update.groupAttributesAccessLevelChangeUpdate:type_name -> signal.backup.GroupAttributesAccessLevelChangeUpdate - 86, // 162: signal.backup.GroupChangeChatUpdate.Update.groupAnnouncementOnlyChangeUpdate:type_name -> signal.backup.GroupAnnouncementOnlyChangeUpdate - 87, // 163: signal.backup.GroupChangeChatUpdate.Update.groupAdminStatusUpdate:type_name -> signal.backup.GroupAdminStatusUpdate - 88, // 164: signal.backup.GroupChangeChatUpdate.Update.groupMemberLeftUpdate:type_name -> signal.backup.GroupMemberLeftUpdate - 89, // 165: signal.backup.GroupChangeChatUpdate.Update.groupMemberRemovedUpdate:type_name -> signal.backup.GroupMemberRemovedUpdate - 90, // 166: signal.backup.GroupChangeChatUpdate.Update.selfInvitedToGroupUpdate:type_name -> signal.backup.SelfInvitedToGroupUpdate - 91, // 167: signal.backup.GroupChangeChatUpdate.Update.selfInvitedOtherUserToGroupUpdate:type_name -> signal.backup.SelfInvitedOtherUserToGroupUpdate - 92, // 168: signal.backup.GroupChangeChatUpdate.Update.groupUnknownInviteeUpdate:type_name -> signal.backup.GroupUnknownInviteeUpdate - 93, // 169: signal.backup.GroupChangeChatUpdate.Update.groupInvitationAcceptedUpdate:type_name -> signal.backup.GroupInvitationAcceptedUpdate - 94, // 170: signal.backup.GroupChangeChatUpdate.Update.groupInvitationDeclinedUpdate:type_name -> signal.backup.GroupInvitationDeclinedUpdate - 95, // 171: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedUpdate:type_name -> signal.backup.GroupMemberJoinedUpdate - 96, // 172: signal.backup.GroupChangeChatUpdate.Update.groupMemberAddedUpdate:type_name -> signal.backup.GroupMemberAddedUpdate - 97, // 173: signal.backup.GroupChangeChatUpdate.Update.groupSelfInvitationRevokedUpdate:type_name -> signal.backup.GroupSelfInvitationRevokedUpdate - 98, // 174: signal.backup.GroupChangeChatUpdate.Update.groupInvitationRevokedUpdate:type_name -> signal.backup.GroupInvitationRevokedUpdate - 99, // 175: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestUpdate:type_name -> signal.backup.GroupJoinRequestUpdate - 100, // 176: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestApprovalUpdate:type_name -> signal.backup.GroupJoinRequestApprovalUpdate - 101, // 177: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestCanceledUpdate:type_name -> signal.backup.GroupJoinRequestCanceledUpdate - 103, // 178: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkResetUpdate:type_name -> signal.backup.GroupInviteLinkResetUpdate - 104, // 179: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkEnabledUpdate:type_name -> signal.backup.GroupInviteLinkEnabledUpdate - 105, // 180: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkAdminApprovalUpdate:type_name -> signal.backup.GroupInviteLinkAdminApprovalUpdate - 106, // 181: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkDisabledUpdate:type_name -> signal.backup.GroupInviteLinkDisabledUpdate - 107, // 182: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedByLinkUpdate:type_name -> signal.backup.GroupMemberJoinedByLinkUpdate - 108, // 183: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationUpdate:type_name -> signal.backup.GroupV2MigrationUpdate - 109, // 184: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationSelfInvitedUpdate:type_name -> signal.backup.GroupV2MigrationSelfInvitedUpdate - 110, // 185: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationInvitedMembersUpdate:type_name -> signal.backup.GroupV2MigrationInvitedMembersUpdate - 111, // 186: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationDroppedMembersUpdate:type_name -> signal.backup.GroupV2MigrationDroppedMembersUpdate - 102, // 187: signal.backup.GroupChangeChatUpdate.Update.groupSequenceOfRequestsAndCancelsUpdate:type_name -> signal.backup.GroupSequenceOfRequestsAndCancelsUpdate - 112, // 188: signal.backup.GroupChangeChatUpdate.Update.groupExpirationTimerUpdate:type_name -> signal.backup.GroupExpirationTimerUpdate - 161, // 189: signal.backup.ChatStyle.CustomChatColor.gradient:type_name -> signal.backup.ChatStyle.Gradient - 190, // [190:190] is the sub-list for method output_type - 190, // [190:190] is the sub-list for method input_type - 190, // [190:190] is the sub-list for extension type_name - 190, // [190:190] is the sub-list for extension extendee - 0, // [0:190] is the sub-list for field type_name + 69, // 48: signal.backup.ChatItem.adminDeletedMessage:type_name -> signal.backup.AdminDeletedMessage + 141, // 49: signal.backup.ChatItem.pinDetails:type_name -> signal.backup.ChatItem.PinDetails + 142, // 50: signal.backup.SendStatus.pending:type_name -> signal.backup.SendStatus.Pending + 143, // 51: signal.backup.SendStatus.sent:type_name -> signal.backup.SendStatus.Sent + 144, // 52: signal.backup.SendStatus.delivered:type_name -> signal.backup.SendStatus.Delivered + 145, // 53: signal.backup.SendStatus.read:type_name -> signal.backup.SendStatus.Read + 146, // 54: signal.backup.SendStatus.viewed:type_name -> signal.backup.SendStatus.Viewed + 147, // 55: signal.backup.SendStatus.skipped:type_name -> signal.backup.SendStatus.Skipped + 148, // 56: signal.backup.SendStatus.failed:type_name -> signal.backup.SendStatus.Failed + 66, // 57: signal.backup.Text.bodyRanges:type_name -> signal.backup.BodyRange + 65, // 58: signal.backup.StandardMessage.quote:type_name -> signal.backup.Quote + 51, // 59: signal.backup.StandardMessage.text:type_name -> signal.backup.Text + 63, // 60: signal.backup.StandardMessage.attachments:type_name -> signal.backup.MessageAttachment + 62, // 61: signal.backup.StandardMessage.linkPreview:type_name -> signal.backup.LinkPreview + 64, // 62: signal.backup.StandardMessage.longText:type_name -> signal.backup.FilePointer + 67, // 63: signal.backup.StandardMessage.reactions:type_name -> signal.backup.Reaction + 58, // 64: signal.backup.ContactMessage.contact:type_name -> signal.backup.ContactAttachment + 67, // 65: signal.backup.ContactMessage.reactions:type_name -> signal.backup.Reaction + 149, // 66: signal.backup.DirectStoryReplyMessage.textReply:type_name -> signal.backup.DirectStoryReplyMessage.TextReply + 67, // 67: signal.backup.DirectStoryReplyMessage.reactions:type_name -> signal.backup.Reaction + 150, // 68: signal.backup.PaymentNotification.transactionDetails:type_name -> signal.backup.PaymentNotification.TransactionDetails + 20, // 69: signal.backup.GiftBadge.state:type_name -> signal.backup.GiftBadge.State + 63, // 70: signal.backup.ViewOnceMessage.attachment:type_name -> signal.backup.MessageAttachment + 67, // 71: signal.backup.ViewOnceMessage.reactions:type_name -> signal.backup.Reaction + 154, // 72: signal.backup.ContactAttachment.name:type_name -> signal.backup.ContactAttachment.Name + 155, // 73: signal.backup.ContactAttachment.number:type_name -> signal.backup.ContactAttachment.Phone + 156, // 74: signal.backup.ContactAttachment.email:type_name -> signal.backup.ContactAttachment.Email + 157, // 75: signal.backup.ContactAttachment.address:type_name -> signal.backup.ContactAttachment.PostalAddress + 64, // 76: signal.backup.ContactAttachment.avatar:type_name -> signal.backup.FilePointer + 61, // 77: signal.backup.StickerMessage.sticker:type_name -> signal.backup.Sticker + 67, // 78: signal.backup.StickerMessage.reactions:type_name -> signal.backup.Reaction + 64, // 79: signal.backup.Sticker.data:type_name -> signal.backup.FilePointer + 64, // 80: signal.backup.LinkPreview.image:type_name -> signal.backup.FilePointer + 64, // 81: signal.backup.MessageAttachment.pointer:type_name -> signal.backup.FilePointer + 24, // 82: signal.backup.MessageAttachment.flag:type_name -> signal.backup.MessageAttachment.Flag + 158, // 83: signal.backup.FilePointer.locatorInfo:type_name -> signal.backup.FilePointer.LocatorInfo + 51, // 84: signal.backup.Quote.text:type_name -> signal.backup.Text + 159, // 85: signal.backup.Quote.attachments:type_name -> signal.backup.Quote.QuotedAttachment + 25, // 86: signal.backup.Quote.type:type_name -> signal.backup.Quote.Type + 26, // 87: signal.backup.BodyRange.style:type_name -> signal.backup.BodyRange.Style + 160, // 88: signal.backup.Poll.options:type_name -> signal.backup.Poll.PollOption + 67, // 89: signal.backup.Poll.reactions:type_name -> signal.backup.Reaction + 73, // 90: signal.backup.ChatUpdateMessage.simpleUpdate:type_name -> signal.backup.SimpleChatUpdate + 79, // 91: signal.backup.ChatUpdateMessage.groupChange:type_name -> signal.backup.GroupChangeChatUpdate + 74, // 92: signal.backup.ChatUpdateMessage.expirationTimerChange:type_name -> signal.backup.ExpirationTimerChatUpdate + 75, // 93: signal.backup.ChatUpdateMessage.profileChange:type_name -> signal.backup.ProfileChangeChatUpdate + 77, // 94: signal.backup.ChatUpdateMessage.threadMerge:type_name -> signal.backup.ThreadMergeChatUpdate + 78, // 95: signal.backup.ChatUpdateMessage.sessionSwitchover:type_name -> signal.backup.SessionSwitchoverChatUpdate + 71, // 96: signal.backup.ChatUpdateMessage.individualCall:type_name -> signal.backup.IndividualCall + 72, // 97: signal.backup.ChatUpdateMessage.groupCall:type_name -> signal.backup.GroupCall + 76, // 98: signal.backup.ChatUpdateMessage.learnedProfileChange:type_name -> signal.backup.LearnedProfileChatUpdate + 116, // 99: signal.backup.ChatUpdateMessage.pollTerminate:type_name -> signal.backup.PollTerminateUpdate + 117, // 100: signal.backup.ChatUpdateMessage.pinMessage:type_name -> signal.backup.PinMessageUpdate + 27, // 101: signal.backup.IndividualCall.type:type_name -> signal.backup.IndividualCall.Type + 28, // 102: signal.backup.IndividualCall.direction:type_name -> signal.backup.IndividualCall.Direction + 29, // 103: signal.backup.IndividualCall.state:type_name -> signal.backup.IndividualCall.State + 30, // 104: signal.backup.GroupCall.state:type_name -> signal.backup.GroupCall.State + 31, // 105: signal.backup.SimpleChatUpdate.type:type_name -> signal.backup.SimpleChatUpdate.Type + 162, // 106: signal.backup.GroupChangeChatUpdate.updates:type_name -> signal.backup.GroupChangeChatUpdate.Update + 1, // 107: signal.backup.GroupMembershipAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel + 1, // 108: signal.backup.GroupAttributesAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel + 1, // 109: signal.backup.GroupMemberLabelAccessLevelChangeUpdate.accessLevel:type_name -> signal.backup.GroupV2AccessLevel + 163, // 110: signal.backup.GroupInvitationRevokedUpdate.invitees:type_name -> signal.backup.GroupInvitationRevokedUpdate.Invitee + 32, // 111: signal.backup.ChatStyle.wallpaperPreset:type_name -> signal.backup.ChatStyle.WallpaperPreset + 64, // 112: signal.backup.ChatStyle.wallpaperPhoto:type_name -> signal.backup.FilePointer + 166, // 113: signal.backup.ChatStyle.autoBubbleColor:type_name -> signal.backup.ChatStyle.AutomaticBubbleColor + 33, // 114: signal.backup.ChatStyle.bubbleColorPreset:type_name -> signal.backup.ChatStyle.BubbleColorPreset + 34, // 115: signal.backup.NotificationProfile.scheduleDaysEnabled:type_name -> signal.backup.NotificationProfile.DayOfWeek + 35, // 116: signal.backup.ChatFolder.folderType:type_name -> signal.backup.ChatFolder.FolderType + 6, // 117: signal.backup.AccountData.UsernameLink.color:type_name -> signal.backup.AccountData.UsernameLink.Color + 7, // 118: signal.backup.AccountData.AutoDownloadSettings.images:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + 7, // 119: signal.backup.AccountData.AutoDownloadSettings.audio:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + 7, // 120: signal.backup.AccountData.AutoDownloadSettings.video:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + 7, // 121: signal.backup.AccountData.AutoDownloadSettings.documents:type_name -> signal.backup.AccountData.AutoDownloadSettings.AutoDownloadOption + 2, // 122: signal.backup.AccountData.AccountSettings.phoneNumberSharingMode:type_name -> signal.backup.AccountData.PhoneNumberSharingMode + 119, // 123: signal.backup.AccountData.AccountSettings.defaultChatStyle:type_name -> signal.backup.ChatStyle + 165, // 124: signal.backup.AccountData.AccountSettings.customChatColors:type_name -> signal.backup.ChatStyle.CustomChatColor + 3, // 125: signal.backup.AccountData.AccountSettings.defaultSentMediaQuality:type_name -> signal.backup.AccountData.SentMediaQuality + 123, // 126: signal.backup.AccountData.AccountSettings.autoDownloadSettings:type_name -> signal.backup.AccountData.AutoDownloadSettings + 4, // 127: signal.backup.AccountData.AccountSettings.appTheme:type_name -> signal.backup.AccountData.AppTheme + 5, // 128: signal.backup.AccountData.AccountSettings.callsUseLessDataSetting:type_name -> signal.backup.AccountData.CallsUseLessDataSetting + 8, // 129: signal.backup.AccountData.AndroidSpecificSettings.navigationBarSize:type_name -> signal.backup.AccountData.AndroidSpecificSettings.NavigationBarSize + 132, // 130: signal.backup.Group.GroupSnapshot.title:type_name -> signal.backup.Group.GroupAttributeBlob + 132, // 131: signal.backup.Group.GroupSnapshot.description:type_name -> signal.backup.Group.GroupAttributeBlob + 132, // 132: signal.backup.Group.GroupSnapshot.disappearingMessagesTimer:type_name -> signal.backup.Group.GroupAttributeBlob + 137, // 133: signal.backup.Group.GroupSnapshot.accessControl:type_name -> signal.backup.Group.AccessControl + 133, // 134: signal.backup.Group.GroupSnapshot.members:type_name -> signal.backup.Group.Member + 134, // 135: signal.backup.Group.GroupSnapshot.membersPendingProfileKey:type_name -> signal.backup.Group.MemberPendingProfileKey + 135, // 136: signal.backup.Group.GroupSnapshot.membersPendingAdminApproval:type_name -> signal.backup.Group.MemberPendingAdminApproval + 136, // 137: signal.backup.Group.GroupSnapshot.members_banned:type_name -> signal.backup.Group.MemberBanned + 12, // 138: signal.backup.Group.Member.role:type_name -> signal.backup.Group.Member.Role + 133, // 139: signal.backup.Group.MemberPendingProfileKey.member:type_name -> signal.backup.Group.Member + 13, // 140: signal.backup.Group.AccessControl.attributes:type_name -> signal.backup.Group.AccessControl.AccessRequired + 13, // 141: signal.backup.Group.AccessControl.members:type_name -> signal.backup.Group.AccessControl.AccessRequired + 13, // 142: signal.backup.Group.AccessControl.addFromInviteLink:type_name -> signal.backup.Group.AccessControl.AccessRequired + 13, // 143: signal.backup.Group.AccessControl.memberLabel:type_name -> signal.backup.Group.AccessControl.AccessRequired + 50, // 144: signal.backup.ChatItem.OutgoingMessageDetails.sendStatus:type_name -> signal.backup.SendStatus + 17, // 145: signal.backup.SendStatus.Failed.reason:type_name -> signal.backup.SendStatus.Failed.FailureReason + 51, // 146: signal.backup.DirectStoryReplyMessage.TextReply.text:type_name -> signal.backup.Text + 64, // 147: signal.backup.DirectStoryReplyMessage.TextReply.longText:type_name -> signal.backup.FilePointer + 153, // 148: signal.backup.PaymentNotification.TransactionDetails.transaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction + 152, // 149: signal.backup.PaymentNotification.TransactionDetails.failedTransaction:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction + 18, // 150: signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.reason:type_name -> signal.backup.PaymentNotification.TransactionDetails.FailedTransaction.FailureReason + 19, // 151: signal.backup.PaymentNotification.TransactionDetails.Transaction.status:type_name -> signal.backup.PaymentNotification.TransactionDetails.Transaction.Status + 151, // 152: signal.backup.PaymentNotification.TransactionDetails.Transaction.mobileCoinIdentification:type_name -> signal.backup.PaymentNotification.TransactionDetails.MobileCoinTxoIdentification + 21, // 153: signal.backup.ContactAttachment.Phone.type:type_name -> signal.backup.ContactAttachment.Phone.Type + 22, // 154: signal.backup.ContactAttachment.Email.type:type_name -> signal.backup.ContactAttachment.Email.Type + 23, // 155: signal.backup.ContactAttachment.PostalAddress.type:type_name -> signal.backup.ContactAttachment.PostalAddress.Type + 63, // 156: signal.backup.Quote.QuotedAttachment.thumbnail:type_name -> signal.backup.MessageAttachment + 161, // 157: signal.backup.Poll.PollOption.votes:type_name -> signal.backup.Poll.PollOption.PollVote + 80, // 158: signal.backup.GroupChangeChatUpdate.Update.genericGroupUpdate:type_name -> signal.backup.GenericGroupUpdate + 81, // 159: signal.backup.GroupChangeChatUpdate.Update.groupCreationUpdate:type_name -> signal.backup.GroupCreationUpdate + 82, // 160: signal.backup.GroupChangeChatUpdate.Update.groupNameUpdate:type_name -> signal.backup.GroupNameUpdate + 83, // 161: signal.backup.GroupChangeChatUpdate.Update.groupAvatarUpdate:type_name -> signal.backup.GroupAvatarUpdate + 84, // 162: signal.backup.GroupChangeChatUpdate.Update.groupDescriptionUpdate:type_name -> signal.backup.GroupDescriptionUpdate + 85, // 163: signal.backup.GroupChangeChatUpdate.Update.groupMembershipAccessLevelChangeUpdate:type_name -> signal.backup.GroupMembershipAccessLevelChangeUpdate + 86, // 164: signal.backup.GroupChangeChatUpdate.Update.groupAttributesAccessLevelChangeUpdate:type_name -> signal.backup.GroupAttributesAccessLevelChangeUpdate + 89, // 165: signal.backup.GroupChangeChatUpdate.Update.groupAnnouncementOnlyChangeUpdate:type_name -> signal.backup.GroupAnnouncementOnlyChangeUpdate + 90, // 166: signal.backup.GroupChangeChatUpdate.Update.groupAdminStatusUpdate:type_name -> signal.backup.GroupAdminStatusUpdate + 91, // 167: signal.backup.GroupChangeChatUpdate.Update.groupMemberLeftUpdate:type_name -> signal.backup.GroupMemberLeftUpdate + 92, // 168: signal.backup.GroupChangeChatUpdate.Update.groupMemberRemovedUpdate:type_name -> signal.backup.GroupMemberRemovedUpdate + 93, // 169: signal.backup.GroupChangeChatUpdate.Update.selfInvitedToGroupUpdate:type_name -> signal.backup.SelfInvitedToGroupUpdate + 94, // 170: signal.backup.GroupChangeChatUpdate.Update.selfInvitedOtherUserToGroupUpdate:type_name -> signal.backup.SelfInvitedOtherUserToGroupUpdate + 95, // 171: signal.backup.GroupChangeChatUpdate.Update.groupUnknownInviteeUpdate:type_name -> signal.backup.GroupUnknownInviteeUpdate + 96, // 172: signal.backup.GroupChangeChatUpdate.Update.groupInvitationAcceptedUpdate:type_name -> signal.backup.GroupInvitationAcceptedUpdate + 97, // 173: signal.backup.GroupChangeChatUpdate.Update.groupInvitationDeclinedUpdate:type_name -> signal.backup.GroupInvitationDeclinedUpdate + 98, // 174: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedUpdate:type_name -> signal.backup.GroupMemberJoinedUpdate + 99, // 175: signal.backup.GroupChangeChatUpdate.Update.groupMemberAddedUpdate:type_name -> signal.backup.GroupMemberAddedUpdate + 100, // 176: signal.backup.GroupChangeChatUpdate.Update.groupSelfInvitationRevokedUpdate:type_name -> signal.backup.GroupSelfInvitationRevokedUpdate + 101, // 177: signal.backup.GroupChangeChatUpdate.Update.groupInvitationRevokedUpdate:type_name -> signal.backup.GroupInvitationRevokedUpdate + 102, // 178: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestUpdate:type_name -> signal.backup.GroupJoinRequestUpdate + 103, // 179: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestApprovalUpdate:type_name -> signal.backup.GroupJoinRequestApprovalUpdate + 104, // 180: signal.backup.GroupChangeChatUpdate.Update.groupJoinRequestCanceledUpdate:type_name -> signal.backup.GroupJoinRequestCanceledUpdate + 106, // 181: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkResetUpdate:type_name -> signal.backup.GroupInviteLinkResetUpdate + 107, // 182: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkEnabledUpdate:type_name -> signal.backup.GroupInviteLinkEnabledUpdate + 108, // 183: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkAdminApprovalUpdate:type_name -> signal.backup.GroupInviteLinkAdminApprovalUpdate + 109, // 184: signal.backup.GroupChangeChatUpdate.Update.groupInviteLinkDisabledUpdate:type_name -> signal.backup.GroupInviteLinkDisabledUpdate + 110, // 185: signal.backup.GroupChangeChatUpdate.Update.groupMemberJoinedByLinkUpdate:type_name -> signal.backup.GroupMemberJoinedByLinkUpdate + 111, // 186: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationUpdate:type_name -> signal.backup.GroupV2MigrationUpdate + 112, // 187: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationSelfInvitedUpdate:type_name -> signal.backup.GroupV2MigrationSelfInvitedUpdate + 113, // 188: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationInvitedMembersUpdate:type_name -> signal.backup.GroupV2MigrationInvitedMembersUpdate + 114, // 189: signal.backup.GroupChangeChatUpdate.Update.groupV2MigrationDroppedMembersUpdate:type_name -> signal.backup.GroupV2MigrationDroppedMembersUpdate + 105, // 190: signal.backup.GroupChangeChatUpdate.Update.groupSequenceOfRequestsAndCancelsUpdate:type_name -> signal.backup.GroupSequenceOfRequestsAndCancelsUpdate + 115, // 191: signal.backup.GroupChangeChatUpdate.Update.groupExpirationTimerUpdate:type_name -> signal.backup.GroupExpirationTimerUpdate + 87, // 192: signal.backup.GroupChangeChatUpdate.Update.groupMemberLabelAccessLevelChangeUpdate:type_name -> signal.backup.GroupMemberLabelAccessLevelChangeUpdate + 88, // 193: signal.backup.GroupChangeChatUpdate.Update.groupTerminateChangeUpdate:type_name -> signal.backup.GroupTerminateChangeUpdate + 164, // 194: signal.backup.ChatStyle.CustomChatColor.gradient:type_name -> signal.backup.ChatStyle.Gradient + 195, // [195:195] is the sub-list for method output_type + 195, // [195:195] is the sub-list for method input_type + 195, // [195:195] is the sub-list for extension type_name + 195, // [195:195] is the sub-list for extension extendee + 0, // [0:195] is the sub-list for field type_name } func init() { file_backuppb_Backup_proto_init() } @@ -13607,6 +13860,7 @@ func file_backuppb_Backup_proto_init() { (*ChatItem_ViewOnceMessage)(nil), (*ChatItem_DirectStoryReplyMessage)(nil), (*ChatItem_Poll)(nil), + (*ChatItem_AdminDeletedMessage)(nil), } file_backuppb_Backup_proto_msgTypes[14].OneofWrappers = []any{ (*SendStatus_Pending_)(nil), @@ -13633,7 +13887,7 @@ func file_backuppb_Backup_proto_init() { (*BodyRange_MentionAci)(nil), (*BodyRange_Style_)(nil), } - file_backuppb_Backup_proto_msgTypes[33].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[34].OneofWrappers = []any{ (*ChatUpdateMessage_SimpleUpdate)(nil), (*ChatUpdateMessage_GroupChange)(nil), (*ChatUpdateMessage_ExpirationTimerChange)(nil), @@ -13646,13 +13900,12 @@ func file_backuppb_Backup_proto_init() { (*ChatUpdateMessage_PollTerminate)(nil), (*ChatUpdateMessage_PinMessage)(nil), } - file_backuppb_Backup_proto_msgTypes[34].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[35].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[39].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[36].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[40].OneofWrappers = []any{ (*LearnedProfileChatUpdate_E164)(nil), (*LearnedProfileChatUpdate_Username)(nil), } - file_backuppb_Backup_proto_msgTypes[43].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[44].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[45].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[46].OneofWrappers = []any{} @@ -13661,55 +13914,58 @@ func file_backuppb_Backup_proto_init() { file_backuppb_Backup_proto_msgTypes[49].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[50].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[51].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[52].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[53].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[54].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[56].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[57].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[58].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[59].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[60].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[61].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[62].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[63].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[64].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[65].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[67].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[68].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[69].OneofWrappers = []any{} file_backuppb_Backup_proto_msgTypes[70].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[76].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[80].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[71].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[72].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[73].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[79].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[83].OneofWrappers = []any{ (*ChatStyle_WallpaperPreset_)(nil), (*ChatStyle_WallpaperPhoto)(nil), (*ChatStyle_AutoBubbleColor)(nil), (*ChatStyle_BubbleColorPreset_)(nil), (*ChatStyle_CustomColorId)(nil), } - file_backuppb_Backup_proto_msgTypes[81].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[85].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[87].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[84].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[88].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[90].OneofWrappers = []any{ (*AccountData_IAPSubscriberData_PurchaseToken)(nil), (*AccountData_IAPSubscriberData_OriginalTransactionId)(nil), } - file_backuppb_Backup_proto_msgTypes[93].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[96].OneofWrappers = []any{ (*Group_GroupAttributeBlob_Title)(nil), (*Group_GroupAttributeBlob_Avatar)(nil), (*Group_GroupAttributeBlob_DisappearingMessagesDuration)(nil), (*Group_GroupAttributeBlob_DescriptionText)(nil), } - file_backuppb_Backup_proto_msgTypes[99].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[102].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[102].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[105].OneofWrappers = []any{ (*ChatItem_PinDetails_PinExpiresAtTimestamp)(nil), (*ChatItem_PinDetails_PinNeverExpires)(nil), } - file_backuppb_Backup_proto_msgTypes[111].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[114].OneofWrappers = []any{ (*PaymentNotification_TransactionDetails_Transaction_)(nil), (*PaymentNotification_TransactionDetails_FailedTransaction_)(nil), } - file_backuppb_Backup_proto_msgTypes[114].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[119].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[117].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[122].OneofWrappers = []any{ (*FilePointer_LocatorInfo_PlaintextHash)(nil), (*FilePointer_LocatorInfo_EncryptedDigest)(nil), } - file_backuppb_Backup_proto_msgTypes[120].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[123].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[123].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[126].OneofWrappers = []any{ (*GroupChangeChatUpdate_Update_GenericGroupUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupCreationUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupNameUpdate)(nil), @@ -13744,9 +14000,11 @@ func file_backuppb_Backup_proto_init() { (*GroupChangeChatUpdate_Update_GroupV2MigrationDroppedMembersUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupSequenceOfRequestsAndCancelsUpdate)(nil), (*GroupChangeChatUpdate_Update_GroupExpirationTimerUpdate)(nil), + (*GroupChangeChatUpdate_Update_GroupMemberLabelAccessLevelChangeUpdate)(nil), + (*GroupChangeChatUpdate_Update_GroupTerminateChangeUpdate)(nil), } - file_backuppb_Backup_proto_msgTypes[124].OneofWrappers = []any{} - file_backuppb_Backup_proto_msgTypes[126].OneofWrappers = []any{ + file_backuppb_Backup_proto_msgTypes[127].OneofWrappers = []any{} + file_backuppb_Backup_proto_msgTypes[129].OneofWrappers = []any{ (*ChatStyle_CustomChatColor_Solid)(nil), (*ChatStyle_CustomChatColor_Gradient)(nil), } @@ -13756,7 +14014,7 @@ func file_backuppb_Backup_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_backuppb_Backup_proto_rawDesc), len(file_backuppb_Backup_proto_rawDesc)), NumEnums: 36, - NumMessages: 128, + NumMessages: 131, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/signalmeow/protobuf/backuppb/Backup.proto b/pkg/signalmeow/protobuf/backuppb/Backup.proto index 1b70167..d7407cb 100644 --- a/pkg/signalmeow/protobuf/backuppb/Backup.proto +++ b/pkg/signalmeow/protobuf/backuppb/Backup.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package signal.backup; -option java_package = "org.thoughtcrime.securesms.backup.v2.proto"; +option java_package = "org.signal.archive.proto"; option swift_prefix = "BackupProto_"; message BackupInfo { @@ -135,6 +135,7 @@ message AccountData { CallsUseLessDataSetting callsUseLessDataSetting = 29; // If unset, treat the same as "Unknown" case bool allowSealedSenderFromAnyone = 30; bool allowAutomaticKeyVerification = 31; + bool hasSeenAdminDeleteEducationDialog = 32; } message SubscriberData { @@ -307,6 +308,7 @@ message Group { bytes inviteLinkPassword = 10; bool announcements_only = 12; repeated MemberBanned members_banned = 13; + bool terminated = 14; } message GroupAttributeBlob { @@ -331,6 +333,8 @@ message Group { reserved /*profileKey*/ 3; // This field is ignored in Backups, in favor of Contact frames for members reserved /*presentation*/ 4; // This field is deprecated in the context of static group state uint32 joinedAtVersion = 5; + string labelEmoji = 6; + string labelString = 7; } message MemberPendingProfileKey { @@ -363,6 +367,7 @@ message Group { AccessRequired attributes = 1; AccessRequired members = 2; AccessRequired addFromInviteLink = 3; + AccessRequired memberLabel = 4; } } @@ -405,7 +410,7 @@ message CallLink { string name = 3; Restrictions restrictions = 4; uint64 expirationMs = 5; - optional bytes epoch = 6; // May be absent/empty for older links + reserved /*epoch*/ 6; } message AdHocCall { @@ -498,6 +503,7 @@ message ChatItem { ViewOnceMessage viewOnceMessage = 18; DirectStoryReplyMessage directStoryReplyMessage = 19; // group story reply messages are not backed up Poll poll = 20; + AdminDeletedMessage adminDeletedMessage = 22; } PinDetails pinDetails = 21; // only set if message is pinned @@ -898,6 +904,10 @@ message Poll { repeated Reaction reactions = 5; } +message AdminDeletedMessage { + uint64 adminId = 1; // id of the admin that deleted the message +} + message ChatUpdateMessage { // If unset, importers should ignore the update message without throwing an error. oneof update { @@ -1068,6 +1078,8 @@ message GroupChangeChatUpdate { GroupV2MigrationDroppedMembersUpdate groupV2MigrationDroppedMembersUpdate = 32; GroupSequenceOfRequestsAndCancelsUpdate groupSequenceOfRequestsAndCancelsUpdate = 33; GroupExpirationTimerUpdate groupExpirationTimerUpdate = 34; + GroupMemberLabelAccessLevelChangeUpdate groupMemberLabelAccessLevelChangeUpdate = 35; + GroupTerminateChangeUpdate groupTerminateChangeUpdate = 36; } } @@ -1119,6 +1131,15 @@ message GroupAttributesAccessLevelChangeUpdate { GroupV2AccessLevel accessLevel = 2; } +message GroupMemberLabelAccessLevelChangeUpdate { + optional bytes updaterAci = 1; + GroupV2AccessLevel accessLevel = 2; +} + +message GroupTerminateChangeUpdate { + optional bytes updaterAci = 1; +} + message GroupAnnouncementOnlyChangeUpdate { optional bytes updaterAci = 1; bool isAnnouncementOnly = 2; diff --git a/pkg/signalmeow/protobuf/update-protos.sh b/pkg/signalmeow/protobuf/update-protos.sh index d65567c..ffaa697 100755 --- a/pkg/signalmeow/protobuf/update-protos.sh +++ b/pkg/signalmeow/protobuf/update-protos.sh @@ -1,8 +1,8 @@ #!/bin/bash set -euo pipefail -ANDROID_GIT_REVISION=${1:-bc6114f6e0d3a4b1dcdc472331505f2644185264} -DESKTOP_GIT_REVISION=${1:-a9063ec0c3c1079072c1e30e0749c1ae8be5500a} +ANDROID_GIT_REVISION=${1:-dfd2f7baf96825834f784900ce644e9ead8a9a89} +DESKTOP_GIT_REVISION=${1:-60a1e125452ee672d8747564d0055d5bfec9f679} update_proto() { case "$1" in @@ -11,9 +11,9 @@ update_proto() { prefix="lib/libsignal-service/src/main/protowire/" GIT_REVISION=$ANDROID_GIT_REVISION ;; - Signal-Android-App) + Signal-Android-Archive) REPO="Signal-Android" - prefix="app/src/main/protowire/" + prefix="lib/archive/src/main/protowire/" GIT_REVISION=$ANDROID_GIT_REVISION ;; Signal-Desktop) @@ -34,11 +34,10 @@ update_proto Signal-Android StickerResources.proto update_proto Signal-Android WebSocketResources.proto update_proto Signal-Android StorageService.proto -update_proto Signal-Android-App Backup.proto +update_proto Signal-Android-Archive Backup.proto mv Backup.proto backuppb/Backup.proto update_proto Signal-Desktop DeviceName.proto -# TODO this was moved to libsignal only +# TODO these were moved to libsignal only #update_proto Signal-Desktop UnidentifiedDelivery.proto -# Android has CDSI.proto too, but the types have more generic names (since android uses a different package name) -update_proto Signal-Desktop ContactDiscovery.proto +#update_proto Signal-Desktop ContactDiscovery.proto diff --git a/pkg/signalmeow/provisioning.go b/pkg/signalmeow/provisioning.go index 48a8042..8e0fa96 100644 --- a/pkg/signalmeow/provisioning.go +++ b/pkg/signalmeow/provisioning.go @@ -18,7 +18,6 @@ package signalmeow import ( "context" - "crypto/hmac" "encoding/base64" "encoding/json" "fmt" @@ -166,24 +165,19 @@ func PerformProvisioning(ctx context.Context, deviceStore store.DeviceStore, dev DeviceID: deviceId, Number: *provisioningMessage.Number, Password: password, - MasterKey: provisioningMessage.GetMasterKey(), AccountEntropyPool: libsignalgo.AccountEntropyPool(provisioningMessage.GetAccountEntropyPool()), EphemeralBackupKey: libsignalgo.BytesToBackupKey(provisioningMessage.GetEphemeralBackupKey()), MediaRootBackupKey: libsignalgo.BytesToBackupKey(provisioningMessage.GetMediaRootBackupKey()), } if provisioningMessage.GetAccountEntropyPool() != "" { - var masterKey []byte - masterKey, err = libsignalgo.AccountEntropyPool(provisioningMessage.GetAccountEntropyPool()).DeriveSVRKey() + data.MasterKey, err = libsignalgo.AccountEntropyPool(provisioningMessage.GetAccountEntropyPool()).DeriveSVRKey() if err != nil { log.Err(err).Msg("Failed to derive master key from account entropy pool") } else { log.Debug().Msg("Derived master key from account entropy pool") } - if data.MasterKey == nil { - data.MasterKey = masterKey - } else if !hmac.Equal(data.MasterKey, masterKey) { - log.Warn().Msg("Master key mismatch") - } + } else { + log.Warn().Msg("No account entropy pool in provisioning message") } // Store the provisioning data diff --git a/pkg/signalmeow/receiving.go b/pkg/signalmeow/receiving.go index 9fa4b84..6b92d04 100644 --- a/pkg/signalmeow/receiving.go +++ b/pkg/signalmeow/receiving.go @@ -357,7 +357,7 @@ func (cli *Client) incomingAPIMessageHandler(ctx context.Context, req *signalpb. return nil, err } log = log.With(). - Uint64("envelope_timestamp", envelope.GetTimestamp()). + Uint64("envelope_timestamp", envelope.GetClientTimestamp()). Uint64("server_timestamp", envelope.GetServerTimestamp()). Logger() ctx = log.WithContext(ctx) @@ -368,7 +368,7 @@ func (cli *Client) incomingAPIMessageHandler(ctx context.Context, req *signalpb. Str("source_service_id", envelope.GetSourceServiceId()). Hex("destination_service_id_bytes", envelope.GetDestinationServiceIdBinary()). Hex("source_service_id_bytes", envelope.GetSourceServiceIdBinary()). - Uint32("source_device_id", envelope.GetSourceDevice()). + Uint32("source_device_id", envelope.GetSourceDeviceId()). Object("parsed_destination_service_id", destinationServiceID). Object("parsed_source_service_id", sourceServiceID). Int32("envelope_type_id", int32(envelope.GetType())). @@ -436,20 +436,20 @@ func (cli *Client) handleDecryptedResult( Bool("urgent", envelope.GetUrgent()). Stringer("content_hint", result.ContentHint). Uint64("server_ts", envelope.GetServerTimestamp()). - Uint64("client_ts", envelope.GetTimestamp()). + Uint64("client_ts", envelope.GetClientTimestamp()). Msg("No sender address received") return nil } else if theirServiceID, err = result.SenderAddress.NameServiceID(); err != nil { log.Warn(). Uint64("server_ts", envelope.GetServerTimestamp()). - Uint64("client_ts", envelope.GetTimestamp()). + Uint64("client_ts", envelope.GetClientTimestamp()). Msg("Failed to get sender name as service ID") return fmt.Errorf("failed to get sender name as service ID: %w", err) } else if theirServiceID.Type != libsignalgo.ServiceIDTypeACI { log.Warn(). Any("their_service_id", theirServiceID). Uint64("server_ts", envelope.GetServerTimestamp()). - Uint64("client_ts", envelope.GetTimestamp()). + Uint64("client_ts", envelope.GetClientTimestamp()). Msg("Dropping message from non-ACI sender") return nil } @@ -469,7 +469,7 @@ func (cli *Client) handleDecryptedResult( Bool("urgent", envelope.GetUrgent()). Stringer("content_hint", result.ContentHint). Uint64("server_ts", envelope.GetServerTimestamp()). - Uint64("client_ts", envelope.GetTimestamp()). + Uint64("client_ts", envelope.GetClientTimestamp()). Stringer("sender", theirServiceID). Msg("Ignoring already processed event") return nil @@ -478,7 +478,7 @@ func (cli *Client) handleDecryptedResult( Bool("urgent", envelope.GetUrgent()). Stringer("content_hint", result.ContentHint). Uint64("server_ts", envelope.GetServerTimestamp()). - Uint64("client_ts", envelope.GetTimestamp()). + Uint64("client_ts", envelope.GetClientTimestamp()). Stringer("sender", theirServiceID). Msg("Decryption error with known sender") // Only send decryption error event if the message was urgent, @@ -489,12 +489,12 @@ func (cli *Client) handleDecryptedResult( handlerSuccess = cli.handleEvent(&events.DecryptionError{ Sender: theirServiceID.UUID, Err: result.Err, - Timestamp: envelope.GetTimestamp(), + Timestamp: envelope.GetClientTimestamp(), }) } if result.Retriable { go func() { - err := cli.sendRetryRequest(ctx, result, envelope.GetTimestamp()) + err := cli.sendRetryRequest(ctx, result, envelope.GetClientTimestamp()) if err != nil { log.Err(err).Msg("Failed to send retry request in background") } @@ -506,15 +506,15 @@ func (cli *Client) handleDecryptedResult( return nil } - content := result.Content - if content == nil { + rawContent := result.Content + if rawContent == nil { log.Warn().Msg("Decrypted content is nil") return nil } deviceID, _ := result.SenderAddress.DeviceID() log.Trace(). - Any("raw_data", content). + Any("raw_data", rawContent). Stringer("sender", theirServiceID). Uint("sender_device", deviceID). Msg("Raw event data") @@ -531,9 +531,10 @@ func (cli *Client) handleDecryptedResult( } logEvt.Bool("unencrypted", result.Unencrypted).Msg("Decrypted message") - if content.DecryptionErrorMessage != nil { + // Handle unencrypted types early and refuse any other unencrypted message + if rawContent.GetDecryptionErrorMessage() != nil { handlerSuccess = true - dem, err := libsignalgo.DeserializeDecryptionErrorMessage(content.DecryptionErrorMessage) + dem, err := libsignalgo.DeserializeDecryptionErrorMessage(rawContent.GetDecryptionErrorMessage()) if err != nil { log.Warn().Err(err).Msg("Failed to unmarshal decryption error message") } else { @@ -551,9 +552,9 @@ func (cli *Client) handleDecryptedResult( } // If there's a sender key distribution message, process it - if content.GetSenderKeyDistributionMessage() != nil { + if rawContent.SenderKeyDistributionMessage != nil { log.Debug().Msg("content includes sender key distribution message") - skdm, err := libsignalgo.DeserializeSenderKeyDistributionMessage(content.GetSenderKeyDistributionMessage()) + skdm, err := libsignalgo.DeserializeSenderKeyDistributionMessage(rawContent.SenderKeyDistributionMessage) if err != nil { log.Err(err).Msg("DeserializeSenderKeyDistributionMessage error") return err @@ -570,6 +571,7 @@ func (cli *Client) handleDecryptedResult( } } + // If we're getting a message to our PNI, mark it as needing a PNI signature message on the next send if destinationServiceID == cli.Store.PNIServiceID() { _, err = cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, theirServiceID.UUID, uuid.Nil, func(recipient *types.Recipient) (changed bool, err error) { if recipient.Whitelisted == nil { @@ -589,86 +591,100 @@ func (cli *Client) handleDecryptedResult( } } - if content.PniSignatureMessage != nil { + // If we receive a PNI signature message (because we sent to a PNI earlier), process it + if rawContent.PniSignatureMessage != nil { log.Debug().Msg("Content includes PNI signature message") - err = cli.handlePNISignatureMessage(ctx, theirServiceID, content.PniSignatureMessage) + err = cli.handlePNISignatureMessage(ctx, theirServiceID, rawContent.PniSignatureMessage) if err != nil { log.Err(err). - Hex("pni_raw", content.PniSignatureMessage.GetPni()). + Hex("pni_raw", rawContent.PniSignatureMessage.GetPni()). Stringer("aci", theirServiceID.UUID). Msg("Failed to verify ACI-PNI mapping") } } - if content.SyncMessage != nil && theirServiceID == cli.Store.ACIServiceID() { - handlerSuccess = cli.handleSyncMessage(ctx, content.SyncMessage, envelope) - return nil - } - isBlocked, err := cli.Store.RecipientStore.IsBlocked(ctx, theirServiceID.UUID) if err != nil { log.Err(err).Stringer("sender", theirServiceID).Msg("Failed to check if sender is blocked") } var sendDeliveryReceipt bool - if content.DataMessage != nil { + var deliveryReceiptTS uint64 + switch content := rawContent.Content.(type) { + case *signalpb.Content_SyncMessage: + if theirServiceID == cli.Store.ACIServiceID() { + handlerSuccess = cli.handleSyncMessage(ctx, content.SyncMessage, envelope) + } + return nil + case *signalpb.Content_DataMessage: handlerSuccess, sendDeliveryReceipt = cli.incomingDataMessage( ctx, content.DataMessage, theirServiceID.UUID, theirServiceID, envelope.GetServerTimestamp(), isBlocked, ) - } else if content.EditMessage != nil { + deliveryReceiptTS = content.DataMessage.GetTimestamp() + case *signalpb.Content_EditMessage: handlerSuccess, sendDeliveryReceipt = cli.incomingEditMessage( ctx, content.EditMessage, theirServiceID.UUID, theirServiceID, envelope.GetServerTimestamp(), isBlocked, ) - } - if sendDeliveryReceipt && handlerSuccess { - err = cli.sendDeliveryReceipts(ctx, []uint64{content.DataMessage.GetTimestamp()}, theirServiceID.UUID) - if err != nil { - log.Err(err).Msg("sendDeliveryReceipts error") - } - } - - if content.TypingMessage != nil && (!isBlocked || content.TypingMessage.GetGroupId() != nil) { - var groupID types.GroupIdentifier - if content.TypingMessage.GetGroupId() != nil { - gidBytes := content.TypingMessage.GetGroupId() - groupID = types.GroupIdentifier(base64.StdEncoding.EncodeToString(gidBytes)) - } - // No handler success check here, nobody cares if typing notifications are dropped - cli.handleEvent(&events.ChatEvent{ - Info: events.MessageInfo{ - Sender: theirServiceID.UUID, - ChatID: groupOrUserID(groupID, theirServiceID), - ServerTimestamp: envelope.GetServerTimestamp(), - }, - Event: content.TypingMessage, - }) - } - - // DM call message (group call is an opaque callMessage and a groupCallUpdate in a dataMessage) - if content.CallMessage != nil && (content.CallMessage.Offer != nil || content.CallMessage.Hangup != nil) && !isBlocked { - handlerSuccess = cli.handleEvent(&events.Call{ - Info: events.MessageInfo{ - Sender: theirServiceID.UUID, - ChatID: theirServiceID.String(), - ServerTimestamp: envelope.GetServerTimestamp(), - }, - // CallMessage doesn't have its own timestamp, use one from the envelope - Timestamp: envelope.GetTimestamp(), - IsRinging: content.CallMessage.Offer != nil, - }) && handlerSuccess - } - - // Read and delivery receipts - if content.ReceiptMessage != nil { - if content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_DELIVERY && theirServiceID == cli.Store.ACIServiceID() { + deliveryReceiptTS = content.EditMessage.GetDataMessage().GetTimestamp() + case *signalpb.Content_ReceiptMessage: + if content.ReceiptMessage.GetType() == signalpb.ReceiptMessage_DELIVERY && theirServiceID == cli.Store.ACIServiceID() { // Ignore delivery receipts from other own devices return nil } handlerSuccess = cli.handleEvent(&events.Receipt{ Sender: theirServiceID.UUID, Content: content.ReceiptMessage, - }) && handlerSuccess + }) + case *signalpb.Content_TypingMessage: + var groupID types.GroupIdentifier + if content.TypingMessage.GetGroupId() != nil { + gidBytes := content.TypingMessage.GetGroupId() + groupID = types.GroupIdentifier(base64.StdEncoding.EncodeToString(gidBytes)) + } + if !isBlocked || groupID != "" { + // No handler success check here, nobody cares if typing notifications are dropped + cli.handleEvent(&events.ChatEvent{ + Info: events.MessageInfo{ + Sender: theirServiceID.UUID, + ChatID: groupOrUserID(groupID, theirServiceID), + ServerTimestamp: envelope.GetServerTimestamp(), + }, + Event: content.TypingMessage, + }) + } + case *signalpb.Content_CallMessage: + if !isBlocked && (content.CallMessage.Offer != nil || content.CallMessage.Hangup != nil) { + handlerSuccess = cli.handleEvent(&events.Call{ + Info: events.MessageInfo{ + Sender: theirServiceID.UUID, + ChatID: theirServiceID.String(), + ServerTimestamp: envelope.GetServerTimestamp(), + }, + // CallMessage doesn't have its own timestamp, use one from the envelope + Timestamp: envelope.GetClientTimestamp(), + IsRinging: content.CallMessage.Offer != nil, + }) + } + case *signalpb.Content_DecryptionErrorMessage: + // These should've been handled earlier + log.Warn().Msg("Unexpected decryption error message content in decrypted message") + case *signalpb.Content_NullMessage: + // This is intentionally ignored + case *signalpb.Content_StoryMessage: + // This is also ignored for now + default: + if rawContent.PniSignatureMessage == nil && rawContent.SenderKeyDistributionMessage == nil { + log.Warn().Type("content_type", content).Msg("Unrecognized message content type") + } } + + if sendDeliveryReceipt && handlerSuccess { + err = cli.sendDeliveryReceipts(ctx, []uint64{deliveryReceiptTS}, theirServiceID.UUID) + if err != nil { + log.Err(err).Msg("sendDeliveryReceipts error") + } + } + return nil } @@ -683,9 +699,9 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess // TODO: handle more sync messages handlerSuccess = true log := zerolog.Ctx(ctx) - if msg.Keys != nil { - aep := libsignalgo.AccountEntropyPool(msg.Keys.GetAccountEntropyPool()) - cli.Store.MasterKey = msg.Keys.GetMaster() + switch content := msg.Content.(type) { + case *signalpb.SyncMessage_Keys_: + aep := libsignalgo.AccountEntropyPool(content.Keys.GetAccountEntropyPool()) if aep != "" { aepMasterKey, err := aep.DeriveSVRKey() if err != nil { @@ -708,59 +724,65 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess log.Info().Msg("Received master key") go cli.SyncStorage(ctx) } - } else if msg.GetFetchLatest().GetType() == signalpb.SyncMessage_FetchLatest_STORAGE_MANIFEST { - log.Debug().Msg("Received storage manifest fetch latest notice") - go cli.SyncStorage(ctx) - } - syncSent := msg.GetSent() - if syncSent.GetMessage() != nil || syncSent.GetEditMessage() != nil { - syncDestinationServiceID, err := ParseStringOrBinaryServiceID(syncSent.GetDestinationServiceId(), syncSent.GetDestinationServiceIdBinary()) - if err != nil && !errors.Is(err, ErrEmptyUUIDInput) { - log.Err(err).Msg("Sync message destination parse error") + case *signalpb.SyncMessage_FetchLatest_: + switch content.FetchLatest.GetType() { + case signalpb.SyncMessage_FetchLatest_STORAGE_MANIFEST: + log.Debug().Msg("Received storage manifest fetch latest notice") + go cli.SyncStorage(ctx) + default: + log.Debug(). + Stringer("fetch_latest_type", content.FetchLatest.GetType()). + Msg("Received unknown fetch latest notice") } - if syncSent.GetDestinationE164() != "" && !syncDestinationServiceID.IsEmpty() { - aci, pni := syncDestinationServiceID.ToACIAndPNI() - _, err = cli.Store.RecipientStore.UpdateRecipientE164(ctx, aci, pni, syncSent.GetDestinationE164()) - if err != nil { - log.Err(err).Msg("Failed to update recipient E164 after receiving sync message") + case *signalpb.SyncMessage_Sent_: + syncSent := content.Sent + if syncSent.GetMessage() != nil || syncSent.GetEditMessage() != nil { + syncDestinationServiceID, err := ParseStringOrBinaryServiceID(syncSent.GetDestinationServiceId(), syncSent.GetDestinationServiceIdBinary()) + if err != nil && !errors.Is(err, ErrEmptyUUIDInput) { + log.Err(err).Msg("Sync message destination parse error") } - } - for _, unident := range syncSent.GetUnidentifiedStatus() { - serviceID, err := ParseStringOrBinaryServiceID(unident.GetDestinationServiceId(), unident.GetDestinationServiceIdBinary()) - if err != nil { - log.Err(err). - Str("destination_service_id", unident.GetDestinationServiceId()). - Hex("destination_service_id_bytes", unident.GetDestinationServiceIdBinary()). - Msg("Failed to parse destination service ID of unidentified send") - continue + if syncSent.GetDestinationE164() != "" && !syncDestinationServiceID.IsEmpty() { + aci, pni := syncDestinationServiceID.ToACIAndPNI() + _, err = cli.Store.RecipientStore.UpdateRecipientE164(ctx, aci, pni, syncSent.GetDestinationE164()) + if err != nil { + log.Err(err).Msg("Failed to update recipient E164 after receiving sync message") + } } - changed, err := cli.saveSyncPNIIdentityKey(ctx, serviceID, unident.GetDestinationPniIdentityKey()) - if err != nil { - log.Err(err). - Stringer("destination_service_id", serviceID). - Msg("Failed to save PNI identity key from sync message") - } else if changed { - log.Debug(). - Stringer("destination_service_id", serviceID). - Msg("Saved new PNI identity key from sync message") + for _, unident := range syncSent.GetUnidentifiedStatus() { + serviceID, err := ParseStringOrBinaryServiceID(unident.GetDestinationServiceId(), unident.GetDestinationServiceIdBinary()) + if err != nil { + log.Err(err). + Str("destination_service_id", unident.GetDestinationServiceId()). + Hex("destination_service_id_bytes", unident.GetDestinationServiceIdBinary()). + Msg("Failed to parse destination service ID of unidentified send") + continue + } + changed, err := cli.saveSyncPNIIdentityKey(ctx, serviceID, unident.GetDestinationPniIdentityKey()) + if err != nil { + log.Err(err). + Stringer("destination_service_id", serviceID). + Msg("Failed to save PNI identity key from sync message") + } else if changed { + log.Debug(). + Stringer("destination_service_id", serviceID). + Msg("Saved new PNI identity key from sync message") + } } - } - if syncDestinationServiceID.IsEmpty() && syncSent.GetMessage().GetGroupV2() == nil && syncSent.GetEditMessage().GetDataMessage().GetGroupV2() == nil { - log.Warn().Msg("sync message sent destination is nil") - } else if msg.Sent.Message != nil { - // TODO handle expiration start ts, and maybe the sync message ts? - cli.incomingDataMessage(ctx, msg.Sent.Message, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp(), false) - } else if msg.Sent.EditMessage != nil { - cli.incomingEditMessage(ctx, msg.Sent.EditMessage, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp(), false) + if syncDestinationServiceID.IsEmpty() && syncSent.GetMessage().GetGroupV2() == nil && syncSent.GetEditMessage().GetDataMessage().GetGroupV2() == nil { + log.Warn().Msg("sync message sent destination is nil") + } else if syncSent.Message != nil { + // TODO handle expiration start ts, and maybe the sync message ts? + cli.incomingDataMessage(ctx, syncSent.Message, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp(), false) + } else if syncSent.EditMessage != nil { + cli.incomingEditMessage(ctx, syncSent.EditMessage, cli.Store.ACI, syncDestinationServiceID, envelope.GetServerTimestamp(), false) + } } - } - if msg.Contacts != nil { + case *signalpb.SyncMessage_Contacts_: log.Debug().Msg("Recieved sync message contacts") - blob := msg.Contacts.Blob - if blob != nil { + if content.Contacts.Blob != nil { // TODO roundtrip via disk to save memory - contactsBytes, err := DownloadAttachmentWithPointer(ctx, blob, nil, nil) + contactsBytes, err := DownloadAttachmentWithPointer(ctx, content.Contacts.Blob, nil, nil) if err != nil { log.Err(err).Msg("Contacts Sync DownloadAttachment error") } @@ -796,22 +818,14 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess }) } } - } - if msg.Read != nil { - handlerSuccess = cli.handleEvent(&events.ReadSelf{ - Timestamp: envelope.GetTimestamp(), - Messages: msg.GetRead(), - }) - } - if msg.DeleteForMe != nil { + case *signalpb.SyncMessage_DeleteForMe_: handlerSuccess = cli.handleEvent(&events.DeleteForMe{ - Timestamp: envelope.GetTimestamp(), - SyncMessage_DeleteForMe: msg.DeleteForMe, + Timestamp: envelope.GetClientTimestamp(), + SyncMessage_DeleteForMe: content.DeleteForMe, }) - } - if msg.MessageRequestResponse != nil { - aciUUID, _ := ParseStringOrBinaryUUID(msg.MessageRequestResponse.GetThreadAci(), msg.MessageRequestResponse.GetThreadAciBinary()) - if aciUUID != uuid.Nil && msg.MessageRequestResponse.GetType() == signalpb.SyncMessage_MessageRequestResponse_ACCEPT { + case *signalpb.SyncMessage_MessageRequestResponse_: + aciUUID, _ := ParseStringOrBinaryUUID(content.MessageRequestResponse.GetThreadAci(), content.MessageRequestResponse.GetThreadAciBinary()) + if aciUUID != uuid.Nil && content.MessageRequestResponse.GetType() == signalpb.SyncMessage_MessageRequestResponse_ACCEPT { _, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aciUUID, uuid.Nil, func(recipient *types.Recipient) (changed bool, err error) { changed = !ptr.Val(recipient.Whitelisted) || recipient.NeedsPNISignature recipient.Whitelisted = ptr.Ptr(true) @@ -823,16 +837,23 @@ func (cli *Client) handleSyncMessage(ctx context.Context, msg *signalpb.SyncMess } } var groupID *libsignalgo.GroupIdentifier - if len(msg.MessageRequestResponse.GroupId) == libsignalgo.GroupIdentifierLength { - groupID = (*libsignalgo.GroupIdentifier)(msg.MessageRequestResponse.GroupId) + if len(content.MessageRequestResponse.GroupId) == libsignalgo.GroupIdentifierLength { + groupID = (*libsignalgo.GroupIdentifier)(content.MessageRequestResponse.GroupId) } handlerSuccess = cli.handleEvent(&events.MessageRequestResponse{ - Timestamp: envelope.GetTimestamp(), + Timestamp: envelope.GetClientTimestamp(), ThreadACI: aciUUID, GroupID: groupID, - Type: msg.MessageRequestResponse.GetType(), - Raw: msg.MessageRequestResponse, + Type: content.MessageRequestResponse.GetType(), + Raw: content.MessageRequestResponse, }) + default: + if msg.Read != nil { + handlerSuccess = cli.handleEvent(&events.ReadSelf{ + Timestamp: envelope.GetClientTimestamp(), + Messages: msg.Read, + }) + } } return } diff --git a/pkg/signalmeow/receiving_decrypt.go b/pkg/signalmeow/receiving_decrypt.go index 24b76ff..6296f00 100644 --- a/pkg/signalmeow/receiving_decrypt.go +++ b/pkg/signalmeow/receiving_decrypt.go @@ -64,14 +64,14 @@ func (cli *Client) decryptEnvelope( } return result - case signalpb.Envelope_PREKEY_BUNDLE, signalpb.Envelope_CIPHERTEXT: - sender, err := sourceServiceID.Address(uint(envelope.GetSourceDevice())) + case signalpb.Envelope_PREKEY_MESSAGE, signalpb.Envelope_DOUBLE_RATCHET: + sender, err := sourceServiceID.Address(uint(envelope.GetSourceDeviceId())) if err != nil { return DecryptionResult{Err: fmt.Errorf("failed to wrap address: %v", err)} } var result *DecryptionResult var bundleType string - if *envelope.Type == signalpb.Envelope_PREKEY_BUNDLE { + if *envelope.Type == signalpb.Envelope_PREKEY_MESSAGE { result, err = cli.prekeyDecrypt(ctx, destinationServiceID, sender, envelope.Content, envelope.GetServerTimestamp()) bundleType = "prekey bundle" } else { @@ -90,7 +90,7 @@ func (cli *Client) decryptEnvelope( return *result case signalpb.Envelope_PLAINTEXT_CONTENT: - addr, err := sourceServiceID.Address(uint(envelope.GetSourceDevice())) + addr, err := sourceServiceID.Address(uint(envelope.GetSourceDeviceId())) if err != nil { return DecryptionResult{Err: fmt.Errorf("failed to wrap address: %v", err)} } @@ -100,16 +100,13 @@ func (cli *Client) decryptEnvelope( } return DecryptionResult{ SenderAddress: addr, - Content: &signalpb.Content{DecryptionErrorMessage: content}, + Content: &signalpb.Content{Content: &signalpb.Content_DecryptionErrorMessage{DecryptionErrorMessage: content}}, Unencrypted: true, } case signalpb.Envelope_SERVER_DELIVERY_RECEIPT: return DecryptionResult{Err: fmt.Errorf("server delivery receipt envelopes are not yet supported")} - case signalpb.Envelope_SENDERKEY_MESSAGE: - return DecryptionResult{Err: fmt.Errorf("senderkey message envelopes are not yet supported")} - case signalpb.Envelope_UNKNOWN: return DecryptionResult{Err: fmt.Errorf("unknown envelope type")} @@ -399,7 +396,9 @@ func (cli *Client) decryptUnidentifiedSenderEnvelope(ctx context.Context, destin } result.Unencrypted = true result.Content = &signalpb.Content{ - DecryptionErrorMessage: usmcContents, + Content: &signalpb.Content_DecryptionErrorMessage{ + DecryptionErrorMessage: usmcContents, + }, } return result, err default: diff --git a/pkg/signalmeow/retry.go b/pkg/signalmeow/retry.go index 2c89ecc..a581075 100644 --- a/pkg/signalmeow/retry.go +++ b/pkg/signalmeow/retry.go @@ -19,10 +19,12 @@ package signalmeow import ( "context" "fmt" + "math/rand/v2" "slices" "time" "github.com/rs/zerolog" + "go.mau.fi/util/random" "go.mau.fi/mautrix-signal/pkg/libsignalgo" signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" @@ -63,7 +65,9 @@ func (cli *Client) sendRetryRequest(ctx context.Context, result DecryptionResult return fmt.Errorf("failed to create ciphertext message from plaintext content: %w", err) } _, err = cli.sendContent(ctx, serviceID, uint64(time.Now().UnixMilli()), &signalpb.Content{ - DecryptionErrorMessage: demBytes, + Content: &signalpb.Content_DecryptionErrorMessage{ + DecryptionErrorMessage: demBytes, + }, }, 0, true, result.GroupID, ctm) if err != nil { return fmt.Errorf("failed to send decryption error message: %w", err) @@ -182,7 +186,11 @@ func (cli *Client) handleRetryRequest( Msg("Not responding to decryption error message") return nil } - retryContent.NullMessage = &signalpb.NullMessage{} + retryContent.Content = &signalpb.Content_NullMessage{ + NullMessage: &signalpb.NullMessage{ + Padding: random.Bytes(rand.IntN(511) + 1), + }, + } } responseTimestamp := uint64(time.Now().UnixMilli()) if cacheHit { diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 94f1dcf..769798a 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + "math/rand/v2" "net/http" "strconv" "strings" @@ -31,6 +32,7 @@ import ( "github.com/rs/zerolog" "go.mau.fi/util/exfmt" "go.mau.fi/util/ptr" + "go.mau.fi/util/random" "google.golang.org/protobuf/proto" "go.mau.fi/mautrix-signal/pkg/libsignalgo" @@ -222,11 +224,9 @@ func (cli *Client) buildMessagesToSend( func ctmTypeToEnvelopeType(ctmType libsignalgo.CiphertextMessageType) signalpb.Envelope_Type { switch ctmType { case libsignalgo.CiphertextMessageTypeWhisper: - return signalpb.Envelope_CIPHERTEXT // 2 -> 1 + return signalpb.Envelope_DOUBLE_RATCHET // 2 -> 1 case libsignalgo.CiphertextMessageTypePreKey: - return signalpb.Envelope_PREKEY_BUNDLE // 3 -> 3 - case libsignalgo.CiphertextMessageTypeSenderKey: - return signalpb.Envelope_SENDERKEY_MESSAGE // 7 -> 7 + return signalpb.Envelope_PREKEY_MESSAGE // 3 -> 3 case libsignalgo.CiphertextMessageTypePlaintext: return signalpb.Envelope_PLAINTEXT_CONTENT // 8 -> 8 default: @@ -302,11 +302,21 @@ type SendResult interface { func (gmsr *GroupMessageSendResult) isSendResult() {} func (smsr *SendMessageResult) isSendResult() {} -func contentFromDataMessage(dataMessage *signalpb.DataMessage) *signalpb.Content { +func WrapSyncMessage(content *signalpb.SyncMessage) *signalpb.Content { + content.Padding = random.Bytes(rand.IntN(511) + 1) return &signalpb.Content{ - DataMessage: dataMessage, + Content: &signalpb.Content_SyncMessage{SyncMessage: content}, } } + +func syncSentMessage(sent *signalpb.SyncMessage_Sent) *signalpb.Content { + return WrapSyncMessage(&signalpb.SyncMessage{ + Content: &signalpb.SyncMessage_Sent_{ + Sent: sent, + }, + }) +} + func syncMessageFromGroupDataMessage(dataMessage *signalpb.DataMessage, results []SuccessfulSendResult) *signalpb.Content { unidentifiedStatuses := []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{} for _, result := range results { @@ -315,17 +325,14 @@ func syncMessageFromGroupDataMessage(dataMessage *signalpb.DataMessage, results Unidentified: &result.Unidentified, }) } - return &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ - Sent: &signalpb.SyncMessage_Sent{ - Message: dataMessage, - Timestamp: dataMessage.Timestamp, - UnidentifiedStatus: unidentifiedStatuses, - ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), - }, - }, - } + return syncSentMessage(&signalpb.SyncMessage_Sent{ + Message: dataMessage, + Timestamp: dataMessage.Timestamp, + UnidentifiedStatus: unidentifiedStatuses, + ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), + }) } + func syncMessageFromGroupEditMessage(editMessage *signalpb.EditMessage, results []SuccessfulSendResult) *signalpb.Content { unidentifiedStatuses := []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{} for _, result := range results { @@ -334,58 +341,46 @@ func syncMessageFromGroupEditMessage(editMessage *signalpb.EditMessage, results Unidentified: &result.Unidentified, }) } - return &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ - Sent: &signalpb.SyncMessage_Sent{ - EditMessage: editMessage, - Timestamp: editMessage.GetDataMessage().Timestamp, - UnidentifiedStatus: unidentifiedStatuses, - ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), - }, - }, - } + return syncSentMessage(&signalpb.SyncMessage_Sent{ + EditMessage: editMessage, + Timestamp: editMessage.GetDataMessage().Timestamp, + UnidentifiedStatus: unidentifiedStatuses, + ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), + }) } func syncMessageFromSoloDataMessage(dataMessage *signalpb.DataMessage, result SuccessfulSendResult) *signalpb.Content { - return &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ - Sent: &signalpb.SyncMessage_Sent{ - Message: dataMessage, - DestinationE164: result.RecipientE164, + return syncSentMessage(&signalpb.SyncMessage_Sent{ + Message: dataMessage, + DestinationE164: result.RecipientE164, + DestinationServiceIdBinary: result.Recipient.Bytes(), + Timestamp: dataMessage.Timestamp, + ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), + UnidentifiedStatus: []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ + { DestinationServiceIdBinary: result.Recipient.Bytes(), - Timestamp: dataMessage.Timestamp, - ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), - UnidentifiedStatus: []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ - { - DestinationServiceIdBinary: result.Recipient.Bytes(), - Unidentified: &result.Unidentified, - DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), - }, - }, + Unidentified: &result.Unidentified, + DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), }, }, - } + }) } func syncMessageFromSoloEditMessage(editMessage *signalpb.EditMessage, result SuccessfulSendResult) *signalpb.Content { - return &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ - Sent: &signalpb.SyncMessage_Sent{ - EditMessage: editMessage, - DestinationE164: result.RecipientE164, + return syncSentMessage(&signalpb.SyncMessage_Sent{ + EditMessage: editMessage, + DestinationE164: result.RecipientE164, + DestinationServiceIdBinary: result.Recipient.Bytes(), + Timestamp: editMessage.DataMessage.Timestamp, + ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), + UnidentifiedStatus: []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ + { DestinationServiceIdBinary: result.Recipient.Bytes(), - Timestamp: editMessage.DataMessage.Timestamp, - ExpirationStartTimestamp: ptr.Ptr(uint64(time.Now().UnixMilli())), - UnidentifiedStatus: []*signalpb.SyncMessage_Sent_UnidentifiedDeliveryStatus{ - { - DestinationServiceIdBinary: result.Recipient.Bytes(), - Unidentified: &result.Unidentified, - DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), - }, - }, + Unidentified: &result.Unidentified, + DestinationPniIdentityKey: result.DestinationPNIIdentityKey.TrySerialize(), }, }, - } + }) } func syncMessageFromReadReceiptMessage(ctx context.Context, receiptMessage *signalpb.ReceiptMessage, messageSender libsignalgo.ServiceID) *signalpb.Content { @@ -407,11 +402,9 @@ func syncMessageFromReadReceiptMessage(ctx context.Context, receiptMessage *sign SenderAci: proto.String(messageSender.UUID.String()), }) } - return &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ - Read: read, - }, - } + return WrapSyncMessage(&signalpb.SyncMessage{ + Read: read, + }) } func (cli *Client) SendContactSyncRequest(ctx context.Context) error { @@ -427,13 +420,13 @@ func (cli *Client) SendContactSyncRequest(ctx context.Context) error { } cli.LastContactRequestTime = time.Now() - _, err := cli.sendContent(ctx, cli.Store.ACIServiceID(), uint64(time.Now().UnixMilli()), &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ + _, err := cli.sendContent(ctx, cli.Store.ACIServiceID(), uint64(time.Now().UnixMilli()), WrapSyncMessage(&signalpb.SyncMessage{ + Content: &signalpb.SyncMessage_Request_{ Request: &signalpb.SyncMessage_Request{ Type: signalpb.SyncMessage_Request_CONTACTS.Enum(), }, }, - }, 0, false, nil, nil) + }), 0, false, nil, nil) if err != nil { log.Err(err).Msg("Failed to send contact sync request message to myself") return err @@ -447,13 +440,13 @@ func (cli *Client) SendStorageMasterKeyRequest(ctx context.Context) error { Logger() ctx = log.WithContext(ctx) - _, err := cli.sendContent(ctx, cli.Store.ACIServiceID(), uint64(time.Now().UnixMilli()), &signalpb.Content{ - SyncMessage: &signalpb.SyncMessage{ + _, err := cli.sendContent(ctx, cli.Store.ACIServiceID(), uint64(time.Now().UnixMilli()), WrapSyncMessage(&signalpb.SyncMessage{ + Content: &signalpb.SyncMessage_Request_{ Request: &signalpb.SyncMessage_Request{ Type: signalpb.SyncMessage_Request_KEYS.Enum(), }, }, - }, 0, false, nil, nil) + }), 0, false, nil, nil) if err != nil { log.Err(err).Msg("Failed to send key sync request message to myself") return err @@ -473,38 +466,47 @@ func TypingMessage(isTyping bool) *signalpb.Content { } else { action = signalpb.TypingMessage_STOPPED } - tm := &signalpb.TypingMessage{ - Timestamp: ×tamp, - Action: &action, - } return &signalpb.Content{ - TypingMessage: tm, + Content: &signalpb.Content_TypingMessage{ + TypingMessage: &signalpb.TypingMessage{ + Timestamp: ×tamp, + Action: &action, + }, + }, } } func DeliveredReceiptMessageForTimestamps(timestamps []uint64) *signalpb.Content { - rm := &signalpb.ReceiptMessage{ - Timestamp: timestamps, - Type: signalpb.ReceiptMessage_DELIVERY.Enum(), - } return &signalpb.Content{ - ReceiptMessage: rm, + Content: &signalpb.Content_ReceiptMessage{ + ReceiptMessage: &signalpb.ReceiptMessage{ + Timestamp: timestamps, + Type: signalpb.ReceiptMessage_DELIVERY.Enum(), + }, + }, } } func ReadReceptMessageForTimestamps(timestamps []uint64) *signalpb.Content { - rm := &signalpb.ReceiptMessage{ - Timestamp: timestamps, - Type: signalpb.ReceiptMessage_READ.Enum(), - } return &signalpb.Content{ - ReceiptMessage: rm, + Content: &signalpb.Content_ReceiptMessage{ + ReceiptMessage: &signalpb.ReceiptMessage{ + Timestamp: timestamps, + Type: signalpb.ReceiptMessage_READ.Enum(), + }, + }, } } -func wrapDataMessageInContent(dm *signalpb.DataMessage) *signalpb.Content { +func WrapDataMessage(dm *signalpb.DataMessage) *signalpb.Content { return &signalpb.Content{ - DataMessage: dm, + Content: &signalpb.Content_DataMessage{DataMessage: dm}, + } +} + +func WrapEditMessage(dm *signalpb.EditMessage) *signalpb.Content { + return &signalpb.Content{ + Content: &signalpb.Content_EditMessage{EditMessage: dm}, } } @@ -531,7 +533,7 @@ func (cli *Client) SendGroupUpdate(ctx context.Context, group *Group, groupConte Timestamp: ×tamp, GroupV2: groupContext, } - content := wrapDataMessageInContent(dm) + content := WrapDataMessage(dm) var recipients []libsignalgo.ServiceID for _, member := range group.Members { serviceID := member.UserServiceID() @@ -569,13 +571,14 @@ func (cli *Client) SendGroupMessage(ctx context.Context, gid types.GroupIdentifi return nil, err } var messageTimestamp uint64 - if content.GetDataMessage() != nil { + switch content := content.Content.(type) { + case *signalpb.Content_DataMessage: messageTimestamp = content.DataMessage.GetTimestamp() content.DataMessage.GroupV2 = groupMetadataForDataMessage(*group) - } else if content.GetEditMessage().GetDataMessage() != nil { + case *signalpb.Content_EditMessage: messageTimestamp = content.EditMessage.DataMessage.GetTimestamp() content.EditMessage.DataMessage.GroupV2 = groupMetadataForDataMessage(*group) - } else if content.GetTypingMessage() != nil { + case *signalpb.Content_TypingMessage: messageTimestamp = content.TypingMessage.GetTimestamp() groupIDBytes, err := group.GroupIdentifier.Bytes() if err != nil { @@ -611,7 +614,7 @@ func (cli *Client) sendToGroup( FailedToSendTo: []FailedSendResult{}, } } - if content.TypingMessage != nil { + if content.GetTypingMessage() != nil { // Never send typing messages via fallback path return result, nil } @@ -653,15 +656,16 @@ func (cli *Client) sendToGroup( func (cli *Client) sendGroupSyncCopy( ctx context.Context, - content *signalpb.Content, + rawContent *signalpb.Content, messageTimestamp uint64, result *GroupMessageSendResult, groupID *libsignalgo.GroupIdentifier, ) { var syncContent *signalpb.Content - if content.GetDataMessage() != nil { + switch content := rawContent.Content.(type) { + case *signalpb.Content_DataMessage: syncContent = syncMessageFromGroupDataMessage(content.DataMessage, result.SuccessfullySentTo) - } else if content.GetEditMessage() != nil { + case *signalpb.Content_EditMessage: syncContent = syncMessageFromGroupEditMessage(content.EditMessage, result.SuccessfullySentTo) } if syncContent != nil { @@ -672,16 +676,17 @@ func (cli *Client) sendGroupSyncCopy( } } -func (cli *Client) sendSyncCopy(ctx context.Context, content *signalpb.Content, messageTS uint64, result *SuccessfulSendResult) bool { +func (cli *Client) sendSyncCopy(ctx context.Context, rawContent *signalpb.Content, messageTS uint64, result *SuccessfulSendResult) bool { var syncContent *signalpb.Content - if content.GetDataMessage() != nil { + switch content := rawContent.Content.(type) { + case *signalpb.Content_DataMessage: syncContent = syncMessageFromSoloDataMessage(content.DataMessage, *result) - } else if content.GetEditMessage() != nil { + case *signalpb.Content_EditMessage: syncContent = syncMessageFromSoloEditMessage(content.EditMessage, *result) - } else if content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_READ { + case *signalpb.Content_ReceiptMessage: syncContent = syncMessageFromReadReceiptMessage(ctx, content.ReceiptMessage, result.Recipient) - } else if content.GetSyncMessage() != nil { - syncContent = content + case *signalpb.Content_SyncMessage: + syncContent = rawContent } if syncContent != nil { _, selfSendErr := cli.sendContent(ctx, cli.Store.ACIServiceID(), messageTS, syncContent, 0, true, nil, nil) @@ -697,22 +702,25 @@ func (cli *Client) sendSyncCopy(ctx context.Context, content *signalpb.Content, func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.ServiceID, content *signalpb.Content) SendMessageResult { // Assemble the content to send var messageTimestamp uint64 - switch { - case content.DataMessage != nil: - messageTimestamp = *content.DataMessage.Timestamp - case content.EditMessage != nil: - messageTimestamp = *content.EditMessage.DataMessage.Timestamp - case content.TypingMessage != nil: - messageTimestamp = *content.TypingMessage.Timestamp - case content.SyncMessage != nil, - content.NullMessage != nil, - content.ReceiptMessage != nil, - content.PniSignatureMessage != nil, - content.SenderKeyDistributionMessage != nil, - content.DecryptionErrorMessage != nil: + switch realContent := content.Content.(type) { + case *signalpb.Content_DataMessage: + messageTimestamp = *realContent.DataMessage.Timestamp + case *signalpb.Content_EditMessage: + messageTimestamp = *realContent.EditMessage.DataMessage.Timestamp + case *signalpb.Content_TypingMessage: + messageTimestamp = *realContent.TypingMessage.Timestamp + case *signalpb.Content_SyncMessage, + *signalpb.Content_NullMessage, + *signalpb.Content_ReceiptMessage, + *signalpb.Content_DecryptionErrorMessage: messageTimestamp = currentMessageTimestamp() + case *signalpb.Content_StoryMessage: + // not yet supported default: - panic(fmt.Errorf("unsupported payload in SendMessage")) + if content.SenderKeyDistributionMessage == nil && content.PniSignatureMessage == nil { + panic(fmt.Errorf("unsupported payload in SendMessage")) + } + messageTimestamp = currentMessageTimestamp() } var aci, pni uuid.UUID if recipientID.Type == libsignalgo.ServiceIDTypeACI { @@ -720,7 +728,7 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv } else if recipientID.Type == libsignalgo.ServiceIDTypePNI { pni = recipientID.UUID } - isTypingOrReceipt := content.TypingMessage != nil || content.ReceiptMessage != nil + isTypingOrReceipt := content.GetTypingMessage() != nil || content.GetReceiptMessage() != nil recipientData, err := cli.Store.RecipientStore.LoadAndUpdateRecipient(ctx, aci, pni, func(recipientData *types.Recipient) (changed bool, err error) { if content.GetDataMessage().GetFlags() == uint32(signalpb.DataMessage_PROFILE_KEY_UPDATE) { recipientData.Whitelisted = ptr.Ptr(true) @@ -758,7 +766,7 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv cli.sendSyncCopy(ctx, content, messageTimestamp, &res) } return SendMessageResult{WasSuccessful: true, SuccessfulSendResult: res} - } else if content.TypingMessage != nil && cli.Store.DeviceData.AccountRecord != nil && !cli.Store.DeviceData.AccountRecord.GetTypingIndicators() { + } else if content.GetTypingMessage() != nil && cli.Store.DeviceData.AccountRecord != nil && !cli.Store.DeviceData.AccountRecord.GetTypingIndicators() { zerolog.Ctx(ctx).Debug().Msg("Not sending typing message as typing indicators are disabled") res := SuccessfulSendResult{Recipient: recipientID} return SendMessageResult{WasSuccessful: true, SuccessfulSendResult: res} @@ -770,7 +778,7 @@ func (cli *Client) SendMessage(ctx context.Context, recipientID libsignalgo.Serv return SendMessageResult{WasSuccessful: true, SuccessfulSendResult: res} } - isDeliveryReceipt := content.ReceiptMessage != nil && content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_DELIVERY + isDeliveryReceipt := content.GetReceiptMessage() != nil && content.GetReceiptMessage().GetType() == signalpb.ReceiptMessage_DELIVERY if recipientID == cli.Store.ACIServiceID() && !isDeliveryReceipt { res := SuccessfulSendResult{ Recipient: recipientID, @@ -824,25 +832,38 @@ func currentMessageTimestamp() uint64 { } func isSyncMessageUrgent(content *signalpb.SyncMessage) bool { - return content.Sent != nil || content.Request != nil + switch content.Content.(type) { + case *signalpb.SyncMessage_Request_, + *signalpb.SyncMessage_Sent_: + return true + default: + return false + } } -func isUrgent(content *signalpb.Content) bool { - return content.DataMessage != nil || - content.CallMessage != nil || - content.StoryMessage != nil || - content.EditMessage != nil || - (content.SyncMessage != nil && isSyncMessageUrgent(content.SyncMessage)) +func isUrgent(rawContent *signalpb.Content) bool { + switch content := rawContent.Content.(type) { + case *signalpb.Content_SyncMessage: + return isSyncMessageUrgent(content.SyncMessage) + case *signalpb.Content_DataMessage, + *signalpb.Content_EditMessage, + *signalpb.Content_CallMessage, + *signalpb.Content_StoryMessage: + return true + default: + return false + } } -func getContentHint(content *signalpb.Content) libsignalgo.UnidentifiedSenderMessageContentHint { - if content.DataMessage != nil || content.EditMessage != nil { +func getContentHint(rawContent *signalpb.Content) libsignalgo.UnidentifiedSenderMessageContentHint { + switch rawContent.Content.(type) { + case *signalpb.Content_DataMessage, *signalpb.Content_EditMessage: return libsignalgo.UnidentifiedSenderMessageContentHintResendable - } - if content.TypingMessage != nil || content.ReceiptMessage != nil { + case *signalpb.Content_TypingMessage, *signalpb.Content_ReceiptMessage: return libsignalgo.UnidentifiedSenderMessageContentHintImplicit + default: + return libsignalgo.UnidentifiedSenderMessageContentHintDefault } - return libsignalgo.UnidentifiedSenderMessageContentHintDefault } func (cli *Client) sendContent( @@ -863,12 +884,12 @@ func (cli *Client) sendContent( ctx = log.WithContext(ctx) // If it's a data message, add our profile key - if content.DataMessage != nil && content.DataMessage.ProfileKey == nil { + if content.GetDataMessage() != nil && content.GetDataMessage().ProfileKey == nil { profileKey, err := cli.ProfileKeyForSignalID(ctx, cli.Store.ACI) if err != nil { log.Err(err).Msg("Error getting profile key, not adding to outgoing message") } else { - content.DataMessage.ProfileKey = profileKey.Slice() + content.GetDataMessage().ProfileKey = profileKey.Slice() } } From e0901b648fbd6504da03ff3c2eb88754232309eb Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 13 Apr 2026 16:58:43 +0300 Subject: [PATCH 148/170] handlesignal: add support for admin deletes --- pkg/connector/handlesignal.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/connector/handlesignal.go b/pkg/connector/handlesignal.go index 4438cb0..329b2cf 100644 --- a/pkg/connector/handlesignal.go +++ b/pkg/connector/handlesignal.go @@ -184,7 +184,7 @@ func (evt *Bv2ChatEvent) GetType() bridgev2.RemoteEventType { return bridgev2.RemoteEventReactionRemove } return bridgev2.RemoteEventReaction - case innerEvt.Delete != nil: + case innerEvt.Delete != nil, innerEvt.AdminDelete != nil: return bridgev2.RemoteEventMessageRemove case innerEvt.GetGroupV2().GetGroupChange() != nil: return bridgev2.RemoteEventChatInfoChange @@ -303,6 +303,11 @@ func (evt *Bv2ChatEvent) GetTargetMessage() networkid.MessageID { targetSentTS = innerEvt.Reaction.GetTargetSentTimestamp() case innerEvt.Delete != nil: targetSentTS = innerEvt.Delete.GetTargetSentTimestamp() + case innerEvt.AdminDelete != nil: + if len(innerEvt.AdminDelete.GetTargetAuthorAciBinary()) == 16 { + targetAuthorACI = uuid.UUID(innerEvt.AdminDelete.GetTargetAuthorAciBinary()) + } + targetSentTS = innerEvt.AdminDelete.GetTargetSentTimestamp() default: return "" } @@ -421,7 +426,7 @@ func (b *Bv2Receipt) GetReadUpTo() time.Time { return time.Time{} } -var _ bridgev2.RemoteReceipt = (*Bv2Receipt)(nil) +var _ bridgev2.RemoteReadReceipt = (*Bv2Receipt)(nil) func convertReceipts[T any](ctx context.Context, input []T, getMessageFunc func(ctx context.Context, msgID T) (*database.Message, error)) map[networkid.PortalKey]*Bv2Receipt { log := zerolog.Ctx(ctx) From fd61f51ed9e3220d70710433a501275de7963529 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 15 Apr 2026 14:28:57 +0300 Subject: [PATCH 149/170] signalmeow/storageservice: handle binary uuids in contact records --- pkg/signalmeow/storageservice.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/signalmeow/storageservice.go b/pkg/signalmeow/storageservice.go index fcf6848..899c54b 100644 --- a/pkg/signalmeow/storageservice.go +++ b/pkg/signalmeow/storageservice.go @@ -66,12 +66,14 @@ func (cli *Client) processStorageInTxn(ctx context.Context, update *StorageUpdat switch data := record.StorageRecord.GetRecord().(type) { case *signalpb.StorageRecord_Contact: log.Trace().Any("contact_record", data.Contact).Msg("Handling contact record") - aci, _ := uuid.Parse(data.Contact.Aci) - pni, _ := uuid.Parse(data.Contact.Pni) + aci, _ := ParseStringOrBinaryUUID(data.Contact.Aci, data.Contact.AciBinary) + pni, _ := ParseStringOrBinaryUUID(data.Contact.Pni, data.Contact.PniBinary) if aci == uuid.Nil && pni == uuid.Nil { log.Warn(). Str("raw_aci", data.Contact.Aci). Str("raw_pni", data.Contact.Pni). + Hex("raw_aci_binary", data.Contact.AciBinary). + Hex("raw_pni_binary", data.Contact.PniBinary). Str("raw_e164", data.Contact.E164). Msg("Storage service has contact record with no ACI or PNI") continue From 1f45d1af1a64a96265647ee74a80aa454b0b7296 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 16 Apr 2026 16:44:51 +0300 Subject: [PATCH 150/170] Bump version to v26.04 --- CHANGELOG.md | 9 ++++++++ cmd/mautrix-signal/main.go | 2 +- go.mod | 24 ++++++++++----------- go.sum | 44 +++++++++++++++++++------------------- 4 files changed, 44 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d992cab..1bf9682 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# v26.04 + +* Updated libsignal to v0.92.1 +* Added support for admin message deletes from Signal. +* Added support for binary service IDs in storage service. +* Fixed `private_chat_portal_meta` option not setting DM room names correctly. +* Fixed panic if user is logged out during initial chat sync. +* Fixed avatar upload failing when creating new Signal group. + # v26.03 * Switched to sending binary service ID fields in outgoing messages. diff --git a/cmd/mautrix-signal/main.go b/cmd/mautrix-signal/main.go index cc1ec10..6440669 100644 --- a/cmd/mautrix-signal/main.go +++ b/cmd/mautrix-signal/main.go @@ -37,7 +37,7 @@ var m = mxmain.BridgeMain{ Name: "mautrix-signal", URL: "https://github.com/mautrix/signal", Description: "A Matrix-Signal puppeting bridge.", - Version: "26.03", + Version: "26.04", SemCalVer: true, Connector: &connector.SignalConnector{}, diff --git a/go.mod b/go.mod index 78ca5a0..1106eb6 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-signal go 1.25.0 -toolchain go1.26.1 +toolchain go1.26.2 tool go.mau.fi/util/cmd/maubuild @@ -14,13 +14,13 @@ require ( github.com/rs/zerolog v1.35.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.8-0.20260406161447-0300c476893a - golang.org/x/crypto v0.49.0 - golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 - golang.org/x/net v0.52.0 + go.mau.fi/util v0.9.8 + golang.org/x/crypto v0.50.0 + golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f + golang.org/x/net v0.53.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.5-0.20260410220226-744570e6f1f5 + maunium.net/go/mautrix v0.27.0 ) require ( @@ -28,11 +28,11 @@ require ( github.com/coreos/go-systemd/v22 v22.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/pretty v0.3.1 // indirect - github.com/lib/pq v1.12.0 // indirect + github.com/lib/pq v1.12.3 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.37 // indirect - github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6 // indirect + github.com/mattn/go-sqlite3 v1.14.42 // indirect + github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/rs/xid v1.6.0 // indirect @@ -42,10 +42,10 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/goldmark v1.8.2 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect - golang.org/x/mod v0.34.0 // indirect + golang.org/x/mod v0.35.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.42.0 // indirect - golang.org/x/text v0.35.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index 57a3b8d..0f27daa 100644 --- a/go.sum +++ b/go.sum @@ -22,18 +22,18 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.12.0 h1:mC1zeiNamwKBecjHarAr26c/+d8V5w/u4J0I/yASbJo= -github.com/lib/pq v1.12.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= +github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ= +github.com/lib/pq v1.12.3/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= -github.com/mattn/go-sqlite3 v1.14.37 h1:3DOZp4cXis1cUIpCfXLtmlGolNLp2VEqhiB/PARNBIg= -github.com/mattn/go-sqlite3 v1.14.37/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6 h1:rh2lKw/P/EqHa724vYH2+VVQ1YnW4u6EOXl0PMAovZE= -github.com/petermattis/goid v0.0.0-20260226131333-17d1149c6ac6/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/mattn/go-sqlite3 v1.14.42 h1:MigqEP4ZmHw3aIdIT7T+9TLa90Z6smwcthx+Azv4Cgo= +github.com/mattn/go-sqlite3 v1.14.42/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ= +github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 h1:WDsQxOJDy0N1VRAjXLpi8sCEZRSGarLWQevDxpTBRrM= +github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -61,25 +61,25 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.8-0.20260406161447-0300c476893a h1:OQQF3rTJH10l6+dcP0OKnYbNDMBTGoIZZINNJm8QBG8= -go.mau.fi/util v0.9.8-0.20260406161447-0300c476893a/go.mod h1:5T2f3ZWZFAGgmFwg3dGw7YK6kIsb9lryDzvynoR98pE= +go.mau.fi/util v0.9.8 h1:+/jf8eM2dAT2wx9UidmaneH28r/CSCKCniCyby1qWz8= +go.mau.fi/util v0.9.8/go.mod h1:up/5mbzH2M1pSBNXqRxODn8dg/hEKbLJu92W4/SNAX0= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= -golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.26.5-0.20260410220226-744570e6f1f5 h1:icMEYdJZfRKWXf5AyPk/2jncA84DmfxzrjhCZ4Mm/PE= -maunium.net/go/mautrix v0.26.5-0.20260410220226-744570e6f1f5/go.mod h1:MX4DQLiBe0c7sI/wizruqdxHinSOWs42/DYsP9GH7Q4= +maunium.net/go/mautrix v0.27.0 h1:yfEYwoIluVWkofUgbZl9gP4i5nQTF+QNsxtb+r5bKlM= +maunium.net/go/mautrix v0.27.0/go.mod h1:7QpEQiTy6p4LHkXXaZI+N46tGYy8HMhD0JjzZAFoFWs= From d4b2659f96d1b5fbabc7fc8794ebf57b0a71a1d7 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 23 Apr 2026 20:39:33 +0300 Subject: [PATCH 151/170] signalmeow/sending: remove unnecessary warnings for receipt sync messages --- pkg/signalmeow/sending.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/pkg/signalmeow/sending.go b/pkg/signalmeow/sending.go index 769798a..a485b54 100644 --- a/pkg/signalmeow/sending.go +++ b/pkg/signalmeow/sending.go @@ -384,15 +384,7 @@ func syncMessageFromSoloEditMessage(editMessage *signalpb.EditMessage, result Su } func syncMessageFromReadReceiptMessage(ctx context.Context, receiptMessage *signalpb.ReceiptMessage, messageSender libsignalgo.ServiceID) *signalpb.Content { - if *receiptMessage.Type != signalpb.ReceiptMessage_READ { - zerolog.Ctx(ctx).Warn(). - Any("receipt_message_type", receiptMessage.Type). - Msg("syncMessageFromReadReceiptMessage called with non-read receipt message") - return nil - } else if messageSender.Type != libsignalgo.ServiceIDTypeACI { - zerolog.Ctx(ctx).Warn(). - Stringer("message_sender", messageSender). - Msg("syncMessageFromReadReceiptMessage called with non-ACI message sender") + if *receiptMessage.Type != signalpb.ReceiptMessage_READ || messageSender.Type != libsignalgo.ServiceIDTypeACI { return nil } read := []*signalpb.SyncMessage_Read{} From 2b2a3b036f5d8095d9603e414055f770c1a2a0b9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 27 Apr 2026 12:19:52 +0300 Subject: [PATCH 152/170] signalmeow/attachments: use go-util for pkcs7 padding --- go.mod | 2 +- go.sum | 4 ++-- pkg/signalmeow/attachments.go | 44 ++++++++++++++++++++--------------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 1106eb6..8df1d19 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/rs/zerolog v1.35.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.8 + go.mau.fi/util v0.9.9-0.20260424160448-fd0d9737ad38 golang.org/x/crypto v0.50.0 golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f golang.org/x/net v0.53.0 diff --git a/go.sum b/go.sum index 0f27daa..af95348 100644 --- a/go.sum +++ b/go.sum @@ -61,8 +61,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.8 h1:+/jf8eM2dAT2wx9UidmaneH28r/CSCKCniCyby1qWz8= -go.mau.fi/util v0.9.8/go.mod h1:up/5mbzH2M1pSBNXqRxODn8dg/hEKbLJu92W4/SNAX0= +go.mau.fi/util v0.9.9-0.20260424160448-fd0d9737ad38 h1:D4OKITjyvlud39Q10oMnfhdeNkzEIVkXrEeCW6nvgLk= +go.mau.fi/util v0.9.9-0.20260424160448-fd0d9737ad38/go.mod h1:up/5mbzH2M1pSBNXqRxODn8dg/hEKbLJu92W4/SNAX0= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= diff --git a/pkg/signalmeow/attachments.go b/pkg/signalmeow/attachments.go index a48414e..c091827 100644 --- a/pkg/signalmeow/attachments.go +++ b/pkg/signalmeow/attachments.go @@ -35,6 +35,7 @@ import ( "github.com/rs/zerolog" "go.mau.fi/util/fallocate" + "go.mau.fi/util/pkcs7" "go.mau.fi/util/random" "google.golang.org/protobuf/proto" @@ -136,6 +137,15 @@ func DownloadAttachment( const MACLength = 32 const IVLength = 16 +func macAndAESDecrypt(body, key []byte) ([]byte, error) { + l := len(body) - MACLength + if !verifyMAC(key[MACLength:], body[:l], body[l:]) { + return nil, ErrInvalidMACForAttachment + } + + return aesDecrypt(key[:MACLength], body[:l]) +} + func decryptAttachment(body, key, digest []byte, plaintextDigest bool, size uint32) ([]byte, error) { if !plaintextDigest { hash := sha256.Sum256(body) @@ -143,12 +153,7 @@ func decryptAttachment(body, key, digest []byte, plaintextDigest bool, size uint return nil, ErrInvalidDigestForAttachment } } - l := len(body) - MACLength - if !verifyMAC(key[MACLength:], body[:l], body[l:]) { - return nil, ErrInvalidMACForAttachment - } - - decrypted, err := aesDecrypt(key[:MACLength], body[:l]) + decrypted, err := macAndAESDecrypt(body, key) if err != nil { return nil, err } @@ -240,6 +245,14 @@ func extend(data []byte, paddedLen int) []byte { } } +func macAndAESEncrypt(keys, plaintext []byte) ([]byte, error) { + encrypted, err := aesEncrypt(keys[:32], plaintext) + if err != nil { + return nil, err + } + return appendMAC(keys[32:], encrypted), nil +} + func (cli *Client) UploadAttachment(ctx context.Context, body []byte) (*signalpb.AttachmentPointer, error) { log := zerolog.Ctx(ctx).With().Str("func", "upload attachment").Logger() keys := random.Bytes(64) // combined AES and MAC keys @@ -255,11 +268,10 @@ func (cli *Client) UploadAttachment(ctx context.Context, body []byte) (*signalpb } body = extend(body, paddedLen) - encrypted, err := aesEncrypt(keys[:32], body) + encryptedWithMAC, err := macAndAESEncrypt(keys, body) if err != nil { return nil, err } - encryptedWithMAC := appendMAC(keys[32:], encrypted) // Get upload attributes from Signal server attributesPath := "/v4/attachments/form/upload" @@ -467,13 +479,10 @@ func aesDecrypt(key, ciphertext []byte) ([]byte, error) { } iv := ciphertext[:IVLength] + ciphertext = ciphertext[IVLength:] mode := cipher.NewCBCDecrypter(block, iv) mode.CryptBlocks(ciphertext, ciphertext) - pad := ciphertext[len(ciphertext)-1] - if pad > aes.BlockSize { - return nil, fmt.Errorf("pad value (%d) larger than AES blocksize (%d)", pad, aes.BlockSize) - } - return ciphertext[aes.BlockSize : len(ciphertext)-int(pad)], nil + return pkcs7.Unpad(ciphertext) } func aesDecryptFile(key []byte, file *os.File, downloadedSize int64) (int64, error) { @@ -533,14 +542,11 @@ func aesEncrypt(key, plaintext []byte) ([]byte, error) { return nil, err } - pad := aes.BlockSize - len(plaintext)%aes.BlockSize - plaintext = append(plaintext, bytes.Repeat([]byte{byte(pad)}, pad)...) - - ciphertext := make([]byte, len(plaintext)) + plaintext = pkcs7.Pad(plaintext, aes.BlockSize) iv := random.Bytes(16) mode := cipher.NewCBCEncrypter(block, iv) - mode.CryptBlocks(ciphertext, plaintext) + mode.CryptBlocks(plaintext, plaintext) - return append(iv, ciphertext...), nil + return append(iv, plaintext...), nil } From 6beb2faa9fa2ee2dda264f813766bd6517db5d84 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 23 Apr 2026 20:39:21 +0300 Subject: [PATCH 153/170] msgconv/from-matrix: preserve sticker pack metadata when sending to signal --- go.mod | 2 +- go.sum | 4 +-- pkg/msgconv/from-matrix.go | 29 ++++++++++--------- pkg/msgconv/from-signal.go | 20 ++++++------- pkg/msgconv/imagepack.go | 57 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 28 deletions(-) create mode 100644 pkg/msgconv/imagepack.go diff --git a/go.mod b/go.mod index 8df1d19..a4718d6 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.53.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.27.0 + maunium.net/go/mautrix v0.27.1-0.20260428110059-49a05bf06436 ) require ( diff --git a/go.sum b/go.sum index af95348..ddff313 100644 --- a/go.sum +++ b/go.sum @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.27.0 h1:yfEYwoIluVWkofUgbZl9gP4i5nQTF+QNsxtb+r5bKlM= -maunium.net/go/mautrix v0.27.0/go.mod h1:7QpEQiTy6p4LHkXXaZI+N46tGYy8HMhD0JjzZAFoFWs= +maunium.net/go/mautrix v0.27.1-0.20260428110059-49a05bf06436 h1:vga9ypiOLJmGguxq4D1aquDPFihOuD99EGPEwva12UI= +maunium.net/go/mautrix v0.27.1-0.20260428110059-49a05bf06436/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= diff --git a/pkg/msgconv/from-matrix.go b/pkg/msgconv/from-matrix.go index 89b0181..a334afd 100644 --- a/pkg/msgconv/from-matrix.go +++ b/pkg/msgconv/from-matrix.go @@ -110,21 +110,24 @@ func (mc *MessageConverter) ToSignal( return nil, fmt.Errorf("failed to convert sticker: %w", err) } att.Flags = proto.Uint32(uint32(signalpb.AttachmentPointer_BORDERLESS)) - var emoji *string - // TODO check for single grapheme cluster? - if len([]rune(content.Body)) == 1 { - emoji = proto.String(variationselector.Remove(content.Body)) - } - dm.Sticker = &signalpb.DataMessage_Sticker{ - // Signal iOS validates that pack id/key are of the correct length. - // Android is fine with any non-nil values (like a zero-length byte string). - PackId: make([]byte, 16), - PackKey: make([]byte, 32), - StickerId: proto.Uint32(0), - Data: att, - Emoji: emoji, + dm.Sticker = ParseStickerMeta(content.Info.BridgedSticker) + if dm.Sticker == nil { + var emoji *string + // TODO check for single grapheme cluster? + if len([]rune(content.Body)) == 1 { + emoji = proto.String(variationselector.Remove(content.Body)) + } + dm.Sticker = &signalpb.DataMessage_Sticker{ + // Signal iOS validates that pack id/key are of the correct length. + // Android is fine with any non-nil values (like a zero-length byte string). + PackId: make([]byte, 16), + PackKey: make([]byte, 32), + StickerId: proto.Uint32(0), + Emoji: emoji, + } } + dm.Sticker.Data = att case event.MsgLocation: lat, lon, err := parseGeoURI(content.GeoURI) if err != nil { diff --git a/pkg/msgconv/from-signal.go b/pkg/msgconv/from-signal.go index 96b4f10..defbe44 100644 --- a/pkg/msgconv/from-signal.go +++ b/pkg/msgconv/from-signal.go @@ -468,20 +468,16 @@ func (mc *MessageConverter) convertStickerToMatrix(ctx context.Context, sticker converted.Content.Info.Height = 200 } converted.Content.Body = sticker.GetEmoji() + if len(sticker.GetPackId()) == PackIDLength && len(sticker.GetPackKey()) == PackKeyLength && !bytes.Equal(sticker.GetPackId(), zeroPackID) { + converted.Content.Info.BridgedSticker = &event.BridgedSticker{ + Network: StickerSourceID, + ID: strconv.FormatUint(uint64(sticker.GetStickerId()), 10), + Emoji: sticker.GetEmoji(), + PackURL: fmt.Sprintf(PackURLFormat, sticker.GetPackId(), sticker.GetPackKey()), + } + } converted.Type = event.EventSticker converted.Content.MsgType = "" - if converted.Extra == nil { - converted.Extra = map[string]any{} - } - // TODO fetch full pack metadata like the old bridge did? - converted.Extra["fi.mau.signal.sticker"] = map[string]any{ - "id": sticker.GetStickerId(), - "emoji": sticker.GetEmoji(), - "pack": map[string]any{ - "id": sticker.GetPackId(), - "key": sticker.GetPackKey(), - }, - } return converted } diff --git a/pkg/msgconv/imagepack.go b/pkg/msgconv/imagepack.go new file mode 100644 index 0000000..910b5bc --- /dev/null +++ b/pkg/msgconv/imagepack.go @@ -0,0 +1,57 @@ +// mautrix-signal - A Matrix-Signal puppeting bridge. +// Copyright (C) 2026 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package msgconv + +import ( + "fmt" + "strconv" + + "google.golang.org/protobuf/proto" + "maunium.net/go/mautrix/event" + + signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" +) + +const StickerSourceID = "signal" +const PackURLFormat = "https://signal.art/addstickers/#pack_id=%x&pack_key=%x" + +const PackIDLength = 16 +const PackKeyLength = 32 +const PackURLLength = len(PackURLFormat) - len("%x")*2 + PackIDLength*2 + PackKeyLength*2 + +var zeroPackID = make([]byte, PackIDLength) + +func ParseStickerMeta(info *event.BridgedSticker) *signalpb.DataMessage_Sticker { + if info.Network != StickerSourceID || len(info.PackURL) != PackURLLength { + return nil + } + stickerID, err := strconv.ParseUint(info.ID, 10, 32) + if err != nil { + return nil + } + var packID, packKey []byte + _, err = fmt.Sscanf(info.PackURL, PackURLFormat, &packID, &packKey) + if err != nil || len(packID) != PackIDLength || len(packKey) != PackKeyLength { + return nil + } + return &signalpb.DataMessage_Sticker{ + PackId: packID, + PackKey: packKey, + StickerId: proto.Uint32(uint32(stickerID)), + Emoji: &info.Emoji, + } +} From c2afb9f1135e125f6baa3252b4faf8a4ea960eba Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 27 Apr 2026 12:22:20 +0300 Subject: [PATCH 154/170] signalmeow/web: sent ContentLength field in request --- pkg/signalmeow/web/web.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index d0fcd01..e617b40 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -129,6 +129,7 @@ func SendHTTPRequest(ctx context.Context, host, method, path string, opt *HTTPRe } else { req.Header.Set("Content-Type", string(ContentTypeJSON)) } + req.ContentLength = int64(len(opt.Body)) req.Header.Set("Content-Length", fmt.Sprintf("%d", len(opt.Body))) req.Header.Set("User-Agent", UserAgent) req.Header.Set("X-Signal-Agent", SignalAgent) From 9e9dc8b548b35a8a964358d835ae12b161d020fc Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 27 Apr 2026 12:30:54 +0300 Subject: [PATCH 155/170] signalmeow/sticker: add methods for creating and fetching sticker packs --- go.mod | 2 +- pkg/signalmeow/sticker.go | 251 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 pkg/signalmeow/sticker.go diff --git a/go.mod b/go.mod index a4718d6..030ad61 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( golang.org/x/crypto v0.50.0 golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f golang.org/x/net v0.53.0 + golang.org/x/sync v0.20.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 maunium.net/go/mautrix v0.27.1-0.20260428110059-49a05bf06436 @@ -43,7 +44,6 @@ require ( github.com/yuin/goldmark v1.8.2 // indirect go.mau.fi/zeroconfig v0.2.0 // indirect golang.org/x/mod v0.35.0 // indirect - golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.43.0 // indirect golang.org/x/text v0.36.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect diff --git a/pkg/signalmeow/sticker.go b/pkg/signalmeow/sticker.go new file mode 100644 index 0000000..2759d18 --- /dev/null +++ b/pkg/signalmeow/sticker.go @@ -0,0 +1,251 @@ +// mautrix-signal - A Matrix-signal puppeting bridge. +// Copyright (C) 2026 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package signalmeow + +import ( + "bytes" + "context" + "crypto/hkdf" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "io" + "mime/multipart" + "net/http" + "net/textproto" + "sync" + + "go.mau.fi/util/exerrors" + "go.mau.fi/util/random" + "golang.org/x/sync/semaphore" + "google.golang.org/protobuf/proto" + + signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" + "go.mau.fi/mautrix-signal/pkg/signalmeow/web" +) + +func DownloadStickerPackManifest(ctx context.Context, packID, packKey []byte) (*signalpb.Pack, error) { + if len(packID) != 16 { + return nil, fmt.Errorf("invalid pack ID length: %d", len(packID)) + } + resp, err := downloadStickerData(ctx, fmt.Sprintf("/stickers/%x/manifest.proto", packID), packKey) + if err != nil { + return nil, err + } + var pack signalpb.Pack + err = proto.Unmarshal(resp, &pack) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal decrypted manifest: %w", err) + } + return &pack, nil +} + +func DownloadStickerPackItem(ctx context.Context, packID, packKey []byte, stickerID uint32) ([]byte, error) { + if len(packID) != 16 { + return nil, fmt.Errorf("invalid pack ID length: %d", len(packID)) + } + return downloadStickerData(ctx, fmt.Sprintf("/stickers/%x/full/%d", packID, stickerID), packKey) +} + +func downloadStickerData(ctx context.Context, path string, packKey []byte) ([]byte, error) { + if len(packKey) != 32 { + return nil, fmt.Errorf("invalid pack key length: %d", len(packKey)) + } + var body, decrypted []byte + resp, err := web.SendHTTPRequest(ctx, web.CDN1Hostname, http.MethodGet, path, nil) + defer web.CloseBody(resp) + if err != nil { + return nil, fmt.Errorf("failed to make request: %w", err) + } else if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status code %d", resp.StatusCode) + } else if body, err = io.ReadAll(resp.Body); err != nil { + return nil, fmt.Errorf("failed to read response: %w", err) + } else if decrypted, err = decryptSticker(packKey, body); err != nil { + return nil, fmt.Errorf("failed to decrypt response: %w", err) + } else { + return decrypted, nil + } +} + +type stickerUploadAttributes struct { + ACL string `json:"acl"` + Algorithm string `json:"algorithm"` + Credential string `json:"credential"` + Date string `json:"date"` + ID int `json:"id"` + Key string `json:"key"` + Policy string `json:"policy"` + Signature string `json:"signature"` +} + +func (sua *stickerUploadAttributes) makeFormBody(encryptedData []byte) (*web.HTTPReqOpt, error) { + var buf bytes.Buffer + writer := multipart.NewWriter(&buf) + var closed bool + // This isn't necessary in practice, just do it to avoid linter warnings + defer func() { + if !closed { + _ = writer.Close() + } + }() + fields := map[string]string{ + "key": sua.Key, + "acl": sua.ACL, + "policy": sua.Policy, + "x-amz-algorithm": sua.Algorithm, + "x-amz-credential": sua.Credential, + "x-amz-date": sua.Date, + "Content-Type": "application/octet-stream", + } + for key, value := range fields { + err := writer.WriteField(key, value) + if err != nil { + return nil, fmt.Errorf("failed to write multipart field %s: %w", key, err) + } + } + filePart, err := writer.CreatePart(textproto.MIMEHeader{ + "Content-Type": []string{"application/octet-stream"}, + "Content-Disposition": []string{`form-data; name="file"`}, + }) + if err != nil { + return nil, fmt.Errorf("failed to create multipart file part: %w", err) + } + _, err = filePart.Write(encryptedData) + if err != nil { + return nil, fmt.Errorf("failed to write file data to multipart body: %w", err) + } + err = writer.Close() + if err != nil { + return nil, fmt.Errorf("failed to close multipart writer: %w", err) + } + closed = true + return &web.HTTPReqOpt{ + Body: buf.Bytes(), + ContentType: web.ContentType(writer.FormDataContentType()), + }, nil +} + +func (sua *stickerUploadAttributes) upload(ctx context.Context, packKey, fileData []byte) error { + encryptedData, err := macAndAESEncrypt(fileData, deriveStickerPackKey(packKey)) + if err != nil { + return fmt.Errorf("failed to encrypt sticker data: %w", err) + } + req, err := sua.makeFormBody(encryptedData) + if err != nil { + return fmt.Errorf("failed to prepare request: %w", err) + } + resp, err := web.SendHTTPRequest(ctx, web.CDN1Hostname, http.MethodPost, "/", req) + if err != nil { + return err + } + _ = resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return fmt.Errorf("unexpected status code %d", resp.StatusCode) + } + return nil +} + +func (sua *stickerUploadAttributes) uploadAsync( + ctx context.Context, + packKey []byte, + getFileData func(context.Context) ([]byte, error), + sema *semaphore.Weighted, + done func(), + onError func(error), +) { + defer done() + err := sema.Acquire(ctx, 1) + if err != nil { + return + } + defer sema.Release(1) + fileData, err := getFileData(ctx) + if err == nil { + err = sua.upload(ctx, packKey, fileData) + } + if err != nil { + onError(err) + } +} + +type stickerPackUploadAttributes struct { + PackID string `json:"packId"` + Manifest *stickerUploadAttributes `json:"manifest"` + Stickers []*stickerUploadAttributes `json:"stickers"` +} + +var StickerUploadParallelism = 4 + +func (cli *Client) UploadStickerPack(ctx context.Context, pack *signalpb.Pack, stickerData []func(context.Context) ([]byte, error)) (packID, packKey []byte, err error) { + for i, sticker := range pack.Stickers { + if sticker.GetId() >= uint32(len(stickerData)) { + return nil, nil, fmt.Errorf("sticker ID %d at index %d is out of bounds, only %d sticker blobs provided", sticker.GetId(), i, len(stickerData)) + } + } + marshaledPack, err := proto.Marshal(pack) + if err != nil { + return nil, nil, fmt.Errorf("failed to marshal pack: %w", err) + } + packKey = random.Bytes(32) + resp, err := cli.AuthedWS.SendRequest(ctx, http.MethodGet, fmt.Sprintf("/v1/sticker/pack/form/%d", len(stickerData)), nil, nil) + if err != nil { + return nil, nil, fmt.Errorf("failed to get upload form: %w", err) + } + var packAttributes stickerPackUploadAttributes + err = web.DecodeWSResponseBody(ctx, &packAttributes, resp) + if err != nil { + return nil, nil, fmt.Errorf("failed to decode pack attributes: %w", err) + } + if len(packAttributes.Stickers) != len(stickerData) { + return nil, nil, fmt.Errorf("expected %d sticker upload attribute sets, got %d", len(stickerData), len(packAttributes.Stickers)) + } + packID, err = hex.DecodeString(packAttributes.PackID) + if err != nil { + return nil, nil, fmt.Errorf("invalid pack ID in response: %w", err) + } + err = packAttributes.Manifest.upload(ctx, packKey, marshaledPack) + if err != nil { + return nil, nil, fmt.Errorf("failed to upload manifest: %w", err) + } + var wg sync.WaitGroup + wg.Add(len(packAttributes.Stickers)) + sema := semaphore.NewWeighted(int64(StickerUploadParallelism)) + var errorList []error + var errorLock sync.Mutex + for i, attrs := range packAttributes.Stickers { + go attrs.uploadAsync(ctx, packKey, stickerData[i], sema, wg.Done, func(err error) { + errorLock.Lock() + errorList = append(errorList, fmt.Errorf("failed to upload sticker #%d: %w", i+1, err)) + errorLock.Unlock() + }) + } + wg.Wait() + err = ctx.Err() + if err == nil { + err = errors.Join(errorList...) + } + return +} + +func decryptSticker(packKey, ciphertext []byte) ([]byte, error) { + return macAndAESDecrypt(ciphertext, deriveStickerPackKey(packKey)) +} + +func deriveStickerPackKey(key []byte) []byte { + return exerrors.Must(hkdf.Key(sha256.New, key, make([]byte, 32), "Sticker Pack", 2*32)) +} From a27b6745b2eeb7720ad74a1c890a1b58e969848c Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 29 Apr 2026 09:10:31 +0300 Subject: [PATCH 156/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 030ad61..0a53f3b 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( golang.org/x/sync v0.20.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.27.1-0.20260428110059-49a05bf06436 + maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7 ) require ( diff --git a/go.sum b/go.sum index ddff313..f291411 100644 --- a/go.sum +++ b/go.sum @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.27.1-0.20260428110059-49a05bf06436 h1:vga9ypiOLJmGguxq4D1aquDPFihOuD99EGPEwva12UI= -maunium.net/go/mautrix v0.27.1-0.20260428110059-49a05bf06436/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= +maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7 h1:ZL/dTgBuj7ZzH543brFUvxZo2lJGsCMBvnfKIvjdHC4= +maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= From 14559977fc5d1d796a39170c7c1b39b4ab3303c5 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 30 Apr 2026 12:05:00 +0300 Subject: [PATCH 157/170] directmedia: fix response metadata for avatars --- go.mod | 2 +- go.sum | 4 ++-- pkg/connector/directmedia.go | 40 ++++++++++++++---------------------- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 0a53f3b..9ef0f7b 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( golang.org/x/sync v0.20.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7 + maunium.net/go/mautrix v0.27.1-0.20260430090139-beddfdeef6c9 ) require ( diff --git a/go.sum b/go.sum index f291411..1ae8e5f 100644 --- a/go.sum +++ b/go.sum @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7 h1:ZL/dTgBuj7ZzH543brFUvxZo2lJGsCMBvnfKIvjdHC4= -maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= +maunium.net/go/mautrix v0.27.1-0.20260430090139-beddfdeef6c9 h1:ffaVxcARQCkNq4Vw+AaXMUH4HcU5StEWOrfphM/jEfw= +maunium.net/go/mautrix v0.27.1-0.20260430090139-beddfdeef6c9/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= diff --git a/pkg/connector/directmedia.go b/pkg/connector/directmedia.go index 0877d66..4f010f6 100644 --- a/pkg/connector/directmedia.go +++ b/pkg/connector/directmedia.go @@ -4,7 +4,6 @@ import ( "context" "encoding/base64" "fmt" - "io" "os" "maunium.net/go/mautrix/bridgev2" @@ -30,6 +29,7 @@ func (s *SignalConnector) Download(ctx context.Context, mediaID networkid.MediaI return nil, fmt.Errorf("failed to parse direct media id: %w", err) } + var rawDataResp []byte switch info := info.(type) { case *signalid.DirectMediaAttachment: log.Info(). @@ -76,18 +76,11 @@ func (s *SignalConnector) Download(ctx context.Context, mediaID networkid.MediaI return nil, fmt.Errorf("failed to to get group master key: %w", err) } - return &mediaproxy.GetMediaResponseCallback{ - Callback: func(w io.Writer) (int64, error) { - data, err := client.Client.DownloadGroupAvatar(ctx, info.GroupAvatarPath, groupMasterKey) - if err != nil { - log.Err(err).Msg("Direct download failed") - return 0, err - } - - _, err = w.Write(data) - return int64(len(data)), err - }, - }, nil + rawDataResp, err = client.Client.DownloadGroupAvatar(ctx, info.GroupAvatarPath, groupMasterKey) + if err != nil { + log.Err(err).Msg("Direct download failed") + return nil, err + } case *signalid.DirectMediaProfileAvatar: log.Info(). Stringer("user_id", info.UserID). @@ -111,19 +104,16 @@ func (s *SignalConnector) Download(ctx context.Context, mediaID networkid.MediaI return nil, fmt.Errorf("profile key not found") } - return &mediaproxy.GetMediaResponseCallback{ - Callback: func(w io.Writer) (int64, error) { - data, err := client.Client.DownloadUserAvatar(ctx, info.ProfileAvatarPath, *profileKey) - if err != nil { - log.Err(err).Msg("Direct download failed") - return 0, err - } - - _, err = w.Write(data) - return int64(len(data)), err - }, - }, nil + rawDataResp, err = client.Client.DownloadUserAvatar(ctx, info.ProfileAvatarPath, *profileKey) + if err != nil { + log.Err(err).Msg("Direct download failed") + return nil, err + } default: return nil, fmt.Errorf("no downloader for direct media type: %T", info) } + if rawDataResp == nil { + return nil, fmt.Errorf("unexpected fallthrough with no data") + } + return mediaproxy.GetMediaResponseRawData(rawDataResp), nil } From 1f1b645213c02b7142338ae7d6aaf2e803410f70 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 30 Apr 2026 12:26:24 +0300 Subject: [PATCH 158/170] client: add support for importing Signal sticker packs --- go.mod | 2 +- go.sum | 4 +- pkg/connector/client.go | 5 ++ pkg/connector/directmedia.go | 11 +++ pkg/msgconv/imagepack.go | 147 ++++++++++++++++++++++++++++++++++- pkg/signalid/media.go | 35 +++++++++ 6 files changed, 198 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 9ef0f7b..f409215 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/rs/zerolog v1.35.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.9-0.20260424160448-fd0d9737ad38 + go.mau.fi/util v0.9.9-0.20260430092340-8772e7714ea5 golang.org/x/crypto v0.50.0 golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f golang.org/x/net v0.53.0 diff --git a/go.sum b/go.sum index 1ae8e5f..abe70ca 100644 --- a/go.sum +++ b/go.sum @@ -61,8 +61,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.9-0.20260424160448-fd0d9737ad38 h1:D4OKITjyvlud39Q10oMnfhdeNkzEIVkXrEeCW6nvgLk= -go.mau.fi/util v0.9.9-0.20260424160448-fd0d9737ad38/go.mod h1:up/5mbzH2M1pSBNXqRxODn8dg/hEKbLJu92W4/SNAX0= +go.mau.fi/util v0.9.9-0.20260430092340-8772e7714ea5 h1:cNm4gkt7j907g1Q4XvyNKW8tTM8BaU91Kbfa5GGyiCs= +go.mau.fi/util v0.9.9-0.20260430092340-8772e7714ea5/go.mod h1:up/5mbzH2M1pSBNXqRxODn8dg/hEKbLJu92W4/SNAX0= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 17ee216..1f69191 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -46,6 +46,7 @@ type SignalClient struct { var ( _ bridgev2.NetworkAPI = (*SignalClient)(nil) _ bridgev2.BackgroundSyncingNetworkAPI = (*SignalClient)(nil) + _ bridgev2.StickerImportingNetworkAPI = (*SignalClient)(nil) ) var pushCfg = &bridgev2.PushConfig{ @@ -76,6 +77,10 @@ func (s *SignalClient) RegisterPushNotifications(ctx context.Context, pushType b } } +func (s *SignalClient) DownloadImagePack(ctx context.Context, url string) (*bridgev2.ImportedImagePack, error) { + return s.Main.MsgConv.DownloadImagePack(ctx, url) +} + func (s *SignalClient) LogoutRemote(ctx context.Context) { if s.Client == nil { return diff --git a/pkg/connector/directmedia.go b/pkg/connector/directmedia.go index 4f010f6..05e2a07 100644 --- a/pkg/connector/directmedia.go +++ b/pkg/connector/directmedia.go @@ -109,6 +109,17 @@ func (s *SignalConnector) Download(ctx context.Context, mediaID networkid.MediaI log.Err(err).Msg("Direct download failed") return nil, err } + case *signalid.DirectMediaSticker: + log.Info(). + Hex("pack_id", info.PackID). + Uint32("sticker_id", info.StickerID). + Msg("Direct downloading sticker") + + rawDataResp, err = signalmeow.DownloadStickerPackItem(ctx, info.PackID, info.PackKey, info.StickerID) + if err != nil { + log.Err(err).Msg("Direct download failed") + return nil, err + } default: return nil, fmt.Errorf("no downloader for direct media type: %T", info) } diff --git a/pkg/msgconv/imagepack.go b/pkg/msgconv/imagepack.go index 910b5bc..8d538bf 100644 --- a/pkg/msgconv/imagepack.go +++ b/pkg/msgconv/imagepack.go @@ -17,12 +17,23 @@ package msgconv import ( + "bytes" + "context" + "encoding/hex" "fmt" + "net/url" "strconv" + "strings" + "go.mau.fi/util/emojishortcodes" "google.golang.org/protobuf/proto" + "maunium.net/go/mautrix/bridgev2" + "maunium.net/go/mautrix/bridgev2/database" "maunium.net/go/mautrix/event" + "maunium.net/go/mautrix/id" + "go.mau.fi/mautrix-signal/pkg/signalid" + "go.mau.fi/mautrix-signal/pkg/signalmeow" signalpb "go.mau.fi/mautrix-signal/pkg/signalmeow/protobuf" ) @@ -43,9 +54,8 @@ func ParseStickerMeta(info *event.BridgedSticker) *signalpb.DataMessage_Sticker if err != nil { return nil } - var packID, packKey []byte - _, err = fmt.Sscanf(info.PackURL, PackURLFormat, &packID, &packKey) - if err != nil || len(packID) != PackIDLength || len(packKey) != PackKeyLength { + packID, packKey, err := parsePackURL(info.PackURL) + if err != nil || len(packID) != PackIDLength || len(packKey) != PackKeyLength || bytes.Equal(packID, zeroPackID) { return nil } return &signalpb.DataMessage_Sticker{ @@ -55,3 +65,134 @@ func ParseStickerMeta(info *event.BridgedSticker) *signalpb.DataMessage_Sticker Emoji: &info.Emoji, } } + +func parsePackURL(rawURL string) (packID, packKey []byte, err error) { + parsed, err := url.Parse(rawURL) + if err != nil { + return nil, nil, fmt.Errorf("invalid URL: %w", err) + } else if parsed.Host != "signal.art" || !strings.HasPrefix(parsed.Path, "/addstickers") { + return nil, nil, fmt.Errorf("invalid host or path in URL") + } + q, err := url.ParseQuery(parsed.Fragment) + if err != nil { + return nil, nil, fmt.Errorf("invalid URL fragment: %w", err) + } + packID, err = hex.DecodeString(q.Get("pack_id")) + if err != nil { + return nil, nil, fmt.Errorf("invalid pack ID in URL: %w", err) + } + packKey, err = hex.DecodeString(q.Get("pack_key")) + if err != nil { + return nil, nil, fmt.Errorf("invalid pack key in URL: %w", err) + } + return +} + +func (mc *MessageConverter) DownloadImagePack(ctx context.Context, url string) (*bridgev2.ImportedImagePack, error) { + packID, packKey, err := parsePackURL(url) + if err != nil { + return nil, err + } + manifest, err := signalmeow.DownloadStickerPackManifest(ctx, packID, packKey) + if err != nil { + return nil, fmt.Errorf("failed to download sticker pack manifest: %w", err) + } + topLevelExtra := map[string]any{ + "fi.mau.signal.stickerpack": map[string]any{ + "pack_id": hex.EncodeToString(packID), + "pack_key": hex.EncodeToString(packKey), + }, + } + content := &event.ImagePackEventContent{ + Images: make(map[string]*event.ImagePackImage, len(manifest.Stickers)), + Metadata: event.ImagePackMetadata{ + DisplayName: manifest.GetTitle(), + AvatarURL: "", + Usage: []event.ImagePackUsage{event.ImagePackUsageSticker}, + Attribution: manifest.GetAuthor(), + BridgedPack: &event.BridgedStickerPack{ + Network: StickerSourceID, + URL: fmt.Sprintf(PackURLFormat, packID, packKey), + }, + }, + } + imagesByID := make(map[uint32]id.ContentURIString, len(manifest.Stickers)) + uploadImage := func(sticker *signalpb.Pack_Sticker) (id.ContentURIString, error) { + stickerID := sticker.GetId() + existing, ok := imagesByID[stickerID] + if ok { + return existing, nil + } + var mxc id.ContentURIString + if mc.DirectMedia { + mediaID, err := signalid.DirectMediaSticker{ + PackID: packID, + PackKey: packKey, + StickerID: stickerID, + }.AsMediaID() + if err != nil { + return "", fmt.Errorf("failed to create media ID for sticker %d: %w", stickerID, err) + } + mxc, err = mc.Bridge.Matrix.GenerateContentURI(ctx, mediaID) + if err != nil { + return "", fmt.Errorf("failed to generate content URI for sticker %d: %w", stickerID, err) + } + } else { + dbKey := database.Key(fmt.Sprintf("stickercache:%x:%d", packID, stickerID)) + if cached := mc.Bridge.DB.KV.Get(ctx, dbKey); cached != "" { + mxc = id.ContentURIString(cached) + imagesByID[stickerID] = mxc + return mxc, nil + } + data, err := signalmeow.DownloadStickerPackItem(ctx, packID, packKey, stickerID) + if err != nil { + return "", fmt.Errorf("failed to download sticker %d: %w", stickerID, err) + } + mxc, _, err = mc.Bridge.Bot.UploadMedia(ctx, "", data, "", sticker.GetContentType()) + if err != nil { + return "", fmt.Errorf("failed to upload sticker %d: %w", stickerID, err) + } + mc.Bridge.DB.KV.Set(ctx, dbKey, string(mxc)) + } + imagesByID[stickerID] = mxc + return mxc, nil + } + for _, sticker := range manifest.Stickers { + mxc, err := uploadImage(sticker) + if err != nil { + return nil, err + } + shortcode := emojishortcodes.Get(sticker.GetEmoji()) + realShortcode := shortcode + i := 2 + for _, alreadyExists := content.Images[realShortcode]; alreadyExists; i++ { + realShortcode = fmt.Sprintf("%s_%d", shortcode, i) + } + content.Images[realShortcode] = &event.ImagePackImage{ + URL: mxc, + Body: sticker.GetEmoji(), + Info: &event.FileInfo{ + MimeType: sticker.GetContentType(), + Width: 200, + Height: 200, + BridgedSticker: &event.BridgedSticker{ + Network: StickerSourceID, + ID: strconv.FormatUint(uint64(sticker.GetId()), 10), + Emoji: sticker.GetEmoji(), + PackURL: content.Metadata.BridgedPack.URL, + }, + }, + } + } + if manifest.Cover != nil { + content.Metadata.AvatarURL, err = uploadImage(manifest.Cover) + if err != nil { + return nil, fmt.Errorf("failed to upload sticker pack cover: %w", err) + } + } + return &bridgev2.ImportedImagePack{ + Content: content, + Extra: topLevelExtra, + Shortcode: hex.EncodeToString(packID), + }, nil +} diff --git a/pkg/signalid/media.go b/pkg/signalid/media.go index 8c91b6a..a530c22 100644 --- a/pkg/signalid/media.go +++ b/pkg/signalid/media.go @@ -34,6 +34,7 @@ const ( directMediaTypeGroupAvatar directMediaType = 1 directMediaTypeProfileAvatar directMediaType = 2 directMediaTypePlaintextDigestAttachment directMediaType = 3 + directMediaTypeSticker directMediaType = 4 ) type DirectMediaInfo interface { @@ -44,6 +45,7 @@ var ( _ DirectMediaInfo = (*DirectMediaAttachment)(nil) _ DirectMediaInfo = (*DirectMediaGroupAvatar)(nil) _ DirectMediaInfo = (*DirectMediaProfileAvatar)(nil) + _ DirectMediaInfo = (*DirectMediaSticker)(nil) ) type DirectMediaAttachment struct { @@ -127,6 +129,30 @@ func (m DirectMediaProfileAvatar) AsMediaID() (mediaID networkid.MediaID, err er return networkid.MediaID(buf.Bytes()), nil } +type DirectMediaSticker struct { + PackID []byte + PackKey []byte + StickerID uint32 +} + +const packIDLen = 16 +const packKeyLen = 32 +const directMediaStickerLen = 1 + packIDLen + packKeyLen + 4 + +func (m DirectMediaSticker) AsMediaID() (mediaID networkid.MediaID, err error) { + if len(m.PackID) != packIDLen { + return nil, fmt.Errorf("invalid pack ID length: %d", len(m.PackID)) + } else if len(m.PackKey) != packKeyLen { + return nil, fmt.Errorf("invalid pack key length: %d", len(m.PackKey)) + } + mediaID = make(networkid.MediaID, directMediaStickerLen) + mediaID[0] = byte(directMediaTypeSticker) + copy(mediaID[1:], m.PackID) + copy(mediaID[1+packIDLen:], m.PackKey) + binary.BigEndian.PutUint32(mediaID[1+packIDLen+packKeyLen:], m.StickerID) + return mediaID, nil +} + func ParseDirectMediaInfo(mediaID networkid.MediaID) (_ DirectMediaInfo, err error) { mediaIDLen := len(mediaID) if mediaIDLen == 0 { @@ -200,6 +226,15 @@ func ParseDirectMediaInfo(mediaID networkid.MediaID) (_ DirectMediaInfo, err err info.ProfileAvatarPath = string(profileAvatarPath) } return &info, nil + case directMediaTypeSticker: + var info DirectMediaSticker + if len(mediaID) != directMediaStickerLen { + return info, fmt.Errorf("invalid media ID length for sticker: %d", len(mediaID)) + } + info.PackID = mediaID[1 : 1+packIDLen] + info.PackKey = mediaID[1+packIDLen : 1+packIDLen+packKeyLen] + info.StickerID = binary.BigEndian.Uint32(mediaID[1+packIDLen+packKeyLen:]) + return &info, nil } return nil, fmt.Errorf("invalid direct media type %d", mediaType) From 9ebd8d4dd09fbbbf3b39deaf673e01d9c611fe2d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 30 Apr 2026 13:23:08 +0300 Subject: [PATCH 159/170] .github: add another item to bug report template --- .github/ISSUE_TEMPLATE/bug.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index c10630f..06ba9e8 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -11,7 +11,8 @@ type: Bug ### Checklist - + * [ ] This is an actual bug, not just a setup issue (see the [troubleshooting docs](https://docs.mau.fi/bridges/general/troubleshooting.html) or ask in the Matrix room for setup help). * [ ] I am certain that sufficient information is included. Ask in the Matrix room first if not. +* [ ] The bug is still present on the main branch. From 694858478c710b08a7a61e18a57b402d5d35eafc Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 30 Apr 2026 15:15:08 +0300 Subject: [PATCH 160/170] client: add stub ListImagePacks method --- go.mod | 2 +- go.sum | 4 ++-- pkg/connector/capabilities.go | 1 + pkg/connector/client.go | 5 +++++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f409215..a936973 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( golang.org/x/sync v0.20.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.27.1-0.20260430090139-beddfdeef6c9 + maunium.net/go/mautrix v0.27.1-0.20260430124810-125ac2c48014 ) require ( diff --git a/go.sum b/go.sum index abe70ca..f817e1d 100644 --- a/go.sum +++ b/go.sum @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.27.1-0.20260430090139-beddfdeef6c9 h1:ffaVxcARQCkNq4Vw+AaXMUH4HcU5StEWOrfphM/jEfw= -maunium.net/go/mautrix v0.27.1-0.20260430090139-beddfdeef6c9/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= +maunium.net/go/mautrix v0.27.1-0.20260430124810-125ac2c48014 h1:KwXGBWwUHYJKVTYWgbZEFcaM6uYLMvfjzHJg/TLwvKc= +maunium.net/go/mautrix v0.27.1-0.20260430124810-125ac2c48014/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= diff --git a/pkg/connector/capabilities.go b/pkg/connector/capabilities.go index e791324..d23285c 100644 --- a/pkg/connector/capabilities.go +++ b/pkg/connector/capabilities.go @@ -211,6 +211,7 @@ var signalGeneralCaps = &bridgev2.NetworkGeneralCapabilities{ AggressiveUpdateInfo: true, ImplicitReadReceipts: true, Provisioning: bridgev2.ProvisioningCapabilities{ + ImagePackImport: true, ResolveIdentifier: bridgev2.ResolveIdentifierCapabilities{ CreateDM: true, LookupPhone: true, diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 1f69191..4fcf188 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -27,6 +27,7 @@ import ( "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/networkid" "maunium.net/go/mautrix/bridgev2/status" + "maunium.net/go/mautrix/event" "go.mau.fi/mautrix-signal/pkg/signalid" "go.mau.fi/mautrix-signal/pkg/signalmeow" @@ -81,6 +82,10 @@ func (s *SignalClient) DownloadImagePack(ctx context.Context, url string) (*brid return s.Main.MsgConv.DownloadImagePack(ctx, url) } +func (s *SignalClient) ListImagePacks(ctx context.Context) ([]*event.ImagePackMetadata, error) { + return []*event.ImagePackMetadata{}, nil +} + func (s *SignalClient) LogoutRemote(ctx context.Context) { if s.Client == nil { return From 0214ecc6005359dcb41bacd56cd07de5bc4521a3 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 4 May 2026 17:32:04 +0300 Subject: [PATCH 161/170] msgconv/imagepack: fix stickers with no bridged metadata --- pkg/msgconv/imagepack.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/msgconv/imagepack.go b/pkg/msgconv/imagepack.go index 8d538bf..e8f91cb 100644 --- a/pkg/msgconv/imagepack.go +++ b/pkg/msgconv/imagepack.go @@ -47,7 +47,7 @@ const PackURLLength = len(PackURLFormat) - len("%x")*2 + PackIDLength*2 + PackKe var zeroPackID = make([]byte, PackIDLength) func ParseStickerMeta(info *event.BridgedSticker) *signalpb.DataMessage_Sticker { - if info.Network != StickerSourceID || len(info.PackURL) != PackURLLength { + if info == nil || info.Network != StickerSourceID || len(info.PackURL) != PackURLLength { return nil } stickerID, err := strconv.ParseUint(info.ID, 10, 32) From 0813d3909524ec4db44284cc180a75685557c847 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 6 May 2026 13:23:56 +0300 Subject: [PATCH 162/170] .github: add version command to bug report template --- .github/ISSUE_TEMPLATE/bug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index 06ba9e8..cba1054 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -15,4 +15,4 @@ type: Bug * [ ] This is an actual bug, not just a setup issue (see the [troubleshooting docs](https://docs.mau.fi/bridges/general/troubleshooting.html) or ask in the Matrix room for setup help). * [ ] I am certain that sufficient information is included. Ask in the Matrix room first if not. -* [ ] The bug is still present on the main branch. +* [ ] The bug is still present on the main branch. The `!signal version` command output is: `` From 90487a25e048d9677e059291d44d8f80a6a5a391 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 6 May 2026 13:47:09 +0300 Subject: [PATCH 163/170] imagepack: return 404 on incorrectly formatted link --- pkg/msgconv/imagepack.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/msgconv/imagepack.go b/pkg/msgconv/imagepack.go index e8f91cb..a2529af 100644 --- a/pkg/msgconv/imagepack.go +++ b/pkg/msgconv/imagepack.go @@ -27,6 +27,7 @@ import ( "go.mau.fi/util/emojishortcodes" "google.golang.org/protobuf/proto" + "maunium.net/go/mautrix" "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/database" "maunium.net/go/mautrix/event" @@ -91,7 +92,7 @@ func parsePackURL(rawURL string) (packID, packKey []byte, err error) { func (mc *MessageConverter) DownloadImagePack(ctx context.Context, url string) (*bridgev2.ImportedImagePack, error) { packID, packKey, err := parsePackURL(url) if err != nil { - return nil, err + return nil, bridgev2.WrapRespErr(err, mautrix.MNotFound) } manifest, err := signalmeow.DownloadStickerPackManifest(ctx, packID, packKey) if err != nil { From 06bdbfc2cab281e91af2dc97f2cdc15512d00b7e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 8 May 2026 16:55:42 +0300 Subject: [PATCH 164/170] libsignal: update to v0.93.2 --- pkg/libsignalgo/identitykeystore.go | 12 +- pkg/libsignalgo/kyberprekeystore.go | 8 +- pkg/libsignalgo/libsignal | 2 +- pkg/libsignalgo/libsignal-ffi.h | 191 ++++++++++++++------------- pkg/libsignalgo/message.go | 3 +- pkg/libsignalgo/prekeybundle.go | 3 +- pkg/libsignalgo/prekeystore.go | 8 +- pkg/libsignalgo/senderkeystore.go | 6 +- pkg/libsignalgo/session_test.go | 19 +-- pkg/libsignalgo/sessionstore.go | 6 +- pkg/libsignalgo/signedprekeystore.go | 6 +- pkg/libsignalgo/version.go | 2 +- pkg/signalmeow/keys.go | 5 + pkg/signalmeow/receiving_decrypt.go | 5 + 14 files changed, 147 insertions(+), 129 deletions(-) diff --git a/pkg/libsignalgo/identitykeystore.go b/pkg/libsignalgo/identitykeystore.go index 43941da..ba26f06 100644 --- a/pkg/libsignalgo/identitykeystore.go +++ b/pkg/libsignalgo/identitykeystore.go @@ -159,11 +159,11 @@ func signal_destroy_identity_key_store_callback(storeCtx unsafe.Pointer) { func (ctx *CallbackContext) wrapIdentityKeyStore(store IdentityKeyStore) C.SignalConstPointerFfiIdentityKeyStoreStruct { return C.SignalConstPointerFfiIdentityKeyStoreStruct{&C.SignalIdentityKeyStore{ ctx: wrapStore(ctx, store), - get_local_identity_key_pair: C.SignalFfiBridgeIdentityKeyStoreGetLocalIdentityKeyPair(C.signal_get_identity_key_pair_callback), - get_local_registration_id: C.SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId(C.signal_get_local_registration_id_callback), - get_identity_key: C.SignalFfiBridgeIdentityKeyStoreGetIdentityKey(C.signal_get_identity_key_callback), - save_identity_key: C.SignalFfiBridgeIdentityKeyStoreSaveIdentityKey(C.signal_save_identity_key_callback), - is_trusted_identity: C.SignalFfiBridgeIdentityKeyStoreIsTrustedIdentity(C.signal_is_trusted_identity_callback), - destroy: C.SignalFfiBridgeIdentityKeyStoreDestroy(C.signal_destroy_identity_key_store_callback), + get_local_identity_key_pair: C.SignalFfiIdentityKeyStoreGetLocalIdentityKeyPair(C.signal_get_identity_key_pair_callback), + get_local_registration_id: C.SignalFfiIdentityKeyStoreGetLocalRegistrationId(C.signal_get_local_registration_id_callback), + get_identity_key: C.SignalFfiIdentityKeyStoreGetIdentityKey(C.signal_get_identity_key_callback), + save_identity_key: C.SignalFfiIdentityKeyStoreSaveIdentityKey(C.signal_save_identity_key_callback), + is_trusted_identity: C.SignalFfiIdentityKeyStoreIsTrustedIdentity(C.signal_is_trusted_identity_callback), + destroy: C.SignalFfiIdentityKeyStoreDestroy(C.signal_destroy_identity_key_store_callback), }} } diff --git a/pkg/libsignalgo/kyberprekeystore.go b/pkg/libsignalgo/kyberprekeystore.go index ebb5a9f..9deea17 100644 --- a/pkg/libsignalgo/kyberprekeystore.go +++ b/pkg/libsignalgo/kyberprekeystore.go @@ -77,9 +77,9 @@ func signal_destroy_kyber_pre_key_store_callback(storeCtx unsafe.Pointer) { func (ctx *CallbackContext) wrapKyberPreKeyStore(store KyberPreKeyStore) C.SignalConstPointerFfiKyberPreKeyStoreStruct { return C.SignalConstPointerFfiKyberPreKeyStoreStruct{&C.SignalKyberPreKeyStore{ ctx: wrapStore(ctx, store), - load_kyber_pre_key: C.SignalFfiBridgeKyberPreKeyStoreLoadKyberPreKey(C.signal_load_kyber_pre_key_callback), - store_kyber_pre_key: C.SignalFfiBridgeKyberPreKeyStoreStoreKyberPreKey(C.signal_store_kyber_pre_key_callback), - mark_kyber_pre_key_used: C.SignalFfiBridgeKyberPreKeyStoreMarkKyberPreKeyUsed(C.signal_mark_kyber_pre_key_used_callback), - destroy: C.SignalFfiBridgeKyberPreKeyStoreDestroy(C.signal_destroy_kyber_pre_key_store_callback), + load_kyber_pre_key: C.SignalFfiKyberPreKeyStoreLoadKyberPreKey(C.signal_load_kyber_pre_key_callback), + store_kyber_pre_key: C.SignalFfiKyberPreKeyStoreStoreKyberPreKey(C.signal_store_kyber_pre_key_callback), + mark_kyber_pre_key_used: C.SignalFfiKyberPreKeyStoreMarkKyberPreKeyUsed(C.signal_mark_kyber_pre_key_used_callback), + destroy: C.SignalFfiKyberPreKeyStoreDestroy(C.signal_destroy_kyber_pre_key_store_callback), }} } diff --git a/pkg/libsignalgo/libsignal b/pkg/libsignalgo/libsignal index b58bd7d..bbc1688 160000 --- a/pkg/libsignalgo/libsignal +++ b/pkg/libsignalgo/libsignal @@ -1 +1 @@ -Subproject commit b58bd7d5dfa0a391486df4210fd83bab96b9b479 +Subproject commit bbc16886cae2feab1cd1fe271ccc651e8860ce96 diff --git a/pkg/libsignalgo/libsignal-ffi.h b/pkg/libsignalgo/libsignal-ffi.h index fe3bf52..b75462a 100644 --- a/pkg/libsignalgo/libsignal-ffi.h +++ b/pkg/libsignalgo/libsignal-ffi.h @@ -629,13 +629,6 @@ typedef struct { const SignalHttpRequest *raw; } SignalConstPointerHttpRequest; -/** - * A wrapper type for raw UUIDs, because C treats arrays specially in argument position. - */ -typedef struct { - uint8_t bytes[16]; -} SignalUuid; - /** * The fixed-width binary representation of a ServiceId. * @@ -643,6 +636,27 @@ typedef struct { */ typedef uint8_t SignalServiceIdFixedWidthBinaryBytes[17]; +typedef struct { + const uint32_t *base; + size_t length; +} SignalBorrowedSliceOfu32; + +typedef struct { + const SignalCiphertextMessage *raw; +} SignalConstPointerCiphertextMessage; + +typedef struct { + const SignalConstPointerCiphertextMessage *base; + size_t length; +} SignalBorrowedSliceOfConstPointerCiphertextMessage; + +/** + * A wrapper type for raw UUIDs, because C treats arrays specially in argument position. + */ +typedef struct { + uint8_t bytes[16]; +} SignalUuid; + typedef struct { SignalPrivateKey *raw; } SignalMutPointerPrivateKey; @@ -754,10 +768,6 @@ typedef struct { const SignalPlaintextContent *raw; } SignalConstPointerPlaintextContent; -typedef struct { - const SignalCiphertextMessage *raw; -} SignalConstPointerCiphertextMessage; - typedef struct { SignalConnectionInfo *raw; } SignalMutPointerConnectionInfo; @@ -782,20 +792,18 @@ typedef struct { SignalSessionRecord *raw; } SignalMutPointerSessionRecord; -typedef int (*SignalFfiBridgeSessionStoreLoadSession)(void *ctx, SignalMutPointerSessionRecord *out, SignalMutPointerProtocolAddress address); +typedef int (*SignalFfiSessionStoreLoadSession)(void *ctx, SignalMutPointerSessionRecord *out, SignalMutPointerProtocolAddress address); -typedef int (*SignalFfiBridgeSessionStoreStoreSession)(void *ctx, SignalMutPointerProtocolAddress address, SignalMutPointerSessionRecord record); +typedef int (*SignalFfiSessionStoreStoreSession)(void *ctx, SignalMutPointerProtocolAddress address, SignalMutPointerSessionRecord record); -typedef void (*SignalFfiBridgeSessionStoreDestroy)(void *ctx); +typedef void (*SignalFfiSessionStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalFfiBridgeSessionStoreLoadSession load_session; - SignalFfiBridgeSessionStoreStoreSession store_session; - SignalFfiBridgeSessionStoreDestroy destroy; -} SignalFfiBridgeSessionStoreStruct; - -typedef SignalFfiBridgeSessionStoreStruct SignalSessionStore; + SignalFfiSessionStoreLoadSession load_session; + SignalFfiSessionStoreStoreSession store_session; + SignalFfiSessionStoreDestroy destroy; +} SignalSessionStore; typedef struct { const SignalSessionStore *raw; @@ -810,29 +818,27 @@ typedef struct { SignalMutPointerPublicKey second; } SignalPairOfMutPointerPrivateKeyMutPointerPublicKey; -typedef int (*SignalFfiBridgeIdentityKeyStoreGetLocalIdentityKeyPair)(void *ctx, SignalPairOfMutPointerPrivateKeyMutPointerPublicKey *out); +typedef int (*SignalFfiIdentityKeyStoreGetLocalIdentityKeyPair)(void *ctx, SignalPairOfMutPointerPrivateKeyMutPointerPublicKey *out); -typedef int (*SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId)(void *ctx, uint32_t *out); +typedef int (*SignalFfiIdentityKeyStoreGetLocalRegistrationId)(void *ctx, uint32_t *out); -typedef int (*SignalFfiBridgeIdentityKeyStoreGetIdentityKey)(void *ctx, SignalMutPointerPublicKey *out, SignalMutPointerProtocolAddress address); +typedef int (*SignalFfiIdentityKeyStoreGetIdentityKey)(void *ctx, SignalMutPointerPublicKey *out, SignalMutPointerProtocolAddress address); -typedef int (*SignalFfiBridgeIdentityKeyStoreSaveIdentityKey)(void *ctx, uint8_t *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key); +typedef int (*SignalFfiIdentityKeyStoreSaveIdentityKey)(void *ctx, uint8_t *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key); -typedef int (*SignalFfiBridgeIdentityKeyStoreIsTrustedIdentity)(void *ctx, bool *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key, uint32_t direction); +typedef int (*SignalFfiIdentityKeyStoreIsTrustedIdentity)(void *ctx, bool *out, SignalMutPointerProtocolAddress address, SignalMutPointerPublicKey public_key, uint32_t direction); -typedef void (*SignalFfiBridgeIdentityKeyStoreDestroy)(void *ctx); +typedef void (*SignalFfiIdentityKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalFfiBridgeIdentityKeyStoreGetLocalIdentityKeyPair get_local_identity_key_pair; - SignalFfiBridgeIdentityKeyStoreGetLocalRegistrationId get_local_registration_id; - SignalFfiBridgeIdentityKeyStoreGetIdentityKey get_identity_key; - SignalFfiBridgeIdentityKeyStoreSaveIdentityKey save_identity_key; - SignalFfiBridgeIdentityKeyStoreIsTrustedIdentity is_trusted_identity; - SignalFfiBridgeIdentityKeyStoreDestroy destroy; -} SignalFfiBridgeIdentityKeyStoreStruct; - -typedef SignalFfiBridgeIdentityKeyStoreStruct SignalIdentityKeyStore; + SignalFfiIdentityKeyStoreGetLocalIdentityKeyPair get_local_identity_key_pair; + SignalFfiIdentityKeyStoreGetLocalRegistrationId get_local_registration_id; + SignalFfiIdentityKeyStoreGetIdentityKey get_identity_key; + SignalFfiIdentityKeyStoreSaveIdentityKey save_identity_key; + SignalFfiIdentityKeyStoreIsTrustedIdentity is_trusted_identity; + SignalFfiIdentityKeyStoreDestroy destroy; +} SignalIdentityKeyStore; typedef struct { const SignalIdentityKeyStore *raw; @@ -846,23 +852,21 @@ typedef struct { SignalPreKeyRecord *raw; } SignalMutPointerPreKeyRecord; -typedef int (*SignalFfiBridgePreKeyStoreLoadPreKey)(void *ctx, SignalMutPointerPreKeyRecord *out, uint32_t id); +typedef int (*SignalFfiPreKeyStoreLoadPreKey)(void *ctx, SignalMutPointerPreKeyRecord *out, uint32_t id); -typedef int (*SignalFfiBridgePreKeyStoreStorePreKey)(void *ctx, uint32_t id, SignalMutPointerPreKeyRecord record); +typedef int (*SignalFfiPreKeyStoreStorePreKey)(void *ctx, uint32_t id, SignalMutPointerPreKeyRecord record); -typedef int (*SignalFfiBridgePreKeyStoreRemovePreKey)(void *ctx, uint32_t id); +typedef int (*SignalFfiPreKeyStoreRemovePreKey)(void *ctx, uint32_t id); -typedef void (*SignalFfiBridgePreKeyStoreDestroy)(void *ctx); +typedef void (*SignalFfiPreKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalFfiBridgePreKeyStoreLoadPreKey load_pre_key; - SignalFfiBridgePreKeyStoreStorePreKey store_pre_key; - SignalFfiBridgePreKeyStoreRemovePreKey remove_pre_key; - SignalFfiBridgePreKeyStoreDestroy destroy; -} SignalFfiBridgePreKeyStoreStruct; - -typedef SignalFfiBridgePreKeyStoreStruct SignalPreKeyStore; + SignalFfiPreKeyStoreLoadPreKey load_pre_key; + SignalFfiPreKeyStoreStorePreKey store_pre_key; + SignalFfiPreKeyStoreRemovePreKey remove_pre_key; + SignalFfiPreKeyStoreDestroy destroy; +} SignalPreKeyStore; typedef struct { const SignalPreKeyStore *raw; @@ -872,20 +876,18 @@ typedef struct { SignalSignedPreKeyRecord *raw; } SignalMutPointerSignedPreKeyRecord; -typedef int (*SignalFfiBridgeSignedPreKeyStoreLoadSignedPreKey)(void *ctx, SignalMutPointerSignedPreKeyRecord *out, uint32_t id); +typedef int (*SignalFfiSignedPreKeyStoreLoadSignedPreKey)(void *ctx, SignalMutPointerSignedPreKeyRecord *out, uint32_t id); -typedef int (*SignalFfiBridgeSignedPreKeyStoreStoreSignedPreKey)(void *ctx, uint32_t id, SignalMutPointerSignedPreKeyRecord record); +typedef int (*SignalFfiSignedPreKeyStoreStoreSignedPreKey)(void *ctx, uint32_t id, SignalMutPointerSignedPreKeyRecord record); -typedef void (*SignalFfiBridgeSignedPreKeyStoreDestroy)(void *ctx); +typedef void (*SignalFfiSignedPreKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalFfiBridgeSignedPreKeyStoreLoadSignedPreKey load_signed_pre_key; - SignalFfiBridgeSignedPreKeyStoreStoreSignedPreKey store_signed_pre_key; - SignalFfiBridgeSignedPreKeyStoreDestroy destroy; -} SignalFfiBridgeSignedPreKeyStoreStruct; - -typedef SignalFfiBridgeSignedPreKeyStoreStruct SignalSignedPreKeyStore; + SignalFfiSignedPreKeyStoreLoadSignedPreKey load_signed_pre_key; + SignalFfiSignedPreKeyStoreStoreSignedPreKey store_signed_pre_key; + SignalFfiSignedPreKeyStoreDestroy destroy; +} SignalSignedPreKeyStore; typedef struct { const SignalSignedPreKeyStore *raw; @@ -895,23 +897,21 @@ typedef struct { SignalKyberPreKeyRecord *raw; } SignalMutPointerKyberPreKeyRecord; -typedef int (*SignalFfiBridgeKyberPreKeyStoreLoadKyberPreKey)(void *ctx, SignalMutPointerKyberPreKeyRecord *out, uint32_t id); +typedef int (*SignalFfiKyberPreKeyStoreLoadKyberPreKey)(void *ctx, SignalMutPointerKyberPreKeyRecord *out, uint32_t id); -typedef int (*SignalFfiBridgeKyberPreKeyStoreStoreKyberPreKey)(void *ctx, uint32_t id, SignalMutPointerKyberPreKeyRecord record); +typedef int (*SignalFfiKyberPreKeyStoreStoreKyberPreKey)(void *ctx, uint32_t id, SignalMutPointerKyberPreKeyRecord record); -typedef int (*SignalFfiBridgeKyberPreKeyStoreMarkKyberPreKeyUsed)(void *ctx, uint32_t id, uint32_t ec_prekey_id, SignalMutPointerPublicKey base_key); +typedef int (*SignalFfiKyberPreKeyStoreMarkKyberPreKeyUsed)(void *ctx, uint32_t id, uint32_t ec_prekey_id, SignalMutPointerPublicKey base_key); -typedef void (*SignalFfiBridgeKyberPreKeyStoreDestroy)(void *ctx); +typedef void (*SignalFfiKyberPreKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalFfiBridgeKyberPreKeyStoreLoadKyberPreKey load_kyber_pre_key; - SignalFfiBridgeKyberPreKeyStoreStoreKyberPreKey store_kyber_pre_key; - SignalFfiBridgeKyberPreKeyStoreMarkKyberPreKeyUsed mark_kyber_pre_key_used; - SignalFfiBridgeKyberPreKeyStoreDestroy destroy; -} SignalFfiBridgeKyberPreKeyStoreStruct; - -typedef SignalFfiBridgeKyberPreKeyStoreStruct SignalKyberPreKeyStore; + SignalFfiKyberPreKeyStoreLoadKyberPreKey load_kyber_pre_key; + SignalFfiKyberPreKeyStoreStoreKyberPreKey store_kyber_pre_key; + SignalFfiKyberPreKeyStoreMarkKyberPreKeyUsed mark_kyber_pre_key_used; + SignalFfiKyberPreKeyStoreDestroy destroy; +} SignalKyberPreKeyStore; typedef struct { const SignalKyberPreKeyStore *raw; @@ -1047,20 +1047,18 @@ typedef struct { SignalSenderKeyRecord *raw; } SignalMutPointerSenderKeyRecord; -typedef int (*SignalFfiBridgeSenderKeyStoreLoadSenderKey)(void *ctx, SignalMutPointerSenderKeyRecord *out, SignalMutPointerProtocolAddress sender, SignalUuid distribution_id); +typedef int (*SignalFfiSenderKeyStoreLoadSenderKey)(void *ctx, SignalMutPointerSenderKeyRecord *out, SignalMutPointerProtocolAddress sender, SignalUuid distribution_id); -typedef int (*SignalFfiBridgeSenderKeyStoreStoreSenderKey)(void *ctx, SignalMutPointerProtocolAddress sender, SignalUuid distribution_id, SignalMutPointerSenderKeyRecord record); +typedef int (*SignalFfiSenderKeyStoreStoreSenderKey)(void *ctx, SignalMutPointerProtocolAddress sender, SignalUuid distribution_id, SignalMutPointerSenderKeyRecord record); -typedef void (*SignalFfiBridgeSenderKeyStoreDestroy)(void *ctx); +typedef void (*SignalFfiSenderKeyStoreDestroy)(void *ctx); typedef struct { void *ctx; - SignalFfiBridgeSenderKeyStoreLoadSenderKey load_sender_key; - SignalFfiBridgeSenderKeyStoreStoreSenderKey store_sender_key; - SignalFfiBridgeSenderKeyStoreDestroy destroy; -} SignalFfiBridgeSenderKeyStoreStruct; - -typedef SignalFfiBridgeSenderKeyStoreStruct SignalSenderKeyStore; + SignalFfiSenderKeyStoreLoadSenderKey load_sender_key; + SignalFfiSenderKeyStoreStoreSenderKey store_sender_key; + SignalFfiSenderKeyStoreDestroy destroy; +} SignalSenderKeyStore; typedef struct { const SignalSenderKeyStore *raw; @@ -1117,6 +1115,11 @@ typedef struct { SignalFfiLoggerDestroy destroy; } SignalFfiLoggerStruct; +typedef struct { + SignalOwnedBuffer first; + SignalOwnedBuffer second; +} SignalPairOfOwnedBufferOfc_ucharOwnedBufferOfc_uchar; + /** * A C callback used to report the results of Rust futures. * @@ -1127,10 +1130,10 @@ typedef struct { * completed once. */ typedef struct { - void (*complete)(SignalFfiError *error, const SignalOwnedBuffer *result, const void *context); + void (*complete)(SignalFfiError *error, const SignalPairOfOwnedBufferOfc_ucharOwnedBufferOfc_uchar *result, const void *context); const void *context; SignalCancellationId cancellation_id; -} SignalCPromiseOwnedBufferOfc_uchar; +} SignalCPromisePairOfOwnedBufferOfc_ucharOwnedBufferOfc_uchar; typedef struct { const SignalUnauthenticatedChatConnection *raw; @@ -1200,20 +1203,18 @@ typedef struct { const SignalMessageBackupValidationOutcome *raw; } SignalConstPointerMessageBackupValidationOutcome; -typedef int (*SignalFfiBridgeInputStreamRead)(void *ctx, size_t *out, SignalBorrowedMutableBuffer buf); +typedef int (*SignalFfiInputStreamRead)(void *ctx, size_t *out, SignalBorrowedMutableBuffer buf); -typedef int (*SignalFfiBridgeInputStreamSkip)(void *ctx, uint64_t amount); +typedef int (*SignalFfiInputStreamSkip)(void *ctx, uint64_t amount); -typedef void (*SignalFfiBridgeInputStreamDestroy)(void *ctx); +typedef void (*SignalFfiInputStreamDestroy)(void *ctx); typedef struct { void *ctx; - SignalFfiBridgeInputStreamRead read; - SignalFfiBridgeInputStreamSkip skip; - SignalFfiBridgeInputStreamDestroy destroy; -} SignalFfiBridgeInputStreamStruct; - -typedef SignalFfiBridgeInputStreamStruct SignalInputStream; + SignalFfiInputStreamRead read; + SignalFfiInputStreamSkip skip; + SignalFfiInputStreamDestroy destroy; +} SignalInputStream; typedef struct { const SignalInputStream *raw; @@ -1647,9 +1648,7 @@ typedef struct { SignalValidatingMac *raw; } SignalMutPointerValidatingMac; -typedef SignalFfiBridgeInputStreamStruct SignalFfiBridgeSyncInputStreamStruct; - -typedef SignalFfiBridgeSyncInputStreamStruct SignalSyncInputStream; +typedef SignalInputStream SignalSyncInputStream; typedef struct { const SignalSyncInputStream *raw; @@ -1737,6 +1736,10 @@ SignalFfiError *signal_authenticated_chat_connection_preconnect(SignalCPromisebo SignalFfiError *signal_authenticated_chat_connection_send(SignalCPromiseFfiChatResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerAuthenticatedChatConnection chat, SignalConstPointerHttpRequest http_request, uint32_t timeout_millis); +SignalFfiError *signal_authenticated_chat_connection_send_message(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerAuthenticatedChatConnection chat, const SignalServiceIdFixedWidthBinaryBytes *destination, uint64_t timestamp, SignalBorrowedSliceOfu32 device_ids, SignalBorrowedSliceOfu32 registration_ids, SignalBorrowedSliceOfConstPointerCiphertextMessage contents, bool online_only, bool is_urgent); + +SignalFfiError *signal_authenticated_chat_connection_send_sync_message(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerAuthenticatedChatConnection chat, uint64_t timestamp, SignalBorrowedSliceOfu32 device_ids, SignalBorrowedSliceOfu32 registration_ids, SignalBorrowedSliceOfConstPointerCiphertextMessage contents, bool is_urgent); + SignalFfiError *signal_backup_auth_credential_check_valid_contents(SignalBorrowedBuffer params_bytes); SignalFfiError *signal_backup_auth_credential_get_backup_id(uint8_t (*out)[16], SignalBorrowedBuffer credential_bytes); @@ -1897,7 +1900,7 @@ SignalFfiError *signal_create_call_link_credential_request_issue_deterministic(S SignalFfiError *signal_create_call_link_credential_response_check_valid_contents(SignalBorrowedBuffer response_bytes); -SignalFfiError *signal_decrypt_message(SignalOwnedBuffer *out, SignalConstPointerSignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store); +SignalFfiError *signal_decrypt_message(SignalOwnedBuffer *out, SignalConstPointerSignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerProtocolAddress local_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store); SignalFfiError *signal_decrypt_pre_key_message(SignalOwnedBuffer *out, SignalConstPointerPreKeySignalMessage message, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerProtocolAddress local_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, SignalConstPointerFfiPreKeyStoreStruct prekey_store, SignalConstPointerFfiSignedPreKeyStoreStruct signed_prekey_store, SignalConstPointerFfiKyberPreKeyStoreStruct kyber_prekey_store); @@ -2118,9 +2121,7 @@ bool signal_init_logger(SignalLogLevel max_level, SignalFfiLoggerStruct logger); SignalFfiError *signal_key_transparency_aci_search_key(SignalOwnedBuffer *out, const SignalServiceIdFixedWidthBinaryBytes *aci); -SignalFfiError *signal_key_transparency_check(SignalCPromiseOwnedBufferOfc_uchar *promise, SignalConstPointerTokioAsyncContext async_runtime, uint8_t environment, SignalConstPointerUnauthenticatedChatConnection chat_connection, const SignalServiceIdFixedWidthBinaryBytes *aci, SignalConstPointerPublicKey aci_identity_key, const char *e164, SignalOptionalBorrowedSliceOfc_uchar unidentified_access_key, SignalOptionalBorrowedSliceOfc_uchar username_hash, SignalOptionalBorrowedSliceOfc_uchar account_data, SignalBorrowedBuffer last_distinguished_tree_head, bool is_self_check, bool is_e164_discoverable); - -SignalFfiError *signal_key_transparency_distinguished(SignalCPromiseOwnedBufferOfc_uchar *promise, SignalConstPointerTokioAsyncContext async_runtime, uint8_t environment, SignalConstPointerUnauthenticatedChatConnection chat_connection, SignalOptionalBorrowedSliceOfc_uchar last_distinguished_tree_head); +SignalFfiError *signal_key_transparency_check(SignalCPromisePairOfOwnedBufferOfc_ucharOwnedBufferOfc_uchar *promise, SignalConstPointerTokioAsyncContext async_runtime, uint8_t environment, SignalConstPointerUnauthenticatedChatConnection chat_connection, const SignalServiceIdFixedWidthBinaryBytes *aci, SignalConstPointerPublicKey aci_identity_key, const char *e164, SignalOptionalBorrowedSliceOfc_uchar unidentified_access_key, SignalOptionalBorrowedSliceOfc_uchar username_hash, SignalOptionalBorrowedSliceOfc_uchar account_data, SignalOptionalBorrowedSliceOfc_uchar last_distinguished_tree_head, bool is_self_check, bool is_e164_discoverable); SignalFfiError *signal_key_transparency_e164_search_key(SignalOwnedBuffer *out, const char *e164); @@ -2354,7 +2355,7 @@ SignalFfiError *signal_privatekey_serialize(SignalOwnedBuffer *out, SignalConstP SignalFfiError *signal_privatekey_sign(SignalOwnedBuffer *out, SignalConstPointerPrivateKey key, SignalBorrowedBuffer message); -SignalFfiError *signal_process_prekey_bundle(SignalConstPointerPreKeyBundle bundle, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, uint64_t now); +SignalFfiError *signal_process_prekey_bundle(SignalConstPointerPreKeyBundle bundle, SignalConstPointerProtocolAddress protocol_address, SignalConstPointerProtocolAddress local_address, SignalConstPointerFfiSessionStoreStruct session_store, SignalConstPointerFfiIdentityKeyStoreStruct identity_key_store, uint64_t now); SignalFfiError *signal_process_sender_key_distribution_message(SignalConstPointerProtocolAddress sender, SignalConstPointerSenderKeyDistributionMessage sender_key_distribution_message, SignalConstPointerFfiSenderKeyStoreStruct store); @@ -2782,6 +2783,8 @@ SignalFfiError *signal_unauthenticated_chat_connection_look_up_username_link(Sig SignalFfiError *signal_unauthenticated_chat_connection_send(SignalCPromiseFfiChatResponse *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalConstPointerHttpRequest http_request, uint32_t timeout_millis); +SignalFfiError *signal_unauthenticated_chat_connection_send_message(SignalCPromisebool *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, const SignalServiceIdFixedWidthBinaryBytes *destination, uint64_t timestamp, SignalBorrowedSliceOfu32 device_ids, SignalBorrowedSliceOfu32 registration_ids, SignalBorrowedSliceOfBuffers contents, uint8_t auth_kind, SignalOptionalBorrowedSliceOfc_uchar auth_buffer, bool online_only, bool is_urgent); + SignalFfiError *signal_unauthenticated_chat_connection_send_multi_recipient_message(SignalCPromiseOwnedBufferOfServiceIdFixedWidthBinaryBytes *promise, SignalConstPointerTokioAsyncContext async_runtime, SignalConstPointerUnauthenticatedChatConnection chat, SignalBorrowedBuffer payload, uint64_t timestamp, SignalBorrowedBuffer auth, bool online_only, bool is_urgent); SignalFfiError *signal_unidentified_sender_message_content_deserialize(SignalMutPointerUnidentifiedSenderMessageContent *out, SignalBorrowedBuffer data); diff --git a/pkg/libsignalgo/message.go b/pkg/libsignalgo/message.go index 1b581c0..6cba873 100644 --- a/pkg/libsignalgo/message.go +++ b/pkg/libsignalgo/message.go @@ -49,7 +49,7 @@ func Encrypt(ctx context.Context, plaintext []byte, forAddress, localAddress *Ad return wrapCiphertextMessage(ciphertextMessage.raw), nil } -func Decrypt(ctx context.Context, message *Message, fromAddress *Address, sessionStore SessionStore, identityStore IdentityKeyStore) ([]byte, error) { +func Decrypt(ctx context.Context, message *Message, fromAddress, localAddress *Address, sessionStore SessionStore, identityStore IdentityKeyStore) ([]byte, error) { callbackCtx := NewCallbackContext(ctx) defer callbackCtx.Unref() var decrypted C.SignalOwnedBuffer = C.SignalOwnedBuffer{} @@ -57,6 +57,7 @@ func Decrypt(ctx context.Context, message *Message, fromAddress *Address, sessio &decrypted, message.constPtr(), fromAddress.constPtr(), + localAddress.constPtr(), callbackCtx.wrapSessionStore(sessionStore), callbackCtx.wrapIdentityKeyStore(identityStore), ) diff --git a/pkg/libsignalgo/prekeybundle.go b/pkg/libsignalgo/prekeybundle.go index 4cd5547..8a6fcaa 100644 --- a/pkg/libsignalgo/prekeybundle.go +++ b/pkg/libsignalgo/prekeybundle.go @@ -27,13 +27,14 @@ import ( "time" ) -func ProcessPreKeyBundle(ctx context.Context, bundle *PreKeyBundle, forAddress *Address, sessionStore SessionStore, identityStore IdentityKeyStore) error { +func ProcessPreKeyBundle(ctx context.Context, bundle *PreKeyBundle, forAddress, localAddress *Address, sessionStore SessionStore, identityStore IdentityKeyStore) error { callbackCtx := NewCallbackContext(ctx) defer callbackCtx.Unref() var now C.uint64_t = C.uint64_t(time.Now().Unix()) signalFfiError := C.signal_process_prekey_bundle( bundle.constPtr(), forAddress.constPtr(), + localAddress.constPtr(), callbackCtx.wrapSessionStore(sessionStore), callbackCtx.wrapIdentityKeyStore(identityStore), now, diff --git a/pkg/libsignalgo/prekeystore.go b/pkg/libsignalgo/prekeystore.go index ed8ea21..8c3c36f 100644 --- a/pkg/libsignalgo/prekeystore.go +++ b/pkg/libsignalgo/prekeystore.go @@ -76,9 +76,9 @@ func signal_destroy_pre_key_store_callback(storeCtx unsafe.Pointer) { func (ctx *CallbackContext) wrapPreKeyStore(store PreKeyStore) C.SignalConstPointerFfiPreKeyStoreStruct { return C.SignalConstPointerFfiPreKeyStoreStruct{&C.SignalPreKeyStore{ ctx: wrapStore(ctx, store), - load_pre_key: C.SignalFfiBridgePreKeyStoreLoadPreKey(C.signal_load_pre_key_callback), - store_pre_key: C.SignalFfiBridgePreKeyStoreStorePreKey(C.signal_store_pre_key_callback), - remove_pre_key: C.SignalFfiBridgePreKeyStoreRemovePreKey(C.signal_remove_pre_key_callback), - destroy: C.SignalFfiBridgePreKeyStoreDestroy(C.signal_destroy_pre_key_store_callback), + load_pre_key: C.SignalFfiPreKeyStoreLoadPreKey(C.signal_load_pre_key_callback), + store_pre_key: C.SignalFfiPreKeyStoreStorePreKey(C.signal_store_pre_key_callback), + remove_pre_key: C.SignalFfiPreKeyStoreRemovePreKey(C.signal_remove_pre_key_callback), + destroy: C.SignalFfiPreKeyStoreDestroy(C.signal_destroy_pre_key_store_callback), }} } diff --git a/pkg/libsignalgo/senderkeystore.go b/pkg/libsignalgo/senderkeystore.go index a07a287..1649216 100644 --- a/pkg/libsignalgo/senderkeystore.go +++ b/pkg/libsignalgo/senderkeystore.go @@ -70,8 +70,8 @@ func signal_destroy_sender_key_store_callback(storeCtx unsafe.Pointer) { func (ctx *CallbackContext) wrapSenderKeyStore(store SenderKeyStore) C.SignalConstPointerFfiSenderKeyStoreStruct { return C.SignalConstPointerFfiSenderKeyStoreStruct{&C.SignalSenderKeyStore{ ctx: wrapStore(ctx, store), - load_sender_key: C.SignalFfiBridgeSenderKeyStoreLoadSenderKey(C.signal_load_sender_key_callback), - store_sender_key: C.SignalFfiBridgeSenderKeyStoreStoreSenderKey(C.signal_store_sender_key_callback), - destroy: C.SignalFfiBridgeSenderKeyStoreDestroy(C.signal_destroy_sender_key_store_callback), + load_sender_key: C.SignalFfiSenderKeyStoreLoadSenderKey(C.signal_load_sender_key_callback), + store_sender_key: C.SignalFfiSenderKeyStoreStoreSenderKey(C.signal_store_sender_key_callback), + destroy: C.SignalFfiSenderKeyStoreDestroy(C.signal_destroy_sender_key_store_callback), }} } diff --git a/pkg/libsignalgo/session_test.go b/pkg/libsignalgo/session_test.go index 4bde894..dd05718 100644 --- a/pkg/libsignalgo/session_test.go +++ b/pkg/libsignalgo/session_test.go @@ -30,7 +30,7 @@ import ( "go.mau.fi/mautrix-signal/pkg/libsignalgo" ) -func initializeSessions(t *testing.T, aliceStore, bobStore *InMemorySignalProtocolStore, bobAddress *libsignalgo.Address) { +func initializeSessions(t *testing.T, aliceStore, bobStore *InMemorySignalProtocolStore, bobAddress, aliceAddress *libsignalgo.Address) { ctx := context.TODO() bobPreKey, err := libsignalgo.GeneratePrivateKey() @@ -86,7 +86,7 @@ func initializeSessions(t *testing.T, aliceStore, bobStore *InMemorySignalProtoc assert.NoError(t, err) // Alice processes the bundle - err = libsignalgo.ProcessPreKeyBundle(ctx, bobBundle, bobAddress, aliceStore, aliceStore) + err = libsignalgo.ProcessPreKeyBundle(ctx, bobBundle, bobAddress, aliceAddress, aliceStore, aliceStore) assert.NoError(t, err) record, err := aliceStore.LoadSession(ctx, bobAddress) @@ -132,7 +132,7 @@ func TestSessionCipher(t *testing.T) { aliceStore := NewInMemorySignalProtocolStore() bobStore := NewInMemorySignalProtocolStore() - initializeSessions(t, aliceStore, bobStore, bobAddress) + initializeSessions(t, aliceStore, bobStore, bobAddress, aliceAddress) alicePlaintext := []byte{8, 6, 7, 5, 3, 0, 9} @@ -163,7 +163,7 @@ func TestSessionCipher(t *testing.T) { assert.NoError(t, err) aliceCiphertext2, err := libsignalgo.DeserializeMessage(bobCiphertext2Serialized) assert.NoError(t, err) - alicePlaintext2, err := libsignalgo.Decrypt(ctx, aliceCiphertext2, bobAddress, aliceStore, aliceStore) + alicePlaintext2, err := libsignalgo.Decrypt(ctx, aliceCiphertext2, bobAddress, aliceAddress, aliceStore, aliceStore) assert.NoError(t, err) assert.Equal(t, bobPlaintext2, alicePlaintext2) } @@ -183,7 +183,7 @@ func TestSessionCipherWithBadStore(t *testing.T) { aliceStore := NewInMemorySignalProtocolStore() bobStore := &BadInMemorySignalProtocolStore{NewInMemorySignalProtocolStore()} - initializeSessions(t, aliceStore, bobStore.InMemorySignalProtocolStore, bobAddress) + initializeSessions(t, aliceStore, bobStore.InMemorySignalProtocolStore, bobAddress, aliceAddress) alicePlaintext := []byte{8, 6, 7, 5, 3, 0, 9} @@ -216,7 +216,7 @@ func TestSealedSenderEncrypt_Repeated(t *testing.T) { aliceStore := NewInMemorySignalProtocolStore() bobStore := NewInMemorySignalProtocolStore() - initializeSessions(t, aliceStore, bobStore, bobAddress) + initializeSessions(t, aliceStore, bobStore, bobAddress, aliceAddress) trustRoot, err := libsignalgo.GenerateIdentityKeyPair() assert.NoError(t, err) @@ -252,15 +252,18 @@ func TestArchiveSession(t *testing.T) { ctx := context.TODO() setupLogging() + aliceACI := uuid.New() bobACI := uuid.New() + aliceAddress, err := libsignalgo.NewACIServiceID(aliceACI).Address(1) + assert.NoError(t, err) bobAddress, err := libsignalgo.NewACIServiceID(bobACI).Address(1) assert.NoError(t, err) aliceStore := NewInMemorySignalProtocolStore() bobStore := NewInMemorySignalProtocolStore() - initializeSessions(t, aliceStore, bobStore, bobAddress) + initializeSessions(t, aliceStore, bobStore, bobAddress, aliceAddress) session, err := aliceStore.LoadSession(ctx, bobAddress) assert.NoError(t, err) @@ -315,7 +318,7 @@ func TestSealedSenderGroupCipher(t *testing.T) { bobStore := NewInMemorySignalProtocolStore() - initializeSessions(t, aliceStore, bobStore, bobAddress) + initializeSessions(t, aliceStore, bobStore, bobAddress, aliceAddress) trustRoot, err := libsignalgo.GenerateIdentityKeyPair() assert.NoError(t, err) diff --git a/pkg/libsignalgo/sessionstore.go b/pkg/libsignalgo/sessionstore.go index 2515232..99000e5 100644 --- a/pkg/libsignalgo/sessionstore.go +++ b/pkg/libsignalgo/sessionstore.go @@ -67,8 +67,8 @@ func signal_destroy_session_store_callback(storeCtx unsafe.Pointer) { func (ctx *CallbackContext) wrapSessionStore(store SessionStore) C.SignalConstPointerFfiSessionStoreStruct { return C.SignalConstPointerFfiSessionStoreStruct{&C.SignalSessionStore{ ctx: wrapStore(ctx, store), - load_session: C.SignalFfiBridgeSessionStoreLoadSession(C.signal_load_session_callback), - store_session: C.SignalFfiBridgeSessionStoreStoreSession(C.signal_store_session_callback), - destroy: C.SignalFfiBridgeSessionStoreDestroy(C.signal_destroy_session_store_callback), + load_session: C.SignalFfiSessionStoreLoadSession(C.signal_load_session_callback), + store_session: C.SignalFfiSessionStoreStoreSession(C.signal_store_session_callback), + destroy: C.SignalFfiSessionStoreDestroy(C.signal_destroy_session_store_callback), }} } diff --git a/pkg/libsignalgo/signedprekeystore.go b/pkg/libsignalgo/signedprekeystore.go index cfb3015..b1306e2 100644 --- a/pkg/libsignalgo/signedprekeystore.go +++ b/pkg/libsignalgo/signedprekeystore.go @@ -67,8 +67,8 @@ func signal_destroy_signed_pre_key_store_callback(storeCtx unsafe.Pointer) { func (ctx *CallbackContext) wrapSignedPreKeyStore(store SignedPreKeyStore) C.SignalConstPointerFfiSignedPreKeyStoreStruct { return C.SignalConstPointerFfiSignedPreKeyStoreStruct{&C.SignalSignedPreKeyStore{ ctx: wrapStore(ctx, store), - load_signed_pre_key: C.SignalFfiBridgeSignedPreKeyStoreLoadSignedPreKey(C.signal_load_signed_pre_key_callback), - store_signed_pre_key: C.SignalFfiBridgeSignedPreKeyStoreStoreSignedPreKey(C.signal_store_signed_pre_key_callback), - destroy: C.SignalFfiBridgeSignedPreKeyStoreDestroy(C.signal_destroy_signed_pre_key_store_callback), + load_signed_pre_key: C.SignalFfiSignedPreKeyStoreLoadSignedPreKey(C.signal_load_signed_pre_key_callback), + store_signed_pre_key: C.SignalFfiSignedPreKeyStoreStoreSignedPreKey(C.signal_store_signed_pre_key_callback), + destroy: C.SignalFfiSignedPreKeyStoreDestroy(C.signal_destroy_signed_pre_key_store_callback), }} } diff --git a/pkg/libsignalgo/version.go b/pkg/libsignalgo/version.go index bd14084..1f7e94d 100644 --- a/pkg/libsignalgo/version.go +++ b/pkg/libsignalgo/version.go @@ -2,4 +2,4 @@ package libsignalgo -const Version = "v0.92.1" +const Version = "v0.93.2" diff --git a/pkg/signalmeow/keys.go b/pkg/signalmeow/keys.go index f1801e5..5439755 100644 --- a/pkg/signalmeow/keys.go +++ b/pkg/signalmeow/keys.go @@ -413,6 +413,10 @@ func (cli *Client) FetchAndProcessPreKey(ctx context.Context, theirServiceID lib if cli.Store.RecipientStore.IsUnregistered(ctx, theirServiceID) { return fmt.Errorf("%w (cached)", ErrUnregisteredUser) } + localAddress, err := cli.Store.ACIServiceID().Address(uint(cli.Store.DeviceID)) + if err != nil { + return fmt.Errorf("failed to get own address: %w", err) + } // Fetch prekey deviceIDPath := "/*" if specificDeviceID >= 0 { @@ -518,6 +522,7 @@ func (cli *Client) FetchAndProcessPreKey(ctx context.Context, theirServiceID lib ctx, preKeyBundle, address, + localAddress, cli.Store.ACISessionStore, cli.Store.ACIIdentityStore, ) diff --git a/pkg/signalmeow/receiving_decrypt.go b/pkg/signalmeow/receiving_decrypt.go index 6296f00..1d2c8cc 100644 --- a/pkg/signalmeow/receiving_decrypt.go +++ b/pkg/signalmeow/receiving_decrypt.go @@ -243,11 +243,16 @@ func (cli *Client) decryptCiphertextEnvelope( if identityStore == nil { return nil, fmt.Errorf("no identity store for destination service ID %s", destinationServiceID) } + destinationAddress, err := destinationServiceID.Address(uint(cli.Store.DeviceID)) + if err != nil { + return nil, fmt.Errorf("failed to get own address: %w", err) + } plaintext, ciphertextHash, err := cli.bufferedDecryptTxn(ctx, ciphertext, serverTimestamp, func(ctx context.Context) ([]byte, error) { return libsignalgo.Decrypt( ctx, message, senderAddress, + destinationAddress, sessionStore, identityStore, ) From 4f1ebf7aa2708374c0e71d3f76913e07485aad96 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 8 May 2026 16:56:40 +0300 Subject: [PATCH 165/170] dependencies: update mautrix-go --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index a936973..c9cf551 100644 --- a/go.mod +++ b/go.mod @@ -11,17 +11,17 @@ require ( github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff github.com/google/uuid v1.6.0 github.com/mattn/go-pointer v0.0.1 - github.com/rs/zerolog v1.35.0 + github.com/rs/zerolog v1.35.1 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.9-0.20260430092340-8772e7714ea5 + go.mau.fi/util v0.9.9-0.20260508133822-4207002539ff golang.org/x/crypto v0.50.0 golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f golang.org/x/net v0.53.0 golang.org/x/sync v0.20.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.27.1-0.20260430124810-125ac2c48014 + maunium.net/go/mautrix v0.27.1-0.20260507230413-b25744aa7730 ) require ( @@ -32,7 +32,7 @@ require ( github.com/lib/pq v1.12.3 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-sqlite3 v1.14.42 // indirect + github.com/mattn/go-sqlite3 v1.14.44 // indirect github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect diff --git a/go.sum b/go.sum index f817e1d..69eb732 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= -github.com/mattn/go-sqlite3 v1.14.42 h1:MigqEP4ZmHw3aIdIT7T+9TLa90Z6smwcthx+Azv4Cgo= -github.com/mattn/go-sqlite3 v1.14.42/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ= +github.com/mattn/go-sqlite3 v1.14.44 h1:3VSe+xafpbzsLbdr2AWlAZk9yRHiBhTBakioXaCKTF8= +github.com/mattn/go-sqlite3 v1.14.44/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ= github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 h1:WDsQxOJDy0N1VRAjXLpi8sCEZRSGarLWQevDxpTBRrM= github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -42,8 +42,8 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= -github.com/rs/zerolog v1.35.0 h1:VD0ykx7HMiMJytqINBsKcbLS+BJ4WYjz+05us+LRTdI= -github.com/rs/zerolog v1.35.0/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= +github.com/rs/zerolog v1.35.1 h1:m7xQeoiLIiV0BCEY4Hs+j2NG4Gp2o2KPKmhnnLiazKI= +github.com/rs/zerolog v1.35.1/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= @@ -61,8 +61,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.9-0.20260430092340-8772e7714ea5 h1:cNm4gkt7j907g1Q4XvyNKW8tTM8BaU91Kbfa5GGyiCs= -go.mau.fi/util v0.9.9-0.20260430092340-8772e7714ea5/go.mod h1:up/5mbzH2M1pSBNXqRxODn8dg/hEKbLJu92W4/SNAX0= +go.mau.fi/util v0.9.9-0.20260508133822-4207002539ff h1:nH8zuwSw5uu2pal7p9x5BSAvavuiJqRFN558XvcTtKg= +go.mau.fi/util v0.9.9-0.20260508133822-4207002539ff/go.mod h1:jE9FfhbgEgAwxei6lomO9v8zdCIATcquONUu4vjRwSs= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.27.1-0.20260430124810-125ac2c48014 h1:KwXGBWwUHYJKVTYWgbZEFcaM6uYLMvfjzHJg/TLwvKc= -maunium.net/go/mautrix v0.27.1-0.20260430124810-125ac2c48014/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= +maunium.net/go/mautrix v0.27.1-0.20260507230413-b25744aa7730 h1:GcBSD72Ez7D3LoFVprsFFQx3mKcaRh983KpLIiifw68= +maunium.net/go/mautrix v0.27.1-0.20260507230413-b25744aa7730/go.mod h1:2ANjihDB+wv2UAqJapkRekmNXw7khSisccAkE5Jg3P0= From 9cdd4c9963726af2d1f2eaaeec41f18adf3284c9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 8 May 2026 16:57:56 +0300 Subject: [PATCH 166/170] signalmeow: update protobufs --- pkg/signalmeow/protobuf/ContactDiscovery.pb.go | 2 +- pkg/signalmeow/protobuf/DeviceName.pb.go | 2 +- pkg/signalmeow/protobuf/Groups.pb.go | 2 +- pkg/signalmeow/protobuf/Provisioning.pb.go | 2 +- pkg/signalmeow/protobuf/SignalService.pb.go | 2 +- pkg/signalmeow/protobuf/StickerResources.pb.go | 2 +- pkg/signalmeow/protobuf/StorageService.pb.go | 15 ++++++++++++--- pkg/signalmeow/protobuf/StorageService.proto | 1 + .../protobuf/UnidentifiedDelivery.pb.go | 2 +- pkg/signalmeow/protobuf/WebSocketResources.pb.go | 2 +- pkg/signalmeow/protobuf/backuppb/Backup.pb.go | 2 +- pkg/signalmeow/protobuf/update-protos.sh | 4 ++-- 12 files changed, 24 insertions(+), 14 deletions(-) diff --git a/pkg/signalmeow/protobuf/ContactDiscovery.pb.go b/pkg/signalmeow/protobuf/ContactDiscovery.pb.go index 637a2d2..5cb232c 100644 --- a/pkg/signalmeow/protobuf/ContactDiscovery.pb.go +++ b/pkg/signalmeow/protobuf/ContactDiscovery.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: ContactDiscovery.proto // Copyright 2021 Signal Messenger, LLC diff --git a/pkg/signalmeow/protobuf/DeviceName.pb.go b/pkg/signalmeow/protobuf/DeviceName.pb.go index 5666b7e..31b5704 100644 --- a/pkg/signalmeow/protobuf/DeviceName.pb.go +++ b/pkg/signalmeow/protobuf/DeviceName.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: DeviceName.proto // Copyright 2018 Signal Messenger, LLC diff --git a/pkg/signalmeow/protobuf/Groups.pb.go b/pkg/signalmeow/protobuf/Groups.pb.go index 0c2b81b..8d4e2e3 100644 --- a/pkg/signalmeow/protobuf/Groups.pb.go +++ b/pkg/signalmeow/protobuf/Groups.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: Groups.proto package signalpb diff --git a/pkg/signalmeow/protobuf/Provisioning.pb.go b/pkg/signalmeow/protobuf/Provisioning.pb.go index c925fe6..88ebe90 100644 --- a/pkg/signalmeow/protobuf/Provisioning.pb.go +++ b/pkg/signalmeow/protobuf/Provisioning.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: Provisioning.proto package signalpb diff --git a/pkg/signalmeow/protobuf/SignalService.pb.go b/pkg/signalmeow/protobuf/SignalService.pb.go index 32842bf..c4268dd 100644 --- a/pkg/signalmeow/protobuf/SignalService.pb.go +++ b/pkg/signalmeow/protobuf/SignalService.pb.go @@ -5,7 +5,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: SignalService.proto package signalpb diff --git a/pkg/signalmeow/protobuf/StickerResources.pb.go b/pkg/signalmeow/protobuf/StickerResources.pb.go index e83cda1..f8194aa 100644 --- a/pkg/signalmeow/protobuf/StickerResources.pb.go +++ b/pkg/signalmeow/protobuf/StickerResources.pb.go @@ -6,7 +6,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: StickerResources.proto package signalpb diff --git a/pkg/signalmeow/protobuf/StorageService.pb.go b/pkg/signalmeow/protobuf/StorageService.pb.go index 619221f..bbe88ef 100644 --- a/pkg/signalmeow/protobuf/StorageService.pb.go +++ b/pkg/signalmeow/protobuf/StorageService.pb.go @@ -6,7 +6,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: StorageService.proto package signalpb @@ -1401,6 +1401,7 @@ type GroupV2Record struct { HideStory bool `protobuf:"varint,8,opt,name=hideStory,proto3" json:"hideStory,omitempty"` StorySendMode GroupV2Record_StorySendMode `protobuf:"varint,10,opt,name=storySendMode,proto3,enum=signalservice.GroupV2Record_StorySendMode" json:"storySendMode,omitempty"` AvatarColor *AvatarColor `protobuf:"varint,11,opt,name=avatarColor,proto3,enum=signalservice.AvatarColor,oneof" json:"avatarColor,omitempty"` + VerifiedNameHash []byte `protobuf:"bytes,12,opt,name=verifiedNameHash,proto3" json:"verifiedNameHash,omitempty"` // SHA-256 of UTF-8 encoded decrypted group title that was last verified unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1505,6 +1506,13 @@ func (x *GroupV2Record) GetAvatarColor() AvatarColor { return AvatarColor_A100 } +func (x *GroupV2Record) GetVerifiedNameHash() []byte { + if x != nil { + return x.VerifiedNameHash + } + return nil +} + type Payments struct { state protoimpl.MessageState `protogen:"open.v1"` Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` @@ -3195,7 +3203,7 @@ const file_StorageService_proto_rawDesc = "" + "\vwhitelisted\x18\x03 \x01(\bR\vwhitelisted\x12\x1a\n" + "\barchived\x18\x04 \x01(\bR\barchived\x12\"\n" + "\fmarkedUnread\x18\x05 \x01(\bR\fmarkedUnread\x120\n" + - "\x13mutedUntilTimestamp\x18\x06 \x01(\x04R\x13mutedUntilTimestamp\"\xa1\x04\n" + + "\x13mutedUntilTimestamp\x18\x06 \x01(\x04R\x13mutedUntilTimestamp\"\xcd\x04\n" + "\rGroupV2Record\x12\x1c\n" + "\tmasterKey\x18\x01 \x01(\fR\tmasterKey\x12\x18\n" + "\ablocked\x18\x02 \x01(\bR\ablocked\x12 \n" + @@ -3207,7 +3215,8 @@ const file_StorageService_proto_rawDesc = "" + "\thideStory\x18\b \x01(\bR\thideStory\x12P\n" + "\rstorySendMode\x18\n" + " \x01(\x0e2*.signalservice.GroupV2Record.StorySendModeR\rstorySendMode\x12A\n" + - "\vavatarColor\x18\v \x01(\x0e2\x1a.signalservice.AvatarColorH\x00R\vavatarColor\x88\x01\x01\"7\n" + + "\vavatarColor\x18\v \x01(\x0e2\x1a.signalservice.AvatarColorH\x00R\vavatarColor\x88\x01\x01\x12*\n" + + "\x10verifiedNameHash\x18\f \x01(\fR\x10verifiedNameHash\"7\n" + "\rStorySendMode\x12\v\n" + "\aDEFAULT\x10\x00\x12\f\n" + "\bDISABLED\x10\x01\x12\v\n" + diff --git a/pkg/signalmeow/protobuf/StorageService.proto b/pkg/signalmeow/protobuf/StorageService.proto index d22babc..dd232ca 100644 --- a/pkg/signalmeow/protobuf/StorageService.proto +++ b/pkg/signalmeow/protobuf/StorageService.proto @@ -172,6 +172,7 @@ message GroupV2Record { reserved /* storySendEnabled */ 9; StorySendMode storySendMode = 10; optional AvatarColor avatarColor = 11; + bytes verifiedNameHash = 12; // SHA-256 of UTF-8 encoded decrypted group title that was last verified } message Payments { diff --git a/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go b/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go index e30f6d6..5979a4c 100644 --- a/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go +++ b/pkg/signalmeow/protobuf/UnidentifiedDelivery.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: UnidentifiedDelivery.proto // Copyright 2018 Signal Messenger, LLC diff --git a/pkg/signalmeow/protobuf/WebSocketResources.pb.go b/pkg/signalmeow/protobuf/WebSocketResources.pb.go index f35110d..66520eb 100644 --- a/pkg/signalmeow/protobuf/WebSocketResources.pb.go +++ b/pkg/signalmeow/protobuf/WebSocketResources.pb.go @@ -6,7 +6,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: WebSocketResources.proto package signalpb diff --git a/pkg/signalmeow/protobuf/backuppb/Backup.pb.go b/pkg/signalmeow/protobuf/backuppb/Backup.pb.go index 326c170..bc488e7 100644 --- a/pkg/signalmeow/protobuf/backuppb/Backup.pb.go +++ b/pkg/signalmeow/protobuf/backuppb/Backup.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v6.33.5 +// protoc v7.34.1 // source: backuppb/Backup.proto package backuppb diff --git a/pkg/signalmeow/protobuf/update-protos.sh b/pkg/signalmeow/protobuf/update-protos.sh index ffaa697..f9c86fc 100755 --- a/pkg/signalmeow/protobuf/update-protos.sh +++ b/pkg/signalmeow/protobuf/update-protos.sh @@ -1,8 +1,8 @@ #!/bin/bash set -euo pipefail -ANDROID_GIT_REVISION=${1:-dfd2f7baf96825834f784900ce644e9ead8a9a89} -DESKTOP_GIT_REVISION=${1:-60a1e125452ee672d8747564d0055d5bfec9f679} +ANDROID_GIT_REVISION=${1:-439760e7732585bfd078d92d93732c04cc31e29e} +DESKTOP_GIT_REVISION=${1:-1b2a3e7b283c32c5654a39da12fc04139fd26dbd} update_proto() { case "$1" in From 4545def01787e39cf9c86b5fa7e726330de17b28 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 11 May 2026 16:16:36 +0300 Subject: [PATCH 167/170] signalmeow/web: log request durations --- pkg/signalmeow/web/web.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/signalmeow/web/web.go b/pkg/signalmeow/web/web.go index e617b40..f211b77 100644 --- a/pkg/signalmeow/web/web.go +++ b/pkg/signalmeow/web/web.go @@ -28,6 +28,7 @@ import ( "net/http" "runtime" "strings" + "time" "github.com/rs/zerolog" @@ -140,12 +141,14 @@ func SendHTTPRequest(ctx context.Context, host, method, path string, opt *HTTPRe httpReqCounter++ log = log.With().Int("request_number", httpReqCounter).Logger() log.Trace().Msg("Sending HTTP request") + start := time.Now() resp, err := SignalHTTPClient.Do(req) + dur := time.Since(start) if err != nil { - log.Err(err).Msg("Error sending request") + log.Err(err).Dur("duration", dur).Msg("Error sending request") return nil, err } - log.Debug().Int("status_code", resp.StatusCode).Msg("received HTTP response") + log.Debug().Int("status_code", resp.StatusCode).Dur("duration", dur).Msg("Received HTTP response") return resp, nil } From 41a37cd1844c63737b1ccca80d54118cf5c02819 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Tue, 12 May 2026 11:43:06 +0200 Subject: [PATCH 168/170] capabilities: drop webp to only partial support (#649) Co-authored-by: Tulir Asokan --- pkg/connector/capabilities.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/connector/capabilities.go b/pkg/connector/capabilities.go index d23285c..5eab6a8 100644 --- a/pkg/connector/capabilities.go +++ b/pkg/connector/capabilities.go @@ -38,7 +38,7 @@ func supportedIfFFmpeg() event.CapabilitySupportLevel { } func capID() string { - base := "fi.mau.signal.capabilities.2025_12_09" + base := "fi.mau.signal.capabilities.2026_05_12" if ffmpeg.Supported() { return base + "+ffmpeg" } @@ -111,7 +111,8 @@ var signalCaps = &event.RoomFeatures{ }, event.CapMsgSticker: { MimeTypes: map[string]event.CapabilitySupportLevel{ - "image/webp": event.CapLevelFullySupported, + // Signal clients will only render static webp, so apng is preferred + "image/webp": event.CapLevelPartialSupport, "image/png": event.CapLevelFullySupported, "image/apng": event.CapLevelFullySupported, "image/gif": supportedIfFFmpeg(), @@ -236,5 +237,5 @@ func (s *SignalConnector) GetCapabilities() *bridgev2.NetworkGeneralCapabilities } func (s *SignalConnector) GetBridgeInfoVersion() (info, capabilities int) { - return 1, 7 + return 1, 8 } From 14592ffdccac3ea222a2ac787c7405133d227cfa Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 12 May 2026 16:00:56 +0300 Subject: [PATCH 169/170] dependencies: update mautrix-go --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index c9cf551..db72345 100644 --- a/go.mod +++ b/go.mod @@ -14,14 +14,14 @@ require ( github.com/rs/zerolog v1.35.1 github.com/stretchr/testify v1.11.1 github.com/tidwall/gjson v1.18.0 - go.mau.fi/util v0.9.9-0.20260508133822-4207002539ff + go.mau.fi/util v0.9.9-0.20260511124621-9241e81bdf25 golang.org/x/crypto v0.50.0 golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f golang.org/x/net v0.53.0 golang.org/x/sync v0.20.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.27.1-0.20260507230413-b25744aa7730 + maunium.net/go/mautrix v0.27.1-0.20260512144923-7c0986318ff8 ) require ( diff --git a/go.sum b/go.sum index 69eb732..753b96d 100644 --- a/go.sum +++ b/go.sum @@ -61,8 +61,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.8.2 h1:kEGpgqJXdgbkhcOgBxkC0X0PmoPG1ZyoZ117rDVp4zE= github.com/yuin/goldmark v1.8.2/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.9-0.20260508133822-4207002539ff h1:nH8zuwSw5uu2pal7p9x5BSAvavuiJqRFN558XvcTtKg= -go.mau.fi/util v0.9.9-0.20260508133822-4207002539ff/go.mod h1:jE9FfhbgEgAwxei6lomO9v8zdCIATcquONUu4vjRwSs= +go.mau.fi/util v0.9.9-0.20260511124621-9241e81bdf25 h1:YPEmc+li7TF6C9AdRTcSLMb6yCHdF27/wNT7kFLIVNg= +go.mau.fi/util v0.9.9-0.20260511124621-9241e81bdf25/go.mod h1:jE9FfhbgEgAwxei6lomO9v8zdCIATcquONUu4vjRwSs= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.27.1-0.20260507230413-b25744aa7730 h1:GcBSD72Ez7D3LoFVprsFFQx3mKcaRh983KpLIiifw68= -maunium.net/go/mautrix v0.27.1-0.20260507230413-b25744aa7730/go.mod h1:2ANjihDB+wv2UAqJapkRekmNXw7khSisccAkE5Jg3P0= +maunium.net/go/mautrix v0.27.1-0.20260512144923-7c0986318ff8 h1:8eHwxv8J9b8ebVwL4H98mlKE4SSAeqhqwD251oSiEkc= +maunium.net/go/mautrix v0.27.1-0.20260512144923-7c0986318ff8/go.mod h1:3sOGhXi3P1V6/NruTA0gujkvTypXVUraWktCuTGyDuM= From 0df937749bfc3dfa5c06d657b29f49c7548ef4d4 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 13 May 2026 15:05:37 +0300 Subject: [PATCH 170/170] dependencies: update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index db72345..931af45 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( golang.org/x/sync v0.20.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.27.1-0.20260512144923-7c0986318ff8 + maunium.net/go/mautrix v0.27.1-0.20260513120123-5fba7e3afae4 ) require ( diff --git a/go.sum b/go.sum index 753b96d..2f02866 100644 --- a/go.sum +++ b/go.sum @@ -91,5 +91,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.27.1-0.20260512144923-7c0986318ff8 h1:8eHwxv8J9b8ebVwL4H98mlKE4SSAeqhqwD251oSiEkc= -maunium.net/go/mautrix v0.27.1-0.20260512144923-7c0986318ff8/go.mod h1:3sOGhXi3P1V6/NruTA0gujkvTypXVUraWktCuTGyDuM= +maunium.net/go/mautrix v0.27.1-0.20260513120123-5fba7e3afae4 h1:zNC9eVAhw8FhKpM3AxNAh/iy75UEYX91uJUvqqAYlvo= +maunium.net/go/mautrix v0.27.1-0.20260513120123-5fba7e3afae4/go.mod h1:3sOGhXi3P1V6/NruTA0gujkvTypXVUraWktCuTGyDuM=