Comparison

plugins/muc/muc.lib.lua @ 7706:d92e186c2a1c

MUC: Include the appropriate status code if nickname is changed during join process
author Kim Alvefur <zash@zash.se>
date Wed, 26 Oct 2016 13:10:22 +0200
parent 7705:0a29a5e64f1d
child 7958:47cb54a08336
comparison
equal deleted inserted replaced
7705:0a29a5e64f1d 7706:d92e186c2a1c
400 -- TODO Handle this case sensibly 400 -- TODO Handle this case sensibly
401 if not stanza:get_child("x", "http://jabber.org/protocol/muc") then 401 if not stanza:get_child("x", "http://jabber.org/protocol/muc") then
402 module:log("debug", "Room creation without <x>, possibly desynced"); 402 module:log("debug", "Room creation without <x>, possibly desynced");
403 end 403 end
404 404
405 local orig_nick = dest_occupant.nick;
405 if module:fire_event("muc-occupant-pre-join", { 406 if module:fire_event("muc-occupant-pre-join", {
406 room = self; 407 room = self;
407 origin = origin; 408 origin = origin;
408 stanza = stanza; 409 stanza = stanza;
409 is_first_session = is_first_dest_session; 410 is_first_session = is_first_dest_session;
410 is_new_room = true; 411 is_new_room = true;
411 occupant = dest_occupant; 412 occupant = dest_occupant;
412 }) then return true; end 413 }) then return true; end
414 local nick_changed = orig_nick ~= dest_occupant.nick;
413 415
414 dest_occupant:set_session(real_jid, stanza); 416 dest_occupant:set_session(real_jid, stanza);
415 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); 417 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
416 dest_x:tag("status", {code = "201"}):up(); 418 dest_x:tag("status", {code = "201"}):up();
417 if self:get_whois() == "anyone" then 419 if self:get_whois() == "anyone" then
418 dest_x:tag("status", {code = "100"}):up(); 420 dest_x:tag("status", {code = "100"}):up();
419 end 421 end
422 local self_x;
423 if nick_changed then
424 self_x = st.clone(dest_x);
425 self_x:tag("status", {code = "210"}):up();
426 end
420 self:save_occupant(dest_occupant); 427 self:save_occupant(dest_occupant);
421 428
422 self:publicise_occupant_status(dest_occupant, dest_x); 429 self:publicise_occupant_status(dest_occupant, {base = dest_x, self = self_x});
423 430
424 module:fire_event("muc-occupant-joined", { 431 module:fire_event("muc-occupant-joined", {
425 room = self; 432 room = self;
426 nick = dest_occupant.nick; 433 nick = dest_occupant.nick;
427 occupant = dest_occupant; 434 occupant = dest_occupant;
483 module:log("debug", "Join without <x>, possibly desynced"); 490 module:log("debug", "Join without <x>, possibly desynced");
484 elseif orig_occupant ~= nil and muc_x then 491 elseif orig_occupant ~= nil and muc_x then
485 module:log("debug", "Presence update with <x>, possibly desynced"); 492 module:log("debug", "Presence update with <x>, possibly desynced");
486 end 493 end
487 494
495 local orig_nick = dest_occupant and dest_occupant.nick;
496
488 local event, event_name = { 497 local event, event_name = {
489 room = self; 498 room = self;
490 origin = origin; 499 origin = origin;
491 stanza = stanza; 500 stanza = stanza;
492 is_first_session = is_first_dest_session; 501 is_first_session = is_first_dest_session;
503 event.orig_occupant = orig_occupant; 512 event.orig_occupant = orig_occupant;
504 event.dest_occupant = dest_occupant; 513 event.dest_occupant = dest_occupant;
505 end 514 end
506 if module:fire_event(event_name, event) then return true; end 515 if module:fire_event(event_name, event) then return true; end
507 516
517 local nick_changed = dest_occupant and orig_nick ~= dest_occupant.nick;
518
508 -- Check for nick conflicts 519 -- Check for nick conflicts
509 if dest_occupant ~= nil and not is_first_dest_session and bare_jid ~= jid_bare(dest_occupant.bare_jid) then -- new nick or has different bare real jid 520 if dest_occupant ~= nil and not is_first_dest_session and bare_jid ~= jid_bare(dest_occupant.bare_jid) then -- new nick or has different bare real jid
510 log("debug", "%s couldn't join due to nick conflict: %s", real_jid, dest_occupant.nick); 521 log("debug", "%s couldn't join due to nick conflict: %s", real_jid, dest_occupant.nick);
511 local reply = st.error_reply(stanza, "cancel", "conflict"):up(); 522 local reply = st.error_reply(stanza, "cancel", "conflict"):up();
512 reply.tags[1].attr.code = "409"; 523 reply.tags[1].attr.code = "409";
584 self:send_occupant_list(real_jid, function(nick, occupant) -- luacheck: ignore 212 595 self:send_occupant_list(real_jid, function(nick, occupant) -- luacheck: ignore 212
585 -- Don't include self 596 -- Don't include self
586 return occupant:get_presence(real_jid) == nil; 597 return occupant:get_presence(real_jid) == nil;
587 end) 598 end)
588 end 599 end
589 self:publicise_occupant_status(dest_occupant, dest_x); 600 local self_x;
601 if nick_changed then
602 self_x = st.clone(dest_x);
603 self_x:tag("status", {code="210"}):up();
604 end
605 self:publicise_occupant_status(dest_occupant, {base=dest_x,self=self_x});
590 606
591 if orig_occupant ~= nil and orig_occupant ~= dest_occupant and not is_last_orig_session then -- If user is swapping and wasn't last original session 607 if orig_occupant ~= nil and orig_occupant ~= dest_occupant and not is_last_orig_session then -- If user is swapping and wasn't last original session
592 log("debug", "session %s split nicks; showing %s rejoining", real_jid, orig_occupant.nick); 608 log("debug", "session %s split nicks; showing %s rejoining", real_jid, orig_occupant.nick);
593 -- Show the original nick joining again 609 -- Show the original nick joining again
594 local pr = st.clone(orig_occupant:get_presence()); 610 local pr = st.clone(orig_occupant:get_presence());