Libtransport: Rename user when he tries to connect to room from second client with different nickname than he used with first client
This commit is contained in:
parent
5c595ccf83
commit
c80c02ccb1
4 changed files with 76 additions and 30 deletions
|
@ -139,7 +139,7 @@ class Conversation {
|
||||||
void destroyRoom();
|
void destroyRoom();
|
||||||
|
|
||||||
std::string getParticipants();
|
std::string getParticipants();
|
||||||
void sendParticipants(const Swift::JID &to);
|
void sendParticipants(const Swift::JID &to, const std::string &nickname);
|
||||||
|
|
||||||
void sendCachedMessages(const Swift::JID &to = Swift::JID());
|
void sendCachedMessages(const Swift::JID &to = Swift::JID());
|
||||||
|
|
||||||
|
@ -160,6 +160,7 @@ class Conversation {
|
||||||
bool m_sentInitialPresence;
|
bool m_sentInitialPresence;
|
||||||
bool m_nicknameChanged;
|
bool m_nicknameChanged;
|
||||||
bool m_mucEscaping;
|
bool m_mucEscaping;
|
||||||
|
bool m_sentInitialSubject;
|
||||||
|
|
||||||
// TODO: Move this to some extra class to cache the most used
|
// TODO: Move this to some extra class to cache the most used
|
||||||
// rooms across different accounts. Just now if we have 10 users
|
// rooms across different accounts. Just now if we have 10 users
|
||||||
|
|
|
@ -47,6 +47,7 @@ Conversation::Conversation(ConversationManager *conversationManager, const std::
|
||||||
m_sentInitialPresence = false;
|
m_sentInitialPresence = false;
|
||||||
m_nicknameChanged = false;
|
m_nicknameChanged = false;
|
||||||
m_mucEscaping = false;
|
m_mucEscaping = false;
|
||||||
|
m_sentInitialSubject = false;
|
||||||
|
|
||||||
if (CONFIG_BOOL_DEFAULTED(conversationManager->getComponent()->getConfig(), "features.rawxml", false)) {
|
if (CONFIG_BOOL_DEFAULTED(conversationManager->getComponent()->getConfig(), "features.rawxml", false)) {
|
||||||
m_sentInitialPresence = true;
|
m_sentInitialPresence = true;
|
||||||
|
@ -128,9 +129,11 @@ void Conversation::handleRawMessage(boost::shared_ptr<Swift::Message> &message)
|
||||||
BOOST_FOREACH(const Swift::JID &jid, m_jids) {
|
BOOST_FOREACH(const Swift::JID &jid, m_jids) {
|
||||||
message->setTo(jid);
|
message->setTo(jid);
|
||||||
// Subject has to be sent after our own presence (the one with code 110)
|
// Subject has to be sent after our own presence (the one with code 110)
|
||||||
if (!message->getSubject().empty() && m_sentInitialPresence == false) {
|
if (!message->getSubject().empty()) {
|
||||||
m_subject = message;
|
m_subject = message;
|
||||||
return;
|
if (m_sentInitialPresence == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_conversationManager->getComponent()->getFrontend()->sendMessage(message);
|
m_conversationManager->getComponent()->getFrontend()->sendMessage(message);
|
||||||
}
|
}
|
||||||
|
@ -227,7 +230,33 @@ std::string Conversation::getParticipants() {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Conversation::sendParticipants(const Swift::JID &to) {
|
void Conversation::sendParticipants(const Swift::JID &to, const std::string &nickname) {
|
||||||
|
// When user tries to join this room from another resource using
|
||||||
|
// different nickname than the original one has, we have to rename
|
||||||
|
// him.
|
||||||
|
if (m_nickname != nickname && !nickname.empty()) {
|
||||||
|
Swift::Presence::ref presence;
|
||||||
|
std::string tmp = m_nickname;
|
||||||
|
|
||||||
|
// At first connect the user.
|
||||||
|
m_nickname = nickname;
|
||||||
|
presence = generatePresence(nickname, 0, (int) Swift::StatusShow::Online, "", "", "");
|
||||||
|
presence->setTo(to);
|
||||||
|
m_conversationManager->getComponent()->getFrontend()->sendPresence(presence);
|
||||||
|
|
||||||
|
// Now change his nickname to the right one.
|
||||||
|
m_nicknameChanged = true;
|
||||||
|
presence = generatePresence(nickname, 0, (int) Swift::StatusShow::Online, "", tmp, "");
|
||||||
|
presence->setTo(to);
|
||||||
|
m_conversationManager->getComponent()->getFrontend()->sendPresence(presence);
|
||||||
|
|
||||||
|
// And send the presence from as new user
|
||||||
|
m_nickname = tmp;
|
||||||
|
presence = generatePresence(m_nickname, 0, (int) Swift::StatusShow::Online, "", "", "");
|
||||||
|
presence->setTo(to);
|
||||||
|
m_conversationManager->getComponent()->getFrontend()->sendPresence(presence);
|
||||||
|
}
|
||||||
|
|
||||||
for (std::map<std::string, Participant>::iterator it = m_participants.begin(); it != m_participants.end(); it++) {
|
for (std::map<std::string, Participant>::iterator it = m_participants.begin(); it != m_participants.end(); it++) {
|
||||||
(*it).second.presence->setTo(to);
|
(*it).second.presence->setTo(to);
|
||||||
m_conversationManager->getComponent()->getFrontend()->sendPresence((*it).second.presence);
|
m_conversationManager->getComponent()->getFrontend()->sendPresence((*it).second.presence);
|
||||||
|
@ -385,9 +414,9 @@ void Conversation::handleParticipantChanged(const std::string &nick, Conversatio
|
||||||
handleParticipantChanged(newname, flag, status, statusMessage, "", iconhash);
|
handleParticipantChanged(newname, flag, status, statusMessage, "", iconhash);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_sentInitialPresence && m_subject) {
|
if (m_sentInitialPresence && !m_sentInitialSubject && m_subject) {
|
||||||
|
m_sentInitialSubject = true;
|
||||||
m_conversationManager->getComponent()->getFrontend()->sendMessage(m_subject);
|
m_conversationManager->getComponent()->getFrontend()->sendMessage(m_subject);
|
||||||
m_subject.reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We send error presences only to inform user that he is disconnected
|
// We send error presences only to inform user that he is disconnected
|
||||||
|
|
|
@ -259,7 +259,7 @@ void User::handlePresence(Swift::Presence::ref presence, bool forceJoin) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
conv->addJID(presence->getFrom());
|
conv->addJID(presence->getFrom());
|
||||||
conv->sendParticipants(presence->getFrom());
|
conv->sendParticipants(presence->getFrom(), presence->getTo().getResource());
|
||||||
conv->sendCachedMessages(presence->getFrom());
|
conv->sendCachedMessages(presence->getFrom());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -410,21 +410,29 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
||||||
injectPresence(response);
|
injectPresence(response);
|
||||||
loop->processEvents();
|
loop->processEvents();
|
||||||
|
|
||||||
CPPUNIT_ASSERT_EQUAL(4, (int) received.size());
|
CPPUNIT_ASSERT_EQUAL(7, (int) received.size());
|
||||||
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[1])));
|
CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[2])));
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hi there!"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getBody());
|
CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unavailable, dynamic_cast<Swift::Presence *>(getStanza(received[2]))->getType());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getTo().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Presence *>(getStanza(received[2]))->getTo().toString());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getFrom().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/hanzz"), dynamic_cast<Swift::Presence *>(getStanza(received[2]))->getFrom().toString());
|
||||||
|
CPPUNIT_ASSERT(getStanza(received[2])->getPayload<Swift::MUCUserPayload>());
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("nickname"), *getStanza(received[2])->getPayload<Swift::MUCUserPayload>()->getItems()[0].nick);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(303, getStanza(received[2])->getPayload<Swift::MUCUserPayload>()->getStatusCodes()[2].code);
|
||||||
|
|
||||||
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[2])));
|
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[4])));
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hi there2!"), dynamic_cast<Swift::Message *>(getStanza(received[2]))->getBody());
|
CPPUNIT_ASSERT_EQUAL(std::string("hi there!"), dynamic_cast<Swift::Message *>(getStanza(received[4]))->getBody());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[2]))->getTo().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[4]))->getTo().toString());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[2]))->getFrom().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[4]))->getFrom().toString());
|
||||||
|
|
||||||
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[3])));
|
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[5])));
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("subject"), dynamic_cast<Swift::Message *>(getStanza(received[3]))->getSubject());
|
CPPUNIT_ASSERT_EQUAL(std::string("hi there2!"), dynamic_cast<Swift::Message *>(getStanza(received[5]))->getBody());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[3]))->getTo().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[5]))->getTo().toString());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[3]))->getFrom().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[5]))->getFrom().toString());
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[6])));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("subject"), dynamic_cast<Swift::Message *>(getStanza(received[6]))->getSubject());
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[6]))->getTo().toString());
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[6]))->getFrom().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleGroupchatMessagesBouncerLeave() {
|
void handleGroupchatMessagesBouncerLeave() {
|
||||||
|
@ -479,16 +487,24 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
||||||
injectPresence(response);
|
injectPresence(response);
|
||||||
loop->processEvents();
|
loop->processEvents();
|
||||||
|
|
||||||
CPPUNIT_ASSERT_EQUAL(3, (int) received.size());
|
CPPUNIT_ASSERT_EQUAL(6, (int) received.size());
|
||||||
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[1])));
|
CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[2])));
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hi there!"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getBody());
|
CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unavailable, dynamic_cast<Swift::Presence *>(getStanza(received[2]))->getType());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getTo().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Presence *>(getStanza(received[2]))->getTo().toString());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getFrom().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/hanzz"), dynamic_cast<Swift::Presence *>(getStanza(received[2]))->getFrom().toString());
|
||||||
|
CPPUNIT_ASSERT(getStanza(received[2])->getPayload<Swift::MUCUserPayload>());
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("nickname"), *getStanza(received[2])->getPayload<Swift::MUCUserPayload>()->getItems()[0].nick);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(303, getStanza(received[2])->getPayload<Swift::MUCUserPayload>()->getStatusCodes()[2].code);
|
||||||
|
|
||||||
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[2])));
|
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[4])));
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("hi there2!"), dynamic_cast<Swift::Message *>(getStanza(received[2]))->getBody());
|
CPPUNIT_ASSERT_EQUAL(std::string("hi there!"), dynamic_cast<Swift::Message *>(getStanza(received[4]))->getBody());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[2]))->getTo().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[4]))->getTo().toString());
|
||||||
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[2]))->getFrom().toString());
|
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[4]))->getFrom().toString());
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[5])));
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("hi there2!"), dynamic_cast<Swift::Message *>(getStanza(received[5]))->getBody());
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[5]))->getTo().toString());
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast<Swift::Message *>(getStanza(received[5]))->getFrom().toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue