Reject MUC nickname change attempts
This commit is contained in:
parent
1e7e761c6c
commit
4972cb6d5e
|
@ -478,6 +478,39 @@ func (c *Client) updateMUCsNickname(memberID int64, newNickname string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MUCHasResource checks if a MUC was joined from a given resource
|
||||||
|
func (c *Client) MUCHasResource(chatID int64, resource string) bool {
|
||||||
|
c.locks.mucCacheLock.Lock()
|
||||||
|
defer c.locks.mucCacheLock.Unlock()
|
||||||
|
|
||||||
|
mucState, ok := c.mucCache[chatID]
|
||||||
|
if !ok || mucState == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
_, ok = mucState.Resources[resource]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMyMUCNickname obtains this account's nickname in a given MUC
|
||||||
|
func (c *Client) GetMyMUCNickname(chatID int64) (string, bool) {
|
||||||
|
if c.me == nil {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
c.locks.mucCacheLock.Lock()
|
||||||
|
defer c.locks.mucCacheLock.Unlock()
|
||||||
|
|
||||||
|
mucState, ok := c.mucCache[chatID]
|
||||||
|
if !ok || mucState == nil {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
member, ok := mucState.Members[c.me.Id]
|
||||||
|
if !ok {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
return member.Nickname, true
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) formatContact(chatID int64) string {
|
func (c *Client) formatContact(chatID int64) string {
|
||||||
if chatID == 0 {
|
if chatID == 0 {
|
||||||
return ""
|
return ""
|
||||||
|
|
|
@ -324,7 +324,9 @@ func HandlePresence(s xmpp.Sender, p stanza.Packet) {
|
||||||
prs.Get(&mucExt)
|
prs.Get(&mucExt)
|
||||||
if mucExt.XMLName.Space != "" {
|
if mucExt.XMLName.Space != "" {
|
||||||
handleMUCPresence(s, prs, mucExt)
|
handleMUCPresence(s, prs, mucExt)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
tryHandleMUCNicknameChange(s, prs)
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleSubscription(s xmpp.Sender, p stanza.Presence) {
|
func handleSubscription(s xmpp.Sender, p stanza.Presence) {
|
||||||
|
@ -498,6 +500,77 @@ func handleMUCPresence(s xmpp.Sender, p stanza.Presence, mucExt stanza.MucPresen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tryHandleMUCNicknameChange(s xmpp.Sender, p stanza.Presence) {
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"type": p.Type,
|
||||||
|
"from": p.From,
|
||||||
|
"to": p.To,
|
||||||
|
}).Warn("Nickname change presence?")
|
||||||
|
log.Debugf("%#v", p)
|
||||||
|
|
||||||
|
if p.Type != "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
toBare, nickname, ok := gateway.SplitJID(p.To)
|
||||||
|
if !ok || nickname == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fromBare, fromResource, ok := gateway.SplitJID(p.From)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
session, ok := sessions[fromBare]
|
||||||
|
if !ok || !session.Session.MUC {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
chatId, ok := toToID(toBare)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
chat, _, err := session.GetContactByID(chatId, nil)
|
||||||
|
if err != nil || !session.IsGroup(chat) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !session.MUCHasResource(chatId, fromResource) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Warn("🗿 Yes")
|
||||||
|
|
||||||
|
component, ok := s.(*xmpp.Component)
|
||||||
|
if !ok {
|
||||||
|
log.Error("Not a component")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
from := toBare
|
||||||
|
nickname, ok = session.GetMyMUCNickname(chatId)
|
||||||
|
if ok {
|
||||||
|
from = from+"/"+nickname
|
||||||
|
}
|
||||||
|
reply := &stanza.Presence{
|
||||||
|
Attrs: stanza.Attrs{
|
||||||
|
From: from,
|
||||||
|
To: p.From,
|
||||||
|
Id: p.Id,
|
||||||
|
Type: stanza.PresenceTypeError,
|
||||||
|
},
|
||||||
|
Error: stanza.Err{
|
||||||
|
Code: 406,
|
||||||
|
Type: stanza.ErrorTypeModify,
|
||||||
|
Reason: "not-acceptable",
|
||||||
|
Text: "Telegram does not support changing nicknames per-chat. Issue a /setname command to the transport if you wish to change the global name",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
gateway.ResumableSend(component, reply)
|
||||||
|
}
|
||||||
|
|
||||||
func handleGetVcardIq(s xmpp.Sender, iq *stanza.IQ, typ byte) {
|
func handleGetVcardIq(s xmpp.Sender, iq *stanza.IQ, typ byte) {
|
||||||
log.WithFields(log.Fields{
|
log.WithFields(log.Fields{
|
||||||
"from": iq.From,
|
"from": iq.From,
|
||||||
|
|
Loading…
Reference in a new issue