Skip to content

Commit

Permalink
signalmeow/sending: set urgent flag and content hint properly
Browse files Browse the repository at this point in the history
  • Loading branch information
tulir committed Sep 24, 2024
1 parent ce665b2 commit 4727da4
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 9 deletions.
4 changes: 2 additions & 2 deletions pkg/libsignalgo/sealedsender.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func NewSealedSenderAddress(e164 string, uuid uuid.UUID, deviceID uint32) *Seale
}
}

func SealedSenderEncryptPlaintext(ctx context.Context, message []byte, 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) ([]byte, error) {
ciphertextMessage, err := Encrypt(ctx, message, forAddress, sessionStore, identityStore)
if err != nil {
return nil, err
Expand All @@ -51,7 +51,7 @@ func SealedSenderEncryptPlaintext(ctx context.Context, message []byte, forAddres
usmc, err := NewUnidentifiedSenderMessageContent(
ciphertextMessage,
fromSenderCert,
UnidentifiedSenderMessageContentHintDefault,
contentHint,
nil,
)
if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions pkg/libsignalgo/session_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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, bobAddress, senderCert, aliceStore, aliceStore)
ciphertext, err := libsignalgo.SealedSenderEncryptPlaintext(ctx, message, libsignalgo.UnidentifiedSenderMessageContentHintDefault, bobAddress, senderCert, aliceStore, aliceStore)
require.NoError(t, err)
assert.NotNil(t, ciphertext)
}
Expand Down Expand Up @@ -279,7 +279,7 @@ func TestSealedSenderSession(t *testing.T) {
assert.NoError(t, err)

message := []byte("2020 vision")
ciphertext, err := libsignalgo.SealedSenderEncryptPlaintext(ctx, message, bobAddress, senderCert, aliceStore, aliceStore)
ciphertext, err := libsignalgo.SealedSenderEncryptPlaintext(ctx, message, libsignalgo.UnidentifiedSenderMessageContentHintDefault, bobAddress, senderCert, aliceStore, aliceStore)
require.NoError(t, err)
assert.NotNil(t, ciphertext)

Expand Down
34 changes: 29 additions & 5 deletions pkg/signalmeow/sending.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ type MyMessage struct {
}

type MyMessages struct {
Timestamp int64 `json:"timestamp"`
Timestamp uint64 `json:"timestamp"`
Online bool `json:"online"`
Urgent bool `json:"urgent"`
Messages []MyMessage `json:"messages"`
Expand Down Expand Up @@ -212,7 +212,7 @@ func (cli *Client) buildMessagesToSend(ctx context.Context, recipient libsignalg
var envelopeType int
var encryptedPayload []byte
if unauthenticated {
envelopeType, encryptedPayload, err = cli.buildSSMessageToSend(ctx, recipientAddress, paddedMessage)
envelopeType, encryptedPayload, err = cli.buildSSMessageToSend(ctx, recipientAddress, paddedMessage, getContentHint(content))
} else {
envelopeType, encryptedPayload, err = cli.buildAuthedMessageToSend(ctx, recipientAddress, paddedMessage)
}
Expand Down Expand Up @@ -264,14 +264,15 @@ func (cli *Client) buildAuthedMessageToSend(ctx context.Context, recipientAddres
return envelopeType, encryptedPayload, nil
}

func (cli *Client) buildSSMessageToSend(ctx context.Context, recipientAddress *libsignalgo.Address, paddedMessage []byte) (envelopeType int, encryptedPayload []byte, err error) {
func (cli *Client) buildSSMessageToSend(ctx context.Context, recipientAddress *libsignalgo.Address, paddedMessage []byte, contentHint libsignalgo.UnidentifiedSenderMessageContentHint) (envelopeType int, encryptedPayload []byte, err error) {
cert, err := cli.senderCertificate(ctx)
if err != nil {
return 0, nil, err
}
encryptedPayload, err = libsignalgo.SealedSenderEncryptPlaintext(
ctx,
paddedMessage,
contentHint,
recipientAddress,
cert,
cli.Store.ACISessionStore,
Expand Down Expand Up @@ -782,6 +783,29 @@ func currentMessageTimestamp() uint64 {
return uint64(time.Now().UnixMilli())
}

func isSyncMessageUrgent(content *signalpb.SyncMessage) bool {
return content.Sent != nil || content.Request != nil
}

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 getContentHint(content *signalpb.Content) libsignalgo.UnidentifiedSenderMessageContentHint {
if content.DataMessage != nil || content.EditMessage != nil {
// TODO add support for resending before setting this
//return libsignalgo.UnidentifiedSenderMessageContentHintResendable
}
if content.TypingMessage != nil || content.ReceiptMessage != nil {
return libsignalgo.UnidentifiedSenderMessageContentHintImplicit
}
return libsignalgo.UnidentifiedSenderMessageContentHintDefault
}

func (cli *Client) sendContent(
ctx context.Context,
recipient libsignalgo.ServiceID,
Expand Down Expand Up @@ -845,9 +869,9 @@ func (cli *Client) sendContent(
}

outgoingMessages := MyMessages{
Timestamp: int64(messageTimestamp),
Timestamp: messageTimestamp,
Online: false,
Urgent: true,
Urgent: isUrgent(content),
Messages: messages,
}
jsonBytes, err := json.Marshal(outgoingMessages)
Expand Down

0 comments on commit 4727da4

Please sign in to comment.