Communi: Log 4xx errors and forward 433, 436 and 464 to XMPP client
This commit is contained in:
parent
1af263f488
commit
65ad5a2106
4 changed files with 90 additions and 13 deletions
|
@ -272,6 +272,22 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) {
|
|||
case 432:
|
||||
np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Erroneous Nickname");
|
||||
break;
|
||||
case 433:
|
||||
for(AutoJoinMap::iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) {
|
||||
np->handleParticipantChanged(user, TO_UTF8(nickName()), it->second->getChannel() + suffix, pbnetwork::PARTICIPANT_FLAG_CONFLICT);
|
||||
}
|
||||
np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Nickname is already in use");
|
||||
break;
|
||||
case 436:
|
||||
for(AutoJoinMap::iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) {
|
||||
np->handleParticipantChanged(user, TO_UTF8(nickName()), it->second->getChannel() + suffix, pbnetwork::PARTICIPANT_FLAG_CONFLICT);
|
||||
}
|
||||
np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Nickname collision KILL");
|
||||
case 464:
|
||||
for(AutoJoinMap::iterator it = m_autoJoin.begin(); it != m_autoJoin.end(); it++) {
|
||||
np->handleParticipantChanged(user, TO_UTF8(nickName()), it->second->getChannel() + suffix, pbnetwork::PARTICIPANT_FLAG_NOT_AUTHORIZED);
|
||||
}
|
||||
np->handleDisconnected(user, pbnetwork::CONNECTION_ERROR_INVALID_USERNAME, "Password incorrect");
|
||||
case 321:
|
||||
m_rooms.clear();
|
||||
m_names.clear();
|
||||
|
@ -287,6 +303,10 @@ void MyIrcSession::on_numericMessageReceived(IrcMessage *message) {
|
|||
break;
|
||||
}
|
||||
|
||||
if (m->code() >= 400 && m->code() < 500) {
|
||||
LOG4CXX_INFO(logger, user << ": Error message received: " << message->toData().data());
|
||||
}
|
||||
|
||||
//qDebug() << "numeric message received:" << receiver() << origin << code << params;
|
||||
}
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include "Swiften/Elements/MUCOccupant.h"
|
||||
#include "Swiften/Elements/MUCUserPayload.h"
|
||||
#include "Swiften/Elements/Delay.h"
|
||||
#include "Swiften/Elements/MUCPayload.h"
|
||||
|
||||
namespace Transport {
|
||||
|
||||
|
@ -230,13 +231,29 @@ Swift::Presence::ref Conversation::generatePresence(const std::string &nick, int
|
|||
|
||||
Swift::MUCUserPayload *p = new Swift::MUCUserPayload ();
|
||||
if (m_nickname == nickname) {
|
||||
Swift::MUCUserPayload::StatusCode c;
|
||||
c.code = 110;
|
||||
p->addStatusCode(c);
|
||||
m_sentInitialPresence = true;
|
||||
if (flag & PARTICIPANT_FLAG_CONFLICT) {
|
||||
delete p;
|
||||
presence->setType(Swift::Presence::Error);
|
||||
presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::MUCPayload()));
|
||||
presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::ErrorPayload(Swift::ErrorPayload::Conflict)));
|
||||
return presence;
|
||||
}
|
||||
else if (flag & PARTICIPANT_FLAG_NOT_AUTHORIZED) {
|
||||
delete p;
|
||||
presence->setType(Swift::Presence::Error);
|
||||
presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::MUCPayload()));
|
||||
presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::ErrorPayload(Swift::ErrorPayload::NotAuthorized, Swift::ErrorPayload::Auth)));
|
||||
return presence;
|
||||
}
|
||||
else {
|
||||
Swift::MUCUserPayload::StatusCode c;
|
||||
c.code = 110;
|
||||
p->addStatusCode(c);
|
||||
m_sentInitialPresence = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Swift::MUCItem item;
|
||||
|
||||
item.affiliation = Swift::MUCOccupant::Member;
|
||||
|
@ -254,7 +271,7 @@ Swift::Presence::ref Conversation::generatePresence(const std::string &nick, int
|
|||
p->addStatusCode(c);
|
||||
presence->setType(Swift::Presence::Unavailable);
|
||||
}
|
||||
|
||||
|
||||
p->addItem(item);
|
||||
presence->addPayload(boost::shared_ptr<Swift::Payload>(p));
|
||||
return presence;
|
||||
|
|
|
@ -35,6 +35,8 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
CPPUNIT_TEST(handleParticipantChangedTwoResources);
|
||||
CPPUNIT_TEST(handlePMFromXMPP);
|
||||
CPPUNIT_TEST(handleGroupchatRemoved);
|
||||
CPPUNIT_TEST(handleNicknameConflict);
|
||||
CPPUNIT_TEST(handleNotAuthorized);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
public:
|
||||
|
@ -115,7 +117,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
CPPUNIT_ASSERT_EQUAL(0, (int) received.size());
|
||||
|
||||
// this user presence - status code 110
|
||||
conv->handleParticipantChanged("nickname", 1, Swift::StatusShow::Away, "my status message");
|
||||
conv->handleParticipantChanged("nickname", Conversation::PARTICIPANT_FLAG_MODERATOR, Swift::StatusShow::Away, "my status message");
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(2, (int) received.size());
|
||||
|
@ -472,7 +474,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
conv->addJID("user@localhost/resource");
|
||||
|
||||
// normal presence
|
||||
conv->handleParticipantChanged("anotheruser", 0, Swift::StatusShow::Away, "my status message");
|
||||
conv->handleParticipantChanged("anotheruser", Conversation::PARTICIPANT_FLAG_NONE, Swift::StatusShow::Away, "my status message");
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
|
||||
|
@ -487,7 +489,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
received.clear();
|
||||
|
||||
// this user presence - status code 110
|
||||
conv->handleParticipantChanged("nickname", 1, Swift::StatusShow::Away, "my status message");
|
||||
conv->handleParticipantChanged("nickname", Conversation::PARTICIPANT_FLAG_MODERATOR, Swift::StatusShow::Away, "my status message");
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
|
||||
|
@ -503,7 +505,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
received.clear();
|
||||
|
||||
// renamed - status code 303
|
||||
conv->handleParticipantChanged("anotheruser", 1, Swift::StatusShow::Away, "my status message", "hanzz");
|
||||
conv->handleParticipantChanged("anotheruser", Conversation::PARTICIPANT_FLAG_MODERATOR, Swift::StatusShow::Away, "my status message", "hanzz");
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(2, (int) received.size());
|
||||
|
@ -530,7 +532,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
conv->addJID("user@localhost/resource2");
|
||||
|
||||
// normal presence
|
||||
conv->handleParticipantChanged("anotheruser", 0, Swift::StatusShow::Away, "my status message");
|
||||
conv->handleParticipantChanged("anotheruser", Conversation::PARTICIPANT_FLAG_NONE, Swift::StatusShow::Away, "my status message");
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(1, (int) received2.size());
|
||||
|
@ -551,7 +553,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
conv->setNickname("nickname");
|
||||
conv->setJID("user@localhost/resource");
|
||||
|
||||
conv->handleParticipantChanged("anotheruser", 0, Swift::StatusShow::Away, "my status message");
|
||||
conv->handleParticipantChanged("anotheruser", Conversation::PARTICIPANT_FLAG_NONE, Swift::StatusShow::Away, "my status message");
|
||||
loop->processEvents();
|
||||
|
||||
received.clear();
|
||||
|
@ -593,6 +595,44 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
|
|||
CPPUNIT_ASSERT_EQUAL(332, getStanza(received[0])->getPayload<Swift::MUCUserPayload>()->getStatusCodes()[0].code);
|
||||
}
|
||||
|
||||
void handleNicknameConflict() {
|
||||
User *user = userManager->getUser("user@localhost");
|
||||
TestingConversation *conv = new TestingConversation(user->getConversationManager(), "#room", true);
|
||||
|
||||
conv->onMessageToSend.connect(boost::bind(&ConversationManagerTest::handleMessageReceived, this, _1, _2));
|
||||
conv->setNickname("nickname");
|
||||
conv->addJID("user@localhost/resource");
|
||||
|
||||
// normal presence
|
||||
conv->handleParticipantChanged("nickname", Conversation::PARTICIPANT_FLAG_CONFLICT, Swift::StatusShow::Away, "my status message");
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
|
||||
CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[0])));
|
||||
CPPUNIT_ASSERT_EQUAL(Swift::Presence::Error, dynamic_cast<Swift::Presence *>(getStanza(received[0]))->getType());
|
||||
CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::ErrorPayload>());
|
||||
CPPUNIT_ASSERT_EQUAL(Swift::ErrorPayload::Conflict, getStanza(received[0])->getPayload<Swift::ErrorPayload>()->getCondition());
|
||||
}
|
||||
|
||||
void handleNotAuthorized() {
|
||||
User *user = userManager->getUser("user@localhost");
|
||||
TestingConversation *conv = new TestingConversation(user->getConversationManager(), "#room", true);
|
||||
|
||||
conv->onMessageToSend.connect(boost::bind(&ConversationManagerTest::handleMessageReceived, this, _1, _2));
|
||||
conv->setNickname("nickname");
|
||||
conv->addJID("user@localhost/resource");
|
||||
|
||||
// normal presence
|
||||
conv->handleParticipantChanged("nickname", Conversation::PARTICIPANT_FLAG_NOT_AUTHORIZED, Swift::StatusShow::Away, "my status message");
|
||||
loop->processEvents();
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
|
||||
CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[0])));
|
||||
CPPUNIT_ASSERT_EQUAL(Swift::Presence::Error, dynamic_cast<Swift::Presence *>(getStanza(received[0]))->getType());
|
||||
CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::ErrorPayload>());
|
||||
CPPUNIT_ASSERT_EQUAL(Swift::ErrorPayload::NotAuthorized, getStanza(received[0])->getPayload<Swift::ErrorPayload>()->getCondition());
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION (ConversationManagerTest);
|
||||
|
|
|
@ -170,7 +170,7 @@ class UserTest : public CPPUNIT_NS :: TestFixture, public BasicTest {
|
|||
|
||||
// Add 1 participant
|
||||
Conversation *conv = user->getConversationManager()->getConversation("#room");
|
||||
conv->handleParticipantChanged("anotheruser", 0, Swift::StatusShow::Away, "my status message");
|
||||
conv->handleParticipantChanged("anotheruser", Conversation::PARTICIPANT_FLAG_NONE, Swift::StatusShow::Away, "my status message");
|
||||
|
||||
// Connect 2nd resource
|
||||
connectSecondResource();
|
||||
|
|
Loading…
Add table
Reference in a new issue