From b8a57c06b646edbad340c9e1c6c79e11a8a666e3 Mon Sep 17 00:00:00 2001 From: Bohdan Horbeshko Date: Sat, 30 Sep 2023 06:29:40 -0400 Subject: [PATCH] Handle MUC PM attempts --- xmpp/gateway/gateway.go | 29 ++++++++++++++++----------- xmpp/handlers.go | 43 +++++++++++++++++++++++++++-------------- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/xmpp/gateway/gateway.go b/xmpp/gateway/gateway.go index 09cd42f..1a37cc7 100644 --- a/xmpp/gateway/gateway.go +++ b/xmpp/gateway/gateway.go @@ -44,35 +44,40 @@ var MessageOutgoingPermissionVersion = 0 // SendMessage creates and sends a message stanza func SendMessage(to, from, body, id string, component *xmpp.Component, reply *Reply, timestamp int64, isCarbon, isGroupchat bool, originalFrom string) { - sendMessageWrapper(to, from, body, "", id, component, reply, timestamp, "", isCarbon, isGroupchat, false, originalFrom, 0) + sendMessageWrapper(to, from, body, "", "", id, component, reply, timestamp, "", isCarbon, isGroupchat, false, originalFrom, 0) } // SendServiceMessage creates and sends a simple message stanza from transport func SendServiceMessage(to, body string, component *xmpp.Component) { - sendMessageWrapper(to, "", body, "", "", component, nil, 0, "", false, false, false, "", 0) + sendMessageWrapper(to, "", body, "", "", "", component, nil, 0, "", false, false, false, "", 0) } // SendTextMessage creates and sends a simple message stanza func SendTextMessage(to, from, body string, component *xmpp.Component) { - sendMessageWrapper(to, from, body, "", "", component, nil, 0, "", false, false, false, "", 0) + sendMessageWrapper(to, from, body, "", "", "", component, nil, 0, "", false, false, false, "", 0) } // SendErrorMessage creates and sends an error message stanza func SendErrorMessage(to, from, text string, code int, isGroupchat bool, component *xmpp.Component) { - sendMessageWrapper(to, from, text, "", "", component, nil, 0, "", false, isGroupchat, false, "", code) + sendMessageWrapper(to, from, "", "", text, "", component, nil, 0, "", false, isGroupchat, false, "", code) +} + +// SendErrorMessageWithBody creates and sends an error message stanza with body payload +func SendErrorMessageWithBody(to, from, body, errorText, id string, code int, isGroupchat bool, component *xmpp.Component) { + sendMessageWrapper(to, from, body, "", errorText, id, component, nil, 0, "", false, isGroupchat, false, "", code) } // SendMessageWithOOB creates and sends a message stanza with OOB URL func SendMessageWithOOB(to, from, body, id string, component *xmpp.Component, reply *Reply, timestamp int64, oob string, isCarbon, isGroupchat bool, originalFrom string) { - sendMessageWrapper(to, from, body, "", id, component, reply, timestamp, oob, isCarbon, isGroupchat, false, originalFrom, 0) + sendMessageWrapper(to, from, body, "", "", id, component, reply, timestamp, oob, isCarbon, isGroupchat, false, originalFrom, 0) } // SendSubjectMessage creates and sends a MUC subject func SendSubjectMessage(to, from, subject, id string, component *xmpp.Component, timestamp int64) { - sendMessageWrapper(to, from, "", subject, id, component, nil, timestamp, "", false, true, true, "", 0) + sendMessageWrapper(to, from, "", subject, "", id, component, nil, timestamp, "", false, true, true, "", 0) } -func sendMessageWrapper(to, from, body, subject, id string, component *xmpp.Component, reply *Reply, timestamp int64, oob string, isCarbon, isGroupchat, forceSubject bool, originalFrom string, errorCode int) { +func sendMessageWrapper(to, from, body, subject, errorText, id string, component *xmpp.Component, reply *Reply, timestamp int64, oob string, isCarbon, isGroupchat, forceSubject bool, originalFrom string, errorCode int) { toJid, err := stanza.NewJid(to) if err != nil { log.WithFields(log.Fields{ @@ -128,13 +133,12 @@ func sendMessageWrapper(to, from, body, subject, id string, component *xmpp.Comp Id: id, }, Subject: subject, + Body: body, } - if errorCode == 0 { - message.Body = body - } else { + if errorCode != 0 { message.Error = stanza.Err{ Code: errorCode, - Text: body, + Text: errorText, } switch errorCode { case 400: @@ -146,6 +150,9 @@ func sendMessageWrapper(to, from, body, subject, id string, component *xmpp.Comp case 404: message.Error.Type = stanza.ErrorTypeCancel message.Error.Reason = "item-not-found" + case 406: + message.Error.Type = stanza.ErrorTypeModify + message.Error.Reason = "not-acceptable" case 500: message.Error.Type = stanza.ErrorTypeWait message.Error.Reason = "internal-server-error" diff --git a/xmpp/handlers.go b/xmpp/handlers.go index 72b46eb..3ab79c7 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -123,6 +123,26 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) { toID, ok := toToID(msg.To) if ok { + toJid, err := stanza.NewJid(msg.To) + if err != nil { + log.Error("Invalid to JID!") + return + } + + isGroupchat := msg.Type == "groupchat" + + if session.Session.MUC && toJid.Resource != "" { + chat, _, err := session.GetContactByID(toID, nil) + if err == nil && session.IsGroup(chat) { + if isGroupchat { + gateway.SendErrorMessageWithBody(msg.From, msg.To, msg.Body, "", msg.Id, 400, true, component) + } else { + gateway.SendErrorMessage(msg.From, msg.To, "PMing room members is not supported, use the real JID", 406, true, component) + } + return + } + } + var reply extensions.Reply var fallback extensions.Fallback var replace extensions.Replace @@ -134,7 +154,6 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) { log.Debugf("replace: %#v", replace) var replyId int64 - var err error text := msg.Body if len(reply.Id) > 0 { chatId, msgId, err := gateway.IdsDB.GetByXmppId(session.Session.Login, bare, reply.Id) @@ -194,7 +213,6 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) { return } } - isGroupchat := msg.Type == "groupchat" session.SendMessageLock.Lock() defer session.SendMessageLock.Unlock() @@ -215,18 +233,15 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) { } // pong groupchat messages back - if isGroupchat { - toJid, err := stanza.NewJid(msg.To) - if err == nil && toJid.Resource == "" { - session.SendMessageToGateway( - toID, - tgMessage, - msg.Id, - false, - msg.To + "/" + session.GetMUCNickname(session.GetSenderId(tgMessage)), - []string{msg.From}, - ) - } + if isGroupchat && toJid.Resource == "" { + session.SendMessageToGateway( + toID, + tgMessage, + msg.Id, + false, + msg.To + "/" + session.GetMUCNickname(session.GetSenderId(tgMessage)), + []string{msg.From}, + ) } } else { /*