1
0
Fork 0
mirror of https://github.com/mautrix/signal.git synced 2026-07-07 14:53:17 -04:00

Compare commits

...

4 commits

Author SHA1 Message Date
Tulir Asokan
3e7a2287ee signalmeow: retry sender key sends on session not found error 2026-07-02 17:00:52 +03:00
Tulir Asokan
8c4d5e1e7c signalmeow: simplify some errors 2026-07-02 16:59:34 +03:00
Tulir Asokan
facfe86a50 libsignal: update to v0.96.2 2026-06-21 20:19:31 +03:00
Tulir Asokan
8217fb9e42 signalmeow/provisioning: update capabilities 2026-06-21 20:19:28 +03:00
7 changed files with 97 additions and 16 deletions

View file

@ -151,7 +151,10 @@ func (s *SignalClient) syncChats(ctx context.Context, cancel context.CancelFunc)
groupID := types.GroupIdentifier(base64.StdEncoding.EncodeToString(rawGroupID[:]))
groupInfo, err := s.getGroupInfo(ctx, groupID, dest.Group.GetSnapshot().GetVersion(), chat)
if err != nil {
zerolog.Ctx(ctx).Err(err).Msg("Failed to get full group info")
zerolog.Ctx(ctx).Err(err).
Uint64("recipient_id", recipient.Id).
Stringer("group_id", groupID).
Msg("Failed to get full group info")
continue
}
resyncEvt.PortalKey = s.makePortalKey(string(groupID))

@ -1 +1 @@
Subproject commit 46d867c986f66201e34e7ae20ce423eec742bf3f
Subproject commit 38428a7bb70509910d72b3f78208c1daf33774d8

View file

