diff --git a/telegram/utils.go b/telegram/utils.go index 935beb7..d32d69d 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -648,6 +648,13 @@ func (c *Client) sendMUCSubject(chatID int64, resource string) { // GetMUCNickname generates a unique nickname for a MUC member 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) } diff --git a/xmpp/handlers.go b/xmpp/handlers.go index a82d315..7a499e7 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -847,6 +847,7 @@ func handleGetDiscoInfo(s xmpp.Sender, iq *stanza.IQ, di *stanza.DiscoInfo) { "muc_nonanonymous", "muc_unsecured", "http://jabber.org/protocol/muc#stable_id", + "jabber:iq:register", ) fields := []*stanza.Field{ &stanza.Field{ @@ -995,33 +996,56 @@ func handleGetQueryRegister(s xmpp.Sender, iq *stanza.IQ) { } defer gateway.ResumableSend(component, answer) - var login string + _, toOk, toIsGroup := toToID(iq.To) + bare, _, ok := gateway.SplitJID(iq.From) + var session *telegram.Client + var sessionOk bool if ok { - session, ok := sessions[bare] - if ok { - login = session.Session.Login - } + session, sessionOk = sessions[bare] } - var query stanza.IQPayload - if login == "" { - query = extensions.QueryRegister{ - Instructions: fmt.Sprintf("Authorization in Telegram is a multi-step process, so please accept %v to your contacts and follow further instructions (provide the authentication code there, etc.).\nFor now, please provide your login.", iq.To), + 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 { - query = extensions.QueryRegister{ - Instructions: "Already logged in", - Username: login, - Registered: &extensions.QueryRegisterRegistered{}, + var login string + if sessionOk { + login = session.Session.Login } - } - answer.Payload = query - log.Debugf("%#v", query) + var query stanza.IQPayload + if login == "" { + query = extensions.QueryRegister{ + Instructions: fmt.Sprintf("Authorization in Telegram is a multi-step process, so please accept %v to your contacts and follow further instructions (provide the authentication code there, etc.).\nFor now, please provide your login.", iq.To), + } + } else { + query = extensions.QueryRegister{ + Instructions: "Already logged in", + Username: login, + Registered: &extensions.QueryRegisterRegistered{}, + } + } + answer.Payload = query - if login == "" { - gateway.SubscribeToTransport(component, iq.From) + log.Debugf("%#v", query) + + if login == "" { + gateway.SubscribeToTransport(component, iq.From) + } } } @@ -1032,6 +1056,12 @@ func handleSetQueryRegister(s xmpp.Sender, iq *stanza.IQ, query *extensions.Quer } defer gateway.ResumableSend(component, answer) + _, toOk, _ := toToID(iq.To) + if toOk { + iqAnswerSetError(answer, query, 400) + return + } + if query.Remove != nil { iqAnswerSetError(answer, query, 405) return @@ -1477,6 +1507,13 @@ func iqAnswerSetError(answer *stanza.IQ, payload *extensions.QueryRegister, code Type: stanza.ErrorTypeModify, Reason: "bad-request", } + case 404: + answer.Error = &stanza.Err{ + Code: code, + Type: stanza.ErrorTypeCancel, + Reason: "item-not-found", + Text: "No such room", + } case 405: answer.Error = &stanza.Err{ Code: code,