Send service messages to connected full JIDs rather than one bare JID wherever possible

This commit is contained in:
Bohdan Horbeshko 2025-07-20 14:46:58 -04:00
parent f875e679da
commit 9ee13bf582
4 changed files with 19 additions and 11 deletions

View file

@ -276,7 +276,7 @@ func (c *Client) updateMessageContent(update *client.UpdateMessageContent) {
if isMUC { if isMUC {
_, jids = c.getMUCJoinedJIDs(update.ChatId, nil, true) _, jids = c.getMUCJoinedJIDs(update.ChatId, nil, true)
} else { } else {
jids = c.getCarbonFullJids(true, ignoredResource) jids = c.GetCarbonFullJids(true, ignoredResource, true)
} }
if len(jids) == 0 { if len(jids) == 0 {
log.Info("The only resource is ignored, aborting") log.Info("The only resource is ignored, aborting")
@ -419,7 +419,7 @@ func (c *Client) updateDeleteMessages(update *client.UpdateDeleteMessages) {
} }
} else { } else {
fromJid = gateway.CHATNODE(update.ChatId) fromJid = gateway.CHATNODE(update.ChatId)
jids = c.getCarbonFullJids(true, "") jids = c.GetCarbonFullJids(true, "", false)
for _, jid := range jids { for _, jid := range jids {
gateway.SendTextMessage(jid, fromJid, text, c.xmpp, isGroupchat) gateway.SendTextMessage(jid, fromJid, text, c.xmpp, isGroupchat)
} }

View file

@ -103,7 +103,9 @@ func (c *Client) wizardStageOrPrompt(stage LoginStage, message string) {
if c.loginWizard == nil { if c.loginWizard == nil {
c.locks.loginWizardWriteLock.Unlock() c.locks.loginWizardWriteLock.Unlock()
if message != "" { if message != "" {
gateway.SendServiceMessage(c.jid, message, c.xmpp) for _, jid := range c.GetCarbonFullJids(true, "", false) {
gateway.SendServiceMessage(jid, message, c.xmpp)
}
} }
} else { } else {
if !c.loginWizard.chanBusy { if !c.loginWizard.chanBusy {

View file

@ -1743,8 +1743,8 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) {
addMembers, _ := message.Content.(*client.MessageChatAddMembers) addMembers, _ := message.Content.(*client.MessageChatAddMembers)
for _, memberId := range addMembers.MemberUserIds { for _, memberId := range addMembers.MemberUserIds {
if c.me != nil && c.me.Id == memberId { if c.me != nil && c.me.Id == memberId {
for resource := range c.resourcesRange() { for _, jid := range c.GetCarbonFullJids(true, "", false) {
gateway.InviteToMUC(chatId, c.jid+"/"+resource, c.xmpp) gateway.InviteToMUC(chatId, jid, c.xmpp)
} }
} }
c.mucOccupantRolePresence(chatId, memberId, ChatMemberStatusUnmuted, c.GetMUCNickname(memberId)) c.mucOccupantRolePresence(chatId, memberId, ChatMemberStatusUnmuted, c.GetMUCNickname(memberId))
@ -1753,8 +1753,8 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) {
deleteMember, _ := message.Content.(*client.MessageChatDeleteMember) deleteMember, _ := message.Content.(*client.MessageChatDeleteMember)
c.mucOccupantRolePresence(chatId, deleteMember.UserId, ChatMemberStatusKicked, c.GetMUCNickname(deleteMember.UserId)) c.mucOccupantRolePresence(chatId, deleteMember.UserId, ChatMemberStatusKicked, c.GetMUCNickname(deleteMember.UserId))
case client.TypeMessageBasicGroupChatCreate, client.TypeMessageSupergroupChatCreate: case client.TypeMessageBasicGroupChatCreate, client.TypeMessageSupergroupChatCreate:
for resource := range c.resourcesRange() { for _, jid := range c.GetCarbonFullJids(true, "", false) {
gateway.InviteToMUC(chatId, c.jid+"/"+resource, c.xmpp) gateway.InviteToMUC(chatId, jid, c.xmpp)
} }
} }
@ -1795,7 +1795,7 @@ func (c *Client) SendMessageToGateway(chatId int64, message *client.Message, id
var originalFrom string var originalFrom string
if len(groupChatTos) == 0 { if len(groupChatTos) == 0 {
isCarbon = c.isCarbonsEnabled() && message.IsOutgoing isCarbon = c.isCarbonsEnabled() && message.IsOutgoing
jids = c.getCarbonFullJids(isCarbon, "") jids = c.GetCarbonFullJids(isCarbon, "", true)
} else { } else {
isGroupchat = true isGroupchat = true
jids = groupChatTos jids = groupChatTos
@ -2555,7 +2555,8 @@ func (c *Client) getFromOutbox(xmppId string) string {
return resource return resource
} }
func (c *Client) getCarbonFullJids(isOutgoing bool, ignoredResource string) []string { // GetCarbonFullJids builds a set of full jids or of one bare jid for outgoing stanzas
func (c *Client) GetCarbonFullJids(isOutgoing bool, ignoredResource string, forceFull bool) []string {
var jids []string var jids []string
if isOutgoing { if isOutgoing {
for resource := range c.resourcesRange() { for resource := range c.resourcesRange() {
@ -2563,6 +2564,9 @@ func (c *Client) getCarbonFullJids(isOutgoing bool, ignoredResource string) []st
jids = append(jids, c.jid+"/"+resource) jids = append(jids, c.jid+"/"+resource)
} }
} }
if len(jids) == 0 && !forceFull {
jids = []string{c.jid}
}
} else { } else {
jids = []string{c.jid} jids = []string{c.jid}
} }

View file

@ -402,9 +402,11 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) {
if msg.XMLName.Space == "jabber:component:accept" && msg.Error.Code == 401 { if msg.XMLName.Space == "jabber:component:accept" && msg.Error.Code == 401 {
suffix := "@" + msg.From suffix := "@" + msg.From
for bare := range sessions { for bare, session := range sessions {
if strings.HasSuffix(bare, suffix) { if strings.HasSuffix(bare, suffix) {
gateway.SendServiceMessage(bare, "Your server \""+msg.From+"\" does not allow to send carbons", component) for _, jid := range session.GetCarbonFullJids(true, "", false) {
gateway.SendServiceMessage(jid, "Your server \""+msg.From+"\" does not allow to send carbons", component)
}
} }
} }
} }