Skip to content

Commit df6f4e1

Browse files
Merge branch 'main' into main
2 parents 1439436 + 6680c9a commit df6f4e1

27 files changed

+1504
-1018
lines changed

connectionevents.go

+9
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,15 @@ func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
152152
cli.LastSuccessfulConnect = time.Now()
153153
cli.AutoReconnectErrors = 0
154154
cli.isLoggedIn.Store(true)
155+
if cli.Store.LID.IsEmpty() {
156+
cli.Store.LID = node.AttrGetter().JID("lid")
157+
err := cli.Store.Save()
158+
if err != nil {
159+
cli.Log.Warnf("Failed to save device after updating LID: %v", err)
160+
} else {
161+
cli.Log.Infof("Updated LID to %s", cli.Store.LID)
162+
}
163+
}
155164
go func() {
156165
if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(); err != nil {
157166
cli.Log.Errorf("Failed to get number of prekeys in database: %v", err)

internals.go

+12-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

message.go

+22-31
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,6 @@ func (cli *Client) handlePlaintextMessage(info *types.MessageInfo, node *waBinar
216216
}
217217
}
218218
cli.dispatchEvent(evt.UnwrapRaw())
219-
return
220219
}
221220

222221
func (cli *Client) decryptMessages(info *types.MessageInfo, node *waBinary.Node) {
@@ -250,41 +249,33 @@ func (cli *Client) decryptMessages(info *types.MessageInfo, node *waBinary.Node)
250249
} else if info.IsGroup && encType == "skmsg" {
251250
decrypted, err = cli.decryptGroupMsg(&child, info.Sender, info.Chat)
252251
} else if encType == "msmsg" && info.Sender.IsBot() {
253-
// Meta AI / other bots (biz?):
254-
255-
// step 1: get message secret
256252
targetSenderJID := info.MsgMetaInfo.TargetSender
253+
messageSecretSenderJID := targetSenderJID
257254
if targetSenderJID.User == "" {
258-
// if no targetSenderJID in <meta> this must be ourselves (one-one-one mode)
259-
targetSenderJID = cli.getOwnID()
255+
if info.Sender.Server == types.BotServer {
256+
targetSenderJID = cli.Store.LID
257+
} else {
258+
targetSenderJID = cli.getOwnID()
259+
}
260+
messageSecretSenderJID = cli.getOwnID()
260261
}
261-
262-
messageSecret, err := cli.Store.MsgSecrets.GetMessageSecret(info.Chat, targetSenderJID, info.MsgMetaInfo.TargetID)
263-
if err != nil || messageSecret == nil {
264-
cli.Log.Warnf("Error getting message secret for bot msg with id %s", node.AttrGetter().String("id"))
265-
continue
262+
var decryptMessageID string
263+
if info.MsgBotInfo.EditType == types.EditTypeInner || info.MsgBotInfo.EditType == types.EditTypeLast {
264+
decryptMessageID = info.MsgBotInfo.EditTargetID
265+
} else {
266+
decryptMessageID = info.ID
266267
}
267-
268-
// step 2: get MessageSecretMessage
269-
byteContents := child.Content.([]byte) // <enc> contents
270268
var msMsg waE2E.MessageSecretMessage
271-
272-
err = proto.Unmarshal(byteContents, &msMsg)
273-
if err != nil {
274-
cli.Log.Warnf("Error decoding MessageSecretMesage protobuf %v", err)
275-
continue
276-
}
277-
278-
// step 3: determine best message id for decryption
279-
var messageID string
280-
if info.MsgBotInfo.EditType == types.EditTypeInner || info.MsgBotInfo.EditType == types.EditTypeLast {
281-
messageID = info.MsgBotInfo.EditTargetID
269+
var messageSecret []byte
270+
if messageSecret, err = cli.Store.MsgSecrets.GetMessageSecret(info.Chat, messageSecretSenderJID, info.MsgMetaInfo.TargetID); err != nil {
271+
err = fmt.Errorf("failed to get message secret for %s: %v", info.MsgMetaInfo.TargetID, err)
272+
} else if messageSecret == nil {
273+
err = fmt.Errorf("message secret for %s not found", info.MsgMetaInfo.TargetID)
274+
} else if err = proto.Unmarshal(child.Content.([]byte), &msMsg); err != nil {
275+
err = fmt.Errorf("failed to unmarshal MessageSecretMessage protobuf: %v", err)
282276
} else {
283-
messageID = info.ID
277+
decrypted, err = cli.decryptBotMessage(messageSecret, &msMsg, decryptMessageID, targetSenderJID, info)
284278
}
285-
286-
// step 4: decrypt and voila
287-
decrypted, err = cli.decryptBotMessage(messageSecret, &msMsg, messageID, targetSenderJID, info)
288279
} else {
289280
cli.Log.Warnf("Unhandled encrypted message (type %s) from %s", encType, info.SourceString())
290281
continue
@@ -294,7 +285,7 @@ func (cli *Client) decryptMessages(info *types.MessageInfo, node *waBinary.Node)
294285
cli.Log.Warnf("Error decrypting message from %s: %v", info.SourceString(), err)
295286
isUnavailable := encType == "skmsg" && !containsDirectMsg && errors.Is(err, signalerror.ErrNoSenderKeyForUser)
296287
// TODO figure out why @bot messages fail to decrypt
297-
if info.Chat.Server != types.BotServer {
288+
if info.Chat.Server != types.BotServer && encType != "msmsg" {
298289
go cli.sendRetryReceipt(node, info, isUnavailable)
299290
}
300291
cli.dispatchEvent(&events.UndecryptableMessage{
@@ -559,6 +550,7 @@ func (cli *Client) handleProtocolMessage(info *types.MessageInfo, msg *waE2E.Mes
559550
}
560551

561552
func (cli *Client) processProtocolParts(info *types.MessageInfo, msg *waE2E.Message) {
553+
cli.storeMessageSecret(info, msg)
562554
// Hopefully sender key distribution messages and protocol messages can't be inside ephemeral messages
563555
if msg.GetDeviceSentMessage().GetMessage() != nil {
564556
msg = msg.GetDeviceSentMessage().GetMessage()
@@ -575,7 +567,6 @@ func (cli *Client) processProtocolParts(info *types.MessageInfo, msg *waE2E.Mess
575567
if msg.GetProtocolMessage() != nil {
576568
cli.handleProtocolMessage(info, msg)
577569
}
578-
cli.storeMessageSecret(info, msg)
579570
}
580571

581572
func (cli *Client) storeMessageSecret(info *types.MessageInfo, msg *waE2E.Message) {

msgsecret.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func generateMsgSecretKey(
4949
useCaseSecret = append(useCaseSecret, modificationType...)
5050

5151
secretKey := hkdfutil.SHA256(origMsgSecret, nil, useCaseSecret, 32)
52-
additionalData := []byte(fmt.Sprintf("%s\x00%s", origMsgID, modificationSenderStr))
52+
additionalData := fmt.Appendf(nil, "%s\x00%s", origMsgID, modificationSenderStr)
5353

5454
return secretKey, additionalData
5555
}
@@ -129,7 +129,6 @@ func (cli *Client) encryptMsgSecret(chat, origSender types.JID, origMsgID types.
129129
}
130130

131131
func (cli *Client) decryptBotMessage(messageSecret []byte, msMsg messageEncryptedSecret, messageID types.MessageID, targetSenderJID types.JID, info *types.MessageInfo) ([]byte, error) {
132-
// gcm decrypt key generation
133132
newKey, additionalData := generateMsgSecretKey("", info.Sender, messageID, targetSenderJID, applyBotMessageHKDF(messageSecret))
134133

135134
plaintext, err := gcmutil.Decrypt(newKey, msMsg.GetEncIV(), msMsg.GetEncPayload(), additionalData)

pair.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,11 @@ func (cli *Client) handlePairSuccess(node *waBinary.Node) {
8282
deviceIdentityBytes, _ := pairSuccess.GetChildByTag("device-identity").Content.([]byte)
8383
businessName, _ := pairSuccess.GetChildByTag("biz").Attrs["name"].(string)
8484
jid, _ := pairSuccess.GetChildByTag("device").Attrs["jid"].(types.JID)
85+
lid, _ := pairSuccess.GetChildByTag("device").Attrs["lid"].(types.JID)
8586
platform, _ := pairSuccess.GetChildByTag("platform").Attrs["name"].(string)
8687

8788
go func() {
88-
err := cli.handlePair(deviceIdentityBytes, id, businessName, platform, jid)
89+
err := cli.handlePair(deviceIdentityBytes, id, businessName, platform, jid, lid)
8990
if err != nil {
9091
cli.Log.Errorf("Failed to pair device: %v", err)
9192
cli.Disconnect()
@@ -97,7 +98,7 @@ func (cli *Client) handlePairSuccess(node *waBinary.Node) {
9798
}()
9899
}
99100

100-
func (cli *Client) handlePair(deviceIdentityBytes []byte, reqID, businessName, platform string, jid types.JID) error {
101+
func (cli *Client) handlePair(deviceIdentityBytes []byte, reqID, businessName, platform string, jid, lid types.JID) error {
101102
var deviceIdentityContainer waAdv.ADVSignedDeviceIdentityHMAC
102103
err := proto.Unmarshal(deviceIdentityBytes, &deviceIdentityContainer)
103104
if err != nil {
@@ -153,6 +154,7 @@ func (cli *Client) handlePair(deviceIdentityBytes []byte, reqID, businessName, p
153154
}
154155

155156
cli.Store.ID = &jid
157+
cli.Store.LID = lid
156158
cli.Store.BusinessName = businessName
157159
cli.Store.Platform = platform
158160
err = cli.Store.Save()

proto/waCommon/WACommon.pb.go

+34-12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/waCommon/WACommon.pb.raw

138 Bytes
Binary file not shown.

proto/waCommon/WACommon.proto

+6-2
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,14 @@ message SubProtocol {
5454

5555
message LimitSharing {
5656
enum Trigger {
57-
CHAT_SETTING = 0;
58-
BIZ_SUPPORTS_FB_HOSTING = 1;
57+
UNKNOWN = 0;
58+
CHAT_SETTING = 1;
59+
BIZ_SUPPORTS_FB_HOSTING = 2;
60+
UNKNOWN_GROUP = 3;
5961
}
6062

6163
optional bool sharingLimited = 1;
6264
optional Trigger trigger = 2;
65+
optional int64 limitSharingSettingTimestamp = 3;
66+
optional bool initiatedByMe = 4;
6367
}

0 commit comments

Comments
 (0)