diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 823711469593fe48fe00afd92b074f9369b2e4cc..671509f45614716c0bcde841534a3c16e56a4497 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -214,6 +214,34 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { res.password = m_userRegistry->getUserPassword(userkey); } + // We allow auto_register feature in gateway-mode. This allows IRC user to register + // the transport just by joining the room. + if (!m_component->inServerMode()) { + if (!registered && CONFIG_BOOL(m_component->getConfig(), "registration.auto_register")) { + res.password = ""; + res.jid = userkey; + + bool isMUC = presence->getPayload() != NULL || *presence->getTo().getNode().c_str() == '#'; + if (isMUC) { + res.uin = presence->getTo().getResource(); + } + else { + res.uin = presence->getFrom().toString(); + } + LOG4CXX_INFO(logger, "Auto-registering user " << userkey << " with uin=" << res.uin); + + if (m_storageBackend) { + // store user and getUser again to get user ID. + m_storageBackend->setUser(res); + registered = m_storageBackend->getUser(userkey, res); + } + else { + registered = false; + } + } + } + + // Unregistered users are not able to login if (!registered) { LOG4CXX_WARN(logger, "Unregistered user " << userkey << " tried to login"); @@ -282,7 +310,12 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) { } user->getConversationManager()->handleMessageReceived(message); - messageToBackendSent(); + + // Do not count chatstate notification... + boost::shared_ptr statePayload = message->getPayload(); + if (!statePayload) { + messageToBackendSent(); + } } void UserManager::handleGeneralPresenceReceived(Swift::Presence::ref presence) {