Software / code / prosody
Comparison
plugins/muc/muc.lib.lua @ 6134:48b6ef993888
plugins/muc/muc.lib: Move password check and nick conflict check into `handle_join`
| author | daurnimator <quae@daurnimator.com> |
|---|---|
| date | Fri, 21 Mar 2014 14:01:02 -0400 |
| parent | 6133:5d8949bb15b0 |
| child | 6135:6b061f8c6e11 |
comparison
equal
deleted
inserted
replaced
| 6133:5d8949bb15b0 | 6134:48b6ef993888 |
|---|---|
| 470 end | 470 end |
| 471 | 471 |
| 472 function room_mt:handle_join(origin, stanza) | 472 function room_mt:handle_join(origin, stanza) |
| 473 local from, to = stanza.attr.from, stanza.attr.to; | 473 local from, to = stanza.attr.from, stanza.attr.to; |
| 474 log("debug", "%s joining as %s", from, to); | 474 log("debug", "%s joining as %s", from, to); |
| 475 local password = stanza:get_child("x", "http://jabber.org/protocol/muc"); | |
| 476 password = password and password:get_child("password", "http://jabber.org/protocol/muc"); | |
| 477 password = password and password[1] ~= "" and password[1]; | |
| 478 if self:get_password() and self:get_password() ~= password then | |
| 479 log("debug", "%s couldn't join due to invalid password: %s", from, to); | |
| 480 local reply = st.error_reply(stanza, "auth", "not-authorized"):up(); | |
| 481 reply.tags[1].attr.code = "401"; | |
| 482 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); | |
| 483 return true; | |
| 484 elseif self._occupants[to] -- occupant already exists | |
| 485 and jid_bare(from) ~= jid_bare(self._occupants[to].jid) then -- and has different bare real jid | |
| 486 log("debug", "%s couldn't join due to nick conflict: %s", from, to); | |
| 487 local reply = st.error_reply(stanza, "cancel", "conflict"):up(); | |
| 488 reply.tags[1].attr.code = "409"; | |
| 489 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); | |
| 490 return true; | |
| 491 end | |
| 475 if not next(self._affiliations) then -- new room, no owners | 492 if not next(self._affiliations) then -- new room, no owners |
| 476 self._affiliations[jid_bare(from)] = "owner"; | 493 self._affiliations[jid_bare(from)] = "owner"; |
| 477 if self:is_locked() and not stanza:get_child("x", "http://jabber.org/protocol/muc") then | 494 if self:is_locked() and not stanza:get_child("x", "http://jabber.org/protocol/muc") then |
| 478 self:unlock(); -- Older groupchat protocol doesn't lock | 495 self:unlock(); -- Older groupchat protocol doesn't lock |
| 479 end | 496 end |
| 539 -- self:handle_to_occupant(origin, st.presence({type='unavailable', from=from, to=to}) | 556 -- self:handle_to_occupant(origin, st.presence({type='unavailable', from=from, to=to}) |
| 540 -- :tag('status'):text('Replaced by new connection'):up()); -- send unavailable | 557 -- :tag('status'):text('Replaced by new connection'):up()); -- send unavailable |
| 541 -- self:handle_to_occupant(origin, stanza); -- resend available | 558 -- self:handle_to_occupant(origin, stanza); -- resend available |
| 542 --end | 559 --end |
| 543 else -- enter room | 560 else -- enter room |
| 544 local new_nick = to; | 561 return self:handle_join(origin, stanza) |
| 545 if self._occupants[to] then | |
| 546 if jid_bare(from) ~= jid_bare(self._occupants[to].jid) then | |
| 547 new_nick = nil; | |
| 548 end | |
| 549 end | |
| 550 local password = stanza:get_child("x", "http://jabber.org/protocol/muc"); | |
| 551 password = password and password:get_child("password", "http://jabber.org/protocol/muc"); | |
| 552 password = password and password[1] ~= "" and password[1]; | |
| 553 if self:get_password() and self:get_password() ~= password then | |
| 554 log("debug", "%s couldn't join due to invalid password: %s", from, to); | |
| 555 local reply = st.error_reply(stanza, "auth", "not-authorized"):up(); | |
| 556 reply.tags[1].attr.code = "401"; | |
| 557 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); | |
| 558 return true; | |
| 559 elseif not new_nick then | |
| 560 log("debug", "%s couldn't join due to nick conflict: %s", from, to); | |
| 561 local reply = st.error_reply(stanza, "cancel", "conflict"):up(); | |
| 562 reply.tags[1].attr.code = "409"; | |
| 563 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); | |
| 564 return true; | |
| 565 else | |
| 566 return self:handle_join(origin, stanza) | |
| 567 end | |
| 568 end | 562 end |
| 569 end | 563 end |
| 570 | 564 |
| 571 function room_mt:handle_presence_to_occupant(origin, stanza) | 565 function room_mt:handle_presence_to_occupant(origin, stanza) |
| 572 local type = stanza.attr.type; | 566 local type = stanza.attr.type; |