#include #include #include #include #include #include #include #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Server/ServerFromClientSession.h" #include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h" #include "basictest.h" using namespace Transport; #if !HAVE_SWIFTEN_3 #define get_value_or(X) substr() #endif class UserRegistrationTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_TEST_SUITE(UserRegistrationTest); CPPUNIT_TEST(getForm); CPPUNIT_TEST(getFormRegistered); CPPUNIT_TEST(registerUser); CPPUNIT_TEST(registerUserWithoutRR); CPPUNIT_TEST(unregisterUser); CPPUNIT_TEST(unregisterEmptyPayload); CPPUNIT_TEST(registerUserNotify); CPPUNIT_TEST(unregisterUserNotify); CPPUNIT_TEST(changePassword); CPPUNIT_TEST(registerUserEmpty); CPPUNIT_TEST(registerUserNoNeedPassword); CPPUNIT_TEST(registerUserFormUnknownType); CPPUNIT_TEST_SUITE_END(); public: void setUp (void) { setMeUp(); received.clear(); } void tearDown (void) { received.clear(); tearMeDown(); } void getForm() { SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(new Swift::InBandRegistrationPayload())); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT_EQUAL(false, getStanza(received[0])->getPayload()->isRegistered()); CPPUNIT_ASSERT_EQUAL(std::string(""), *getStanza(received[0])->getPayload()->getUsername()); CPPUNIT_ASSERT_EQUAL(std::string(""), *getStanza(received[0])->getPayload()->getPassword()); } void getFormRegistered() { UserInfo user; user.id = -1; user.jid = "user@localhost"; user.uin = "legacyname"; user.password = "password"; storage->setUser(user); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(new Swift::InBandRegistrationPayload())); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT_EQUAL(true, getStanza(received[0])->getPayload()->isRegistered()); CPPUNIT_ASSERT_EQUAL(std::string("legacyname"), *getStanza(received[0])->getPayload()->getUsername()); CPPUNIT_ASSERT_EQUAL(std::string(""), *getStanza(received[0])->getPayload()->getPassword()); } void registerUser() { Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setUsername("legacyname"); reg->setPassword("password"); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[1]))->getType()); iq = Swift::IQ::createResult(Swift::JID("localhost"), getStanza(received[0])->getTo(), getStanza(received[0])->getID(), SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(new Swift::RosterPayload())); received.clear(); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Set, dynamic_cast(getStanza(received[0]))->getType()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), getStanza(received[0])->getPayload()->getItems()[0].getJID().toString()); UserInfo user; CPPUNIT_ASSERT_EQUAL(true, storage->getUser("user@localhost", user)); CPPUNIT_ASSERT_EQUAL(std::string("legacyname"), user.uin); CPPUNIT_ASSERT_EQUAL(std::string("password"), user.password); } void registerUserWithoutRR(){ Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setUsername("legacyname"); reg->setPassword("password"); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[1]))->getType()); iq = Swift::IQ::createError(Swift::JID("localhost"), getStanza(received[0])->getTo(), getStanza(received[0])->getID()); received.clear(); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::Presence::Subscribe, dynamic_cast(getStanza(received[0]))->getType()); } void unregisterUser() { registerUser(); received.clear(); Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setRemove(true); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[1]))->getType()); iq = Swift::IQ::createResult(Swift::JID("localhost"), getStanza(received[0])->getTo(), getStanza(received[0])->getID(), SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(new Swift::RosterPayload())); received.clear(); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Set, dynamic_cast(getStanza(received[0]))->getType()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); UserInfo user; CPPUNIT_ASSERT_EQUAL(false, storage->getUser("user@localhost", user)); } void registerUserNotify() { std::istringstream ifs("service.server_mode = 1\nregistration.notify_jid=user@localhost\nservice.jid=localhost\nservice.more_resources=1\n"); cfg->load(ifs); Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setUsername("legacyname"); reg->setPassword("password"); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[1]))->getType()); iq = Swift::IQ::createResult(Swift::JID("localhost"), getStanza(received[0])->getTo(), getStanza(received[0])->getID(), SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(new Swift::RosterPayload())); received.clear(); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Set, dynamic_cast(getStanza(received[0]))->getType()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), getStanza(received[0])->getPayload()->getItems()[0].getJID().toString()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(std::string("registered: user@localhost"), dynamic_cast(getStanza(received[1]))->getBody().get_value_or("")); UserInfo user; CPPUNIT_ASSERT_EQUAL(true, storage->getUser("user@localhost", user)); CPPUNIT_ASSERT_EQUAL(std::string("legacyname"), user.uin); CPPUNIT_ASSERT_EQUAL(std::string("password"), user.password); } void unregisterUserNotify() { registerUserNotify(); received.clear(); Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setRemove(true); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[1]))->getType()); iq = Swift::IQ::createResult(Swift::JID("localhost"), getStanza(received[0])->getTo(), getStanza(received[0])->getID(), SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(new Swift::RosterPayload())); received.clear(); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Set, dynamic_cast(getStanza(received[0]))->getType()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(std::string("unregistered: user@localhost"), dynamic_cast(getStanza(received[1]))->getBody().get_value_or("")); UserInfo user; CPPUNIT_ASSERT_EQUAL(false, storage->getUser("user@localhost", user)); } void changePassword() { registerUser(); received.clear(); Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setUsername("legacyname"); reg->setPassword("another"); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); UserInfo user; CPPUNIT_ASSERT_EQUAL(true, storage->getUser("user@localhost", user)); CPPUNIT_ASSERT_EQUAL(std::string("legacyname"), user.uin); CPPUNIT_ASSERT_EQUAL(std::string("another"), user.password); } void registerUserEmpty() { Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setUsername(""); reg->setPassword("password"); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Error, dynamic_cast(getStanza(received[0]))->getType()); UserInfo user; CPPUNIT_ASSERT_EQUAL(false, storage->getUser("user@localhost", user)); } void unregisterEmptyPayload() { registerUser(); received.clear(); Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setRemove(true); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[1]))->getType()); iq = Swift::IQ::createResult(Swift::JID("localhost"), getStanza(received[0])->getTo(), getStanza(received[0])->getID()); received.clear(); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unsubscribe, dynamic_cast(getStanza(received[0]))->getType()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unsubscribed, dynamic_cast(getStanza(received[1]))->getType()); } void registerUserNoNeedPassword() { cfg->updateBackendConfig("[registration]\nneedPassword=0\n"); Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setUsername("legacyname"); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[1]))->getType()); iq = Swift::IQ::createResult(Swift::JID("localhost"), getStanza(received[0])->getTo(), getStanza(received[0])->getID(), SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(new Swift::RosterPayload())); received.clear(); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Set, dynamic_cast(getStanza(received[0]))->getType()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), getStanza(received[0])->getPayload()->getItems()[0].getJID().toString()); UserInfo user; CPPUNIT_ASSERT_EQUAL(true, storage->getUser("user@localhost", user)); CPPUNIT_ASSERT_EQUAL(std::string("legacyname"), user.uin); CPPUNIT_ASSERT_EQUAL(std::string(""), user.password); } void registerUserFormUnknownType() { #if HAVE_SWIFTEN_3 Swift::Form::ref form(new Swift::Form(Swift::Form::FormType)); Swift::FormField::ref type = SWIFTEN_SHRPTR_NAMESPACE::make_shared(Swift::FormField::UnknownType, "jabber:iq:register"); type->setName("FORM_TYPE"); form->addField(type); Swift::FormField::ref username = SWIFTEN_SHRPTR_NAMESPACE::make_shared(Swift::FormField::UnknownType, "legacyname"); username->setName("username"); form->addField(username); Swift::FormField::ref password = SWIFTEN_SHRPTR_NAMESPACE::make_shared(Swift::FormField::UnknownType, "password"); password->setName("password"); form->addField(password); Swift::FormField::ref language = SWIFTEN_SHRPTR_NAMESPACE::make_shared(Swift::FormField::UnknownType, "language"); language->setName("en"); form->addField(language); Swift::InBandRegistrationPayload *reg = new Swift::InBandRegistrationPayload(); reg->setForm(form); SWIFTEN_SHRPTR_NAMESPACE::shared_ptr iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", SWIFTEN_SHRPTR_NAMESPACE::shared_ptr(reg)); iq->setFrom("user@localhost"); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[1]))->getType()); iq = Swift::IQ::createError(Swift::JID("localhost"), getStanza(received[0])->getTo(), getStanza(received[0])->getID()); received.clear(); injectIQ(iq); loop->processEvents(); CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(Swift::Presence::Subscribe, dynamic_cast(getStanza(received[0]))->getType()); #endif } }; CPPUNIT_TEST_SUITE_REGISTRATION (UserRegistrationTest);