Преглед на файлове

Update whatsmeow and ignore events from @lid users

Tulir Asokan преди 1 година
родител
ревизия
dcd4ca366c
променени са 7 файла, в които са добавени 49 реда и са изтрити 9 реда
  1. 4 2
      database/user.go
  2. 3 0
      formatting.go
  3. 1 1
      go.mod
  4. 2 2
      go.sum
  5. 26 4
      portal.go
  6. 3 0
      puppet.go
  7. 10 0
      user.go

+ 4 - 2
database/user.go

@@ -122,14 +122,16 @@ func (user *User) usernamePtr() *string {
 
 func (user *User) agentPtr() *uint8 {
 	if !user.JID.IsEmpty() {
-		return &user.JID.Agent
+		zero := uint8(0)
+		return &zero
 	}
 	return nil
 }
 
 func (user *User) devicePtr() *uint8 {
 	if !user.JID.IsEmpty() {
-		return &user.JID.Device
+		device := uint8(user.JID.Device)
+		return &device
 	}
 	return nil
 }

+ 3 - 0
formatting.go

@@ -141,6 +141,9 @@ func (formatter *Formatter) ParseWhatsApp(roomID id.RoomID, content *event.Messa
 			continue
 		} else if jid.Server == types.LegacyUserServer {
 			jid.Server = types.DefaultUserServer
+		} else if jid.Server != types.DefaultUserServer {
+			// TODO lid support?
+			continue
 		}
 		mxid, displayname := formatter.getMatrixInfoByJID(roomID, jid)
 		number := "@" + jid.User

+ 1 - 1
go.mod

@@ -13,7 +13,7 @@ require (
 	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
 	github.com/tidwall/gjson v1.14.4
 	go.mau.fi/util v0.0.0-20230805161919-cf42c11d39c3
-	go.mau.fi/whatsmeow v0.0.0-20230804210635-04e4e3a38f73
+	go.mau.fi/whatsmeow v0.0.0-20230808115051-056c25e4b485
 	golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1
 	golang.org/x/image v0.9.0
 	golang.org/x/net v0.12.0

+ 2 - 2
go.sum

@@ -70,8 +70,8 @@ go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c=
 go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I=
 go.mau.fi/util v0.0.0-20230805161919-cf42c11d39c3 h1:r3Hrayw0CfmkrDhse7SbClYzq0e7/5P3iKpyV+gW16w=
 go.mau.fi/util v0.0.0-20230805161919-cf42c11d39c3/go.mod h1:tNxQ2KpD+QhP2MlMfJvFSGSJfDjg4OhIwP7bIK43X/I=
-go.mau.fi/whatsmeow v0.0.0-20230804210635-04e4e3a38f73 h1:JK9z+AWKvWXINSqz6wqfF67L/uUMEMJ+Mfw4sVMFnQg=
-go.mau.fi/whatsmeow v0.0.0-20230804210635-04e4e3a38f73/go.mod h1:+ObGpFE6cbbY4hKc1FmQH9MVfqaemmlXGXSnwDvCOyE=
+go.mau.fi/whatsmeow v0.0.0-20230808115051-056c25e4b485 h1:AaWJS6eKFOQ606PAvrhFeNco4hZ0ullUdQGPJ+G6HCQ=
+go.mau.fi/whatsmeow v0.0.0-20230808115051-056c25e4b485/go.mod h1:Iv3G4uv6+HWtqL7XSLRa2dSy077Bnji14IvqUbG+bRo=
 go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto=
 go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=

+ 26 - 4
portal.go

@@ -352,6 +352,10 @@ func (portal *Portal) handleMatrixMessageLoopItem(msg PortalMatrixMessage) {
 }
 
 func (portal *Portal) handleReceipt(receipt *events.Receipt, source *User) {
+	if receipt.Sender.Server != types.DefaultUserServer {
+		// TODO handle lids
+		return
+	}
 	// The order of the message ID array depends on the sender's platform, so we just have to find
 	// the last message based on timestamp. Also, timestamps only have second precision, so if
 	// there are many messages at the same second just mark them all as read, because we don't
@@ -703,6 +707,11 @@ func (portal *Portal) handleFakeMessage(msg fakeMessage) {
 		portal.log.Debugfln("Not handling %s (fake): message is duplicate", msg.ID)
 		return
 	}
+	if msg.Sender.Server != types.DefaultUserServer {
+		portal.log.Debugfln("Not handling %s (fake): message is from a lid user (%s)", msg.ID, msg.Sender)
+		// TODO handle lids
+		return
+	}
 	intent := portal.bridge.GetPuppetByJID(msg.Sender).IntentFor(portal)
 	if !intent.IsCustomPuppet && portal.IsPrivateChat() && msg.Sender.User == portal.Key.Receiver.User && portal.Key.Receiver != portal.Key.JID {
 		portal.log.Debugfln("Not handling %s (fake): user doesn't have double puppeting enabled", msg.ID)
@@ -1046,6 +1055,10 @@ func (portal *Portal) SyncParticipants(source *User, metadata *types.GroupInfo)
 	participantMap := make(map[types.JID]bool)
 	userIDs := make([]id.UserID, 0, len(metadata.Participants))
 	for _, participant := range metadata.Participants {
+		if participant.JID.IsEmpty() || participant.JID.Server != types.DefaultUserServer {
+			// TODO handle lids
+			continue
+		}
 		portal.log.Debugfln("Syncing participant %s (admin: %t)", participant.JID, participant.IsAdmin)
 		participantMap[participant.JID] = true
 		puppet := portal.bridge.GetPuppetByJID(participant.JID)
@@ -1167,7 +1180,7 @@ func (portal *Portal) UpdateAvatar(user *User, setBy types.JID, updateInfo bool)
 
 	if len(portal.MXID) > 0 {
 		intent := portal.MainIntent()
-		if !setBy.IsEmpty() {
+		if !setBy.IsEmpty() && setBy.Server == types.DefaultUserServer {
 			intent = portal.bridge.GetPuppetByJID(setBy).IntentFor(portal)
 		}
 		_, err := intent.SetRoomAvatar(portal.MXID, portal.AvatarURL)
@@ -1205,7 +1218,7 @@ func (portal *Portal) UpdateName(name string, setBy types.JID, updateInfo bool)
 			portal.UpdateBridgeInfo()
 		} else if len(portal.MXID) > 0 {
 			intent := portal.MainIntent()
-			if !setBy.IsEmpty() {
+			if !setBy.IsEmpty() && setBy.Server == types.DefaultUserServer {
 				intent = portal.bridge.GetPuppetByJID(setBy).IntentFor(portal)
 			}
 			_, err := intent.SetRoomName(portal.MXID, name)
@@ -1234,7 +1247,7 @@ func (portal *Portal) UpdateTopic(topic string, setBy types.JID, updateInfo bool
 		portal.TopicSet = false
 
 		intent := portal.MainIntent()
-		if !setBy.IsEmpty() {
+		if !setBy.IsEmpty() && setBy.Server == types.DefaultUserServer {
 			intent = portal.bridge.GetPuppetByJID(setBy).IntentFor(portal)
 		}
 		_, err := intent.SetRoomTopic(portal.MXID, topic)
@@ -1405,6 +1418,10 @@ func (portal *Portal) ChangeAdminStatus(jids []types.JID, setAdmin bool) id.Even
 	}
 	changed := portal.applyPowerLevelFixes(levels)
 	for _, jid := range jids {
+		if jid.Server != types.DefaultUserServer {
+			// TODO handle lids
+			continue
+		}
 		puppet := portal.bridge.GetPuppetByJID(jid)
 		changed = levels.EnsureUserLevel(puppet.MXID, newLevel) || changed
 
@@ -1936,7 +1953,8 @@ func (portal *Portal) addReplyMention(content *event.MessageEventContent, sender
 	if content.Mentions == nil || (sender.IsEmpty() && senderMXID == "") {
 		return
 	}
-	if senderMXID == "" {
+	// TODO handle lids
+	if senderMXID == "" && sender.Server == types.DefaultUserServer {
 		if user := portal.bridge.GetUserByJID(sender); user != nil {
 			senderMXID = user.MXID
 		} else {
@@ -3244,6 +3262,10 @@ func (portal *Portal) handleMediaRetry(retry *events.MediaRetry, source *User) {
 	} else {
 		puppet = portal.bridge.GetPuppetByJID(retry.SenderID)
 	}
+	if puppet == nil {
+		// TODO handle lids?
+		return
+	}
 	intent := puppet.IntentFor(portal)
 
 	retryData, err := whatsmeow.DecryptMediaRetryNotification(retry, meta.Media.Key)

+ 3 - 0
puppet.go

@@ -330,6 +330,9 @@ func (puppet *Puppet) updatePortalName() {
 }
 
 func (puppet *Puppet) SyncContact(source *User, onlyIfNoName, shouldHavePushName bool, reason string) {
+	if puppet == nil {
+		return
+	}
 	if onlyIfNoName && len(puppet.Displayname) > 0 && (!shouldHavePushName || puppet.NameQuality > config.NameQualityPhone) {
 		source.EnqueuePuppetResync(puppet)
 		return

+ 10 - 0
user.go

@@ -896,6 +896,9 @@ func (user *User) HandleEvent(event interface{}) {
 		user.handleCallStart(v.CallCreator, v.CallID, v.Type, v.Timestamp)
 	case *events.IdentityChange:
 		puppet := user.bridge.GetPuppetByJID(v.JID)
+		if puppet == nil {
+			return
+		}
 		portal := user.GetPortalByJID(v.JID)
 		if len(portal.MXID) > 0 && user.bridge.Config.Bridge.IdentityChangeNotices {
 			text := fmt.Sprintf("Your security code with %s changed.", puppet.Displayname)
@@ -1221,6 +1224,9 @@ const WATypingTimeout = 15 * time.Second
 
 func (user *User) handleChatPresence(presence *events.ChatPresence) {
 	puppet := user.bridge.GetPuppetByJID(presence.Sender)
+	if puppet == nil {
+		return
+	}
 	portal := user.GetPortalByJID(presence.Chat)
 	if puppet == nil || portal == nil || len(portal.MXID) == 0 {
 		return
@@ -1341,6 +1347,10 @@ func (user *User) handleGroupUpdate(evt *events.GroupInfo) {
 		log.Debug().Msg("Ignoring group info update in chat with no portal")
 		return
 	}
+	if evt.Sender != nil && evt.Sender.Server == types.HiddenUserServer {
+		log.Debug().Str("sender", evt.Sender.String()).Msg("Ignoring group info update from @lid user")
+		return
+	}
 	switch {
 	case evt.Announce != nil:
 		log.Debug().Msg("Group announcement mode (message send permission) changed")