@ -948,6 +948,14 @@ typedef struct {
const SignalDecryptionErrorMessage *raw;
} SignalConstPointerDecryptionErrorMessage;
typedef struct {
const SignalServerSecretParams *raw;
} SignalConstPointerServerSecretParams;
typedef struct {
const SignalServerPublicParams *raw;
} SignalConstPointerServerPublicParams;
/**
* Like [`std::panic::AssertUnwindSafe`], but FFI-compatible.
*/
@ -1087,19 +1095,11 @@ typedef struct {
const SignalSenderKeyStore *raw;
} SignalConstPointerFfiSenderKeyStoreStruct;
typedef struct {
const SignalServerSecretParams *raw;
} SignalConstPointerServerSecretParams;
typedef struct {
const SignalBorrowedBuffer *base;
size_t length;
} SignalBorrowedSliceOfBuffers;
typedef struct {
const SignalServerPublicParams *raw;
} SignalConstPointerServerPublicParams;
typedef struct {
SignalHsmEnclaveClient *raw;
} SignalMutPointerHsmEnclaveClient;
@ -1805,6 +1805,36 @@ SignalFfiError *signal_authenticated_chat_connection_send_raw_grpc(SignalCPromis
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_avatar_upload_credential_check_valid_contents(SignalBorrowedBuffer credential_bytes);
SignalFfiError *signal_avatar_upload_credential_get_cm(uint8_t (*out)[32], SignalBorrowedBuffer credential_bytes);
SignalFfiError *signal_avatar_upload_credential_get_redemption_time(uint64_t *out, SignalBorrowedBuffer credential_bytes);
SignalFfiError *signal_avatar_upload_credential_present_deterministic(SignalOwnedBuffer *out, SignalBorrowedBuffer credential_bytes, SignalBorrowedBuffer server_params_bytes, const uint8_t (*randomness)[SignalRANDOMNESS_LEN]);
SignalFfiError *signal_avatar_upload_credential_presentation_check_valid_contents(SignalBorrowedBuffer presentation_bytes);
SignalFfiError *signal_avatar_upload_credential_presentation_get_cm(uint8_t (*out)[32], SignalBorrowedBuffer presentation_bytes);
SignalFfiError *signal_avatar_upload_credential_presentation_get_redemption_time(uint64_t *out, SignalBorrowedBuffer presentation_bytes);
SignalFfiError *signal_avatar_upload_credential_presentation_verify(SignalBorrowedBuffer presentation_bytes, uint64_t current_time, SignalBorrowedBuffer server_params_bytes);
SignalFfiError *signal_avatar_upload_credential_request_check_valid_contents(SignalBorrowedBuffer request_bytes);
SignalFfiError *signal_avatar_upload_credential_request_context_check_valid_contents(SignalBorrowedBuffer context_bytes);
SignalFfiError *signal_avatar_upload_credential_request_context_get_request(SignalOwnedBuffer *out, SignalBorrowedBuffer context_bytes);
SignalFfiError *signal_avatar_upload_credential_request_context_new(SignalOwnedBuffer *out, const SignalServiceIdFixedWidthBinaryBytes *aci, SignalBorrowedBuffer zk_credential_key_pair_bytes, uint64_t rotation_id, const uint8_t (*randomness)[SignalRANDOMNESS_LEN]);
SignalFfiError *signal_avatar_upload_credential_request_context_receive_response(SignalOwnedBuffer *out, SignalBorrowedBuffer context_bytes, SignalBorrowedBuffer response_bytes, uint64_t current_time, SignalBorrowedBuffer params_bytes);
SignalFfiError *signal_avatar_upload_credential_request_issue_deterministic(SignalOwnedBuffer *out, SignalBorrowedBuffer request_bytes, const SignalServiceIdFixedWidthBinaryBytes *aci, SignalBorrowedBuffer zk_credential_key_pub_bytes, uint64_t rotation_id, uint64_t redemption_time, SignalBorrowedBuffer params_bytes, const uint8_t (*randomness)[SignalRANDOMNESS_LEN]);
SignalFfiError *signal_avatar_upload_credential_response_check_valid_contents(SignalBorrowedBuffer response_bytes);
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);
@ -1993,6 +2023,38 @@ 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_donation_permit_check_valid_contents(SignalBorrowedBuffer buffer);
SignalFfiError *signal_donation_permit_derived_key_pair_check_valid_contents(SignalBorrowedBuffer buffer);
SignalFfiError *signal_donation_permit_derived_key_pair_for_expiration(SignalOwnedBuffer *out, uint64_t timestamp, SignalConstPointerServerSecretParams root);
SignalFfiError *signal_donation_permit_expiration(uint64_t *out, SignalBorrowedBuffer donation_permit);
SignalFfiError *signal_donation_permit_request_check_valid_contents(SignalBorrowedBuffer buffer);
SignalFfiError *signal_donation_permit_request_context_check_valid_contents(SignalBorrowedBuffer buffer);
SignalFfiError *signal_donation_permit_request_context_new_deterministic(SignalOwnedBuffer *out, int32_t count, const uint8_t (*randomness)[SignalRANDOMNESS_LEN]);
SignalFfiError *signal_donation_permit_request_context_receive(SignalBytestringArray *out, SignalBorrowedBuffer context, SignalBorrowedBuffer response, SignalConstPointerServerPublicParams public_params, uint64_t now);
SignalFfiError *signal_donation_permit_request_context_request(SignalOwnedBuffer *out, SignalBorrowedBuffer ctx);
SignalFfiError *signal_donation_permit_request_len(int32_t *out, SignalBorrowedBuffer donation_permit_request);
SignalFfiError *signal_donation_permit_response_check_valid_contents(SignalBorrowedBuffer buffer);
SignalFfiError *signal_donation_permit_response_default_expiration(uint64_t *out, uint64_t current_time);
SignalFfiError *signal_donation_permit_response_get_expiration(uint64_t *out, SignalBorrowedBuffer response);
SignalFfiError *signal_donation_permit_response_issue_deterministic(SignalOwnedBuffer *out, SignalBorrowedBuffer request, SignalBorrowedBuffer key_pair, const uint8_t (*seed)[SignalRANDOMNESS_LEN]);
SignalFfiError *signal_donation_permit_spend_id(SignalOwnedBuffer *out, SignalBorrowedBuffer donation_permit);
SignalFfiError *signal_donation_permit_verify(SignalBorrowedBuffer permit, uint64_t now, SignalBorrowedBuffer key_pair);
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);
@ -2910,4 +2972,12 @@ SignalFfiError *signal_validating_mac_update(int32_t *out, SignalMutPointerValid
SignalFfiError *signal_webp_sanitizer_sanitize(SignalConstPointerFfiSyncInputStreamStruct input);
SignalFfiError *signal_zk_credential_key_pair_check_valid_contents(SignalBorrowedBuffer key_pair_bytes);
SignalFfiError *signal_zk_credential_key_pair_generate_deterministic(SignalOwnedBuffer *out, const uint8_t (*randomness)[SignalRANDOMNESS_LEN]);
SignalFfiError *signal_zk_credential_key_pair_get_public_key(SignalOwnedBuffer *out, SignalBorrowedBuffer key_pair_bytes);
SignalFfiError *signal_zk_credential_public_key_check_valid_contents(SignalBorrowedBuffer public_key_bytes);
#endif /* SIGNAL_FFI_H_ */

View file

@ -2,4 +2,4 @@
package libsignalgo
const Version = "v0.94.4"
const Version = "v0.96.2"

View file

@ -641,7 +641,7 @@ func (cli *Client) fetchGroupWithMasterKey(ctx context.Context, groupMasterKey t
return nil, err
}
if response.StatusCode != 200 {
return nil, fmt.Errorf("fetchGroupByID SendHTTPRequest bad status: %d", response.StatusCode)
return nil, fmt.Errorf("unexpected response status: %d", response.StatusCode)
}
return cli.parseGroupResponse(ctx, response, groupMasterKey)
}
@ -1780,7 +1780,7 @@ func (cli *Client) GetGroupHistoryPage(ctx context.Context, gid types.GroupIdent
return nil, err
}
if response.StatusCode != 200 {
return nil, fmt.Errorf("fetchGroupByID SendHTTPRequest bad status: %d", response.StatusCode)
return nil, fmt.Errorf("unexpected response status: %d", response.StatusCode)
}
var encryptedGroupChanges signalpb.GroupChanges
groupChangesBytes, err := io.ReadAll(response.Body)

View file

@ -268,7 +268,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{"backup5"}
if !allowBackup {
linkCapabilities = []string{}
}
@ -328,8 +328,9 @@ func continueProvisioning(ctx context.Context, ws *websocket.Conn, provisioningC
}
var signalCapabilities = map[string]any{
"attachmentBackfill": true,
"spqr": true,
"attachmentBackfill": true,
"spqr": true,
"usernameChangeSyncMessage": true,
}
var signalCapabilitiesBody = exerrors.Must(json.Marshal(signalCapabilities))

View file

@ -180,6 +180,13 @@ func (cli *Client) sendToGroupWithSenderKey(
}
ssCiphertext, err := cli.encryptWithSenderKey(ctx, groupID, ski.DistributionID, myAddress, senderKeyRecipients, content)
if err != nil {
if errors.Is(err, libsignalgo.ErrorCodeSessionNotFound) {
log.Warn().Err(err).Msg("Got session not found error for group send from libsignal, resetting session and retrying")
if err = cli.Store.SenderKeyStore.DeleteSenderKeyInfo(ctx, groupIDStr); err != nil {
return nil, fmt.Errorf("failed to delete sender key info: %w", err)
}
return cli.sendToGroupWithSenderKey(ctx, groupID, allRecipients, sec, content, messageTimestamp, retries+1)
}
return nil, err
}
for recipientID := range ski.SharedWith {