Process MUC registration requests

This commit is contained in:
Bohdan Horbeshko 2025-05-14 10:47:41 -04:00
parent 46ecab1db5
commit dd00abe977
2 changed files with 62 additions and 18 deletions

View file

@ -648,6 +648,13 @@ func (c *Client) sendMUCSubject(chatID int64, resource string) {
// GetMUCNickname generates a unique nickname for a MUC member // GetMUCNickname generates a unique nickname for a MUC member
func (c *Client) GetMUCNickname(chatID int64) string { func (c *Client) GetMUCNickname(chatID int64) string {
if chatID == 0 {
if c.me != nil {
chatID = c.me.Id
} else {
return "me"
}
}
return c.FormatContact(chatID) return c.FormatContact(chatID)
} }

View file

@ -847,6 +847,7 @@ func handleGetDiscoInfo(s xmpp.Sender, iq *stanza.IQ, di *stanza.DiscoInfo) {
"muc_nonanonymous", "muc_nonanonymous",
"muc_unsecured", "muc_unsecured",
"http://jabber.org/protocol/muc#stable_id", "http://jabber.org/protocol/muc#stable_id",
"jabber:iq:register",
) )
fields := []*stanza.Field{ fields := []*stanza.Field{
&stanza.Field{ &stanza.Field{
@ -995,13 +996,35 @@ func handleGetQueryRegister(s xmpp.Sender, iq *stanza.IQ) {
} }
defer gateway.ResumableSend(component, answer) defer gateway.ResumableSend(component, answer)
var login string _, toOk, toIsGroup := toToID(iq.To)
bare, _, ok := gateway.SplitJID(iq.From) bare, _, ok := gateway.SplitJID(iq.From)
var session *telegram.Client
var sessionOk bool
if ok { if ok {
session, ok := sessions[bare] session, sessionOk = sessions[bare]
if ok {
login = session.Session.Login
} }
if toOk {
if toIsGroup {
nickname := "me"
if sessionOk {
nickname = session.GetMUCNickname(0)
}
answer.Payload = extensions.QueryRegister{
Instructions: "MUC username is static",
Username: nickname,
Registered: &extensions.QueryRegisterRegistered{},
}
} else {
query := extensions.QueryRegister{}
iqAnswerSetError(answer, &query, 404)
return
}
} else {
var login string
if sessionOk {
login = session.Session.Login
} }
var query stanza.IQPayload var query stanza.IQPayload
@ -1023,6 +1046,7 @@ func handleGetQueryRegister(s xmpp.Sender, iq *stanza.IQ) {
if login == "" { if login == "" {
gateway.SubscribeToTransport(component, iq.From) gateway.SubscribeToTransport(component, iq.From)
} }
}
} }
func handleSetQueryRegister(s xmpp.Sender, iq *stanza.IQ, query *extensions.QueryRegister) { func handleSetQueryRegister(s xmpp.Sender, iq *stanza.IQ, query *extensions.QueryRegister) {
@ -1032,6 +1056,12 @@ func handleSetQueryRegister(s xmpp.Sender, iq *stanza.IQ, query *extensions.Quer
} }
defer gateway.ResumableSend(component, answer) defer gateway.ResumableSend(component, answer)
_, toOk, _ := toToID(iq.To)
if toOk {
iqAnswerSetError(answer, query, 400)
return
}
if query.Remove != nil { if query.Remove != nil {
iqAnswerSetError(answer, query, 405) iqAnswerSetError(answer, query, 405)
return return
@ -1477,6 +1507,13 @@ func iqAnswerSetError(answer *stanza.IQ, payload *extensions.QueryRegister, code
Type: stanza.ErrorTypeModify, Type: stanza.ErrorTypeModify,
Reason: "bad-request", Reason: "bad-request",
} }
case 404:
answer.Error = &stanza.Err{
Code: code,
Type: stanza.ErrorTypeCancel,
Reason: "item-not-found",
Text: "No such room",
}
case 405: case 405:
answer.Error = &stanza.Err{ answer.Error = &stanza.Err{
Code: code, Code: code,