diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index e61c9743..22f7e2ae 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -466,6 +466,11 @@ static PurpleCoreUiOps coreUiOps = NULL }; +static void signed_on(PurpleConnection *gc, gpointer unused) { + PurpleAccount *account = purple_connection_get_account(gc); + np->handleConnected(np->m_accounts[account]); +} + static void printDebug(PurpleDebugLevel level, const char *category, const char *arg_s) { std::string c("[LIBPURPLE"); @@ -536,7 +541,7 @@ static bool initPurple(Config &cfg) { // purple_signal_connect(purple_conversations_get_handle(), "buddy-typing", &conversation_handle, PURPLE_CALLBACK(buddyTyping), NULL); // purple_signal_connect(purple_conversations_get_handle(), "buddy-typed", &conversation_handle, PURPLE_CALLBACK(buddyTyped), NULL); // purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", &conversation_handle, PURPLE_CALLBACK(buddyTypingStopped), NULL); -// purple_signal_connect(purple_connections_get_handle(), "signed-on", &conn_handle,PURPLE_CALLBACK(signed_on), NULL); + purple_signal_connect(purple_connections_get_handle(), "signed-on", &blist_handle,PURPLE_CALLBACK(signed_on), NULL); // purple_signal_connect(purple_blist_get_handle(), "buddy-removed", &blist_handle,PURPLE_CALLBACK(buddyRemoved), NULL); purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", &blist_handle,PURPLE_CALLBACK(buddySignedOn), NULL); purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", &blist_handle,PURPLE_CALLBACK(buddySignedOff), NULL); diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 025f9a3c..a1b64226 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -48,6 +48,8 @@ class NetworkPlugin { void handleDisconnected(const std::string &user, const std::string &legacyName, int error, const std::string &message); + void handleConnected(const std::string &user); + void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = ""); void handleSubject(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = ""); @@ -73,7 +75,7 @@ class NetworkPlugin { void handleLeaveRoomPayload(const std::string &payload); void handleVCardPayload(const std::string &payload); void handleDataRead(const Swift::ByteArray&); - void handleConnected(bool error); + void _handleConnected(bool error); void handleDisconnected(); void send(const std::string &data); diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 40fd8087..487c0b6b 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -87,6 +87,7 @@ class NetworkPluginServer { boost::shared_ptr m_server; std::list m_clients; Swift::Timer::ref m_pingTimer; + Component *m_component; }; } diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index d25f60b1..efd8bd9a 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -44,7 +44,7 @@ NetworkPlugin::NetworkPlugin(Swift::EventLoop *loop, const std::string &host, in m_pingReceived = false; m_conn = m_factories->getConnectionFactory()->createConnection(); m_conn->onDataRead.connect(boost::bind(&NetworkPlugin::handleDataRead, this, _1)); - m_conn->onConnectFinished.connect(boost::bind(&NetworkPlugin::handleConnected, this, _1)); + m_conn->onConnectFinished.connect(boost::bind(&NetworkPlugin::_handleConnected, this, _1)); m_conn->onDisconnected.connect(boost::bind(&NetworkPlugin::handleDisconnected, this)); m_pingTimer = m_factories->getTimerFactory()->createTimer(30000); @@ -123,6 +123,18 @@ void NetworkPlugin::handleBuddyChanged(const std::string &user, const std::strin send(message); } +void NetworkPlugin::handleConnected(const std::string &user) { + pbnetwork::Connected d; + d.set_user(user); + + std::string message; + d.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONNECTED); + + send(message); +} + void NetworkPlugin::handleDisconnected(const std::string &user, const std::string &legacyName, int error, const std::string &msg) { pbnetwork::Disconnected d; d.set_user(user); @@ -171,7 +183,7 @@ void NetworkPlugin::handleRoomChanged(const std::string &user, const std::string send(message); } -void NetworkPlugin::handleConnected(bool error) { +void NetworkPlugin::_handleConnected(bool error) { if (error) { std::cerr << "Connecting error\n"; m_pingTimer->stop(); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 42aaf9b8..1a757e06 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -112,7 +112,8 @@ static void handleBuddyPayload(LocalBuddy *buddy, const pbnetwork::Buddy &payloa NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, UserManager *userManager) { m_userManager = userManager; m_config = config; - component->m_factory = new NetworkFactory(this); + m_component = component; + m_component->m_factory = new NetworkFactory(this); m_userManager->onUserCreated.connect(boost::bind(&NetworkPluginServer::handleUserCreated, this, _1)); m_userManager->onUserDestroyed.connect(boost::bind(&NetworkPluginServer::handleUserDestroyed, this, _1)); @@ -174,6 +175,8 @@ void NetworkPluginServer::handleConnectedPayload(const std::string &data) { // TODO: ERROR return; } + std::cout << "CONNECTED LOGIN 2 " << payload.user() << "\n"; + m_component->m_userRegistry->onPasswordValid(payload.user()); // std::cout << payload.name() << "\n"; } @@ -185,9 +188,11 @@ void NetworkPluginServer::handleDisconnectedPayload(const std::string &data) { } User *user = m_userManager->getUser(payload.user()); - if (!user) + if (!user) { return; + } + m_component->m_userRegistry->onPasswordInvalid(payload.user()); user->handleDisconnected(payload.message()); } diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index fcd9428c..8fcc80db 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -2,7 +2,6 @@ package pbnetwork; message Connected { required string user = 1; - required string name = 2; } message Disconnected { diff --git a/src/transport.cpp b/src/transport.cpp index 00b972d0..d0eb9cdc 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -34,13 +34,20 @@ namespace Transport { class MyUserRegistry : public Swift::UserRegistry { public: - MyUserRegistry() {} + MyUserRegistry(Component *c) {component = c;} ~MyUserRegistry() {} bool isValidUserPassword(const JID& user, const std::string& password) const { users[user.toBare().toString()] = password; + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo(component->getJID()); + response->setFrom(user); + response->setType(Swift::Presence::Available); + component->onUserPresenceReceived(response); + std::cout << "CONNECTED LOGIN 1" << user.toString() << "\n"; return true; } mutable std::map users; + mutable Component *component; }; Component::Component(Swift::EventLoop *loop, Config *config, Factory *factory) { @@ -59,7 +66,7 @@ Component::Component(Swift::EventLoop *loop, Config *config, Factory *factory) { m_reconnectTimer->onTick.connect(bind(&Component::connect, this)); if (CONFIG_BOOL(m_config, "service.server_mode")) { - m_userRegistry = new MyUserRegistry(); + m_userRegistry = new MyUserRegistry(this); m_server = new Swift::Server(loop, m_factories, m_userRegistry, m_jid, CONFIG_INT(m_config, "service.port")); m_server->start(); m_stanzaChannel = m_server->getStanzaChannel(); @@ -174,14 +181,6 @@ void Component::handlePresence(Swift::Presence::ref presence) { // filter out bad presences if (!presence->getFrom().isValid()) { - Swift::Presence::ref response = Swift::Presence::create(); - response->setTo(presence->getFrom()); - response->setFrom(presence->getTo()); - response->setType(Swift::Presence::Error); - - response->addPayload(boost::shared_ptr(new ErrorPayload(ErrorPayload::JIDMalformed, ErrorPayload::Modify))); - - m_component->sendPresence(response); return; } diff --git a/src/user.cpp b/src/user.cpp index 6691ae20..2c7d5d09 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -77,6 +77,10 @@ void User::handlePresence(Swift::Presence::ref presence) { onReadyToConnect(); } } + else if (m_component->inServerMode()) { + m_readyForConnect = true; + onReadyToConnect(); + } else { m_reconnectTimer->start(); }