Merge branch 'master' of github.com:hanzz/libtransport

This commit is contained in:
HanzZ 2012-06-20 17:38:39 +02:00
commit 0daca2a247
12 changed files with 143 additions and 14 deletions

View file

@ -13,13 +13,25 @@ Version 2.0.0-beta3 (2012-XX-XX):
* Added Munin plugin (Thanks to Askovpen).
* Added support for more admin_jid JIDs (Thanks to Askovpen).
* Fixed allowed_servers option.
* Show error in server-mode when server port is already used.
* Fixed bug when backend could freeze on exit.
* Options from config file can now be set also using command line like
--service.jid=domain.tld .
* Do not send password in IQ-get registration response.
Libpurple:
* prpl-gg: Fetch the contact list properly (#252).
* Added support for prpl-novell as it was in spectrum1.
Skype:
* Log more errors.
Libyahoo2:
* Added new Yahoo backend based on libyahoo2.
Swiften:
* Added new XMPP backend based on Swiften library.
Backend API:
* Added Python NetworkPlugin class, so it is now easier to write backends
in Python (Thanks to Sarang).

View file

@ -27,14 +27,22 @@
namespace Transport {
class Component;
class DiscoItemsResponder : public Swift::GetResponder<Swift::DiscoItems> {
public:
DiscoItemsResponder(Swift::IQRouter *router);
DiscoItemsResponder(Component *component);
~DiscoItemsResponder();
void addAdHocCommand(const std::string &node, const std::string &name);
// void removeAdHocCommand(const std::string &node);
private:
virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr<Swift::DiscoItems> payload);
Component *m_component;
boost::shared_ptr<Swift::DiscoItems> m_commands;
};
}

View file

@ -75,6 +75,11 @@ class NetworkPlugin {
bool blocked = false
);
/// Call this method when buddy is removed from legacy network contact list.
/// \param user XMPP JID of user for which this event occurs. You can get it from NetworkPlugin::handleLoginRequest(). (eg. "user%gmail.com@xmpp.domain.tld")
/// \param buddyName Name of legacy network buddy. (eg. "user2@gmail.com")
void handleBuddyRemoved(const std::string &user, const std::string &buddyName);
/// Call this function when participant in room changed.
/// \param user XMPP JID of user for which this event occurs. You can get it from NetworkPlugin::handleLoginRequest(). (eg. "user%gmail.com@xmpp.domain.tld")
/// \param nickname Nickname of participant. If participant renamed, this is old name of participant. (eg. "HanzZ")

View file

@ -89,6 +89,7 @@ class NetworkPluginServer {
void handleConnectedPayload(const std::string &payload);
void handleDisconnectedPayload(const std::string &payload);
void handleBuddyChangedPayload(const std::string &payload);
void handleBuddyRemovedPayload(const std::string &payload);
void handleConvMessagePayload(const std::string &payload, bool subject = false);
void handleParticipantChangedPayload(const std::string &payload);
void handleRoomChangedPayload(const std::string &payload);

View file

@ -69,6 +69,10 @@ class RosterManager {
/// \param buddy Buddy.
void unsetBuddy(Buddy *buddy);
/// Removes buddy from this roster, sends proper XML to XMPP side and deletes it.
/// \param name Buddy name.
void removeBuddy(const std::string &name);
Buddy *getBuddy(const std::string &name);
void setStorageBackend(StorageBackend *storageBackend);
@ -107,7 +111,11 @@ class RosterManager {
void sendBuddyRosterPush(Buddy *buddy);
void sendBuddyRosterRemove(Buddy *buddy);
void sendBuddySubscribePresence(Buddy *buddy);
void sendBuddyUnsubscribePresence(Buddy *buddy);
void sendCurrentPresences(const Swift::JID &to);

View file

@ -48,7 +48,6 @@ namespace Transport {
//
class StorageBackend;
class DiscoInfoResponder;
class DiscoItemsResponder;
class Factory;
class UserRegistry;
@ -188,7 +187,6 @@ namespace Transport {
Transport::UserRegistry *m_userRegistry;
StorageBackend *m_storageBackend;
DiscoInfoResponder *m_discoInfoResponder;
DiscoItemsResponder *m_discoItemsResponder;
int m_reconnectCount;
Config* m_config;
std::string m_protocol;

View file

@ -165,6 +165,19 @@ void NetworkPlugin::handleBuddyChanged(const std::string &user, const std::strin
send(message);
}
void NetworkPlugin::handleBuddyRemoved(const std::string &user, const std::string &buddyName) {
pbnetwork::Buddy buddy;
buddy.set_username(user);
buddy.set_buddyname(buddyName);
std::string message;
buddy.SerializeToString(&message);
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_REMOVED);
send(message);
}
void NetworkPlugin::handleBuddyTyping(const std::string &user, const std::string &buddyName) {
pbnetwork::Buddy buddy;
buddy.set_username(user);

View file

@ -14,6 +14,7 @@
#include "transport/util.h"
#include "transport/gatewayresponder.h"
#include "transport/logging.h"
#include "transport/discoitemsresponder.h"
#include "Swiften/EventLoop/SimpleEventLoop.h"
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
@ -313,6 +314,9 @@ int main(int argc, char **argv)
GatewayResponder gatewayResponder(transport.getIQRouter(), &userManager);
gatewayResponder.start();
DiscoItemsResponder discoItemsResponder(&transport);
discoItemsResponder.start();
eventLoop_ = &eventLoop;
eventLoop.run();

View file

@ -18,32 +18,45 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*/
#include "discoitemsresponder.h"
#include "transport/discoitemsresponder.h"
#include <iostream>
#include <boost/bind.hpp>
#include "Swiften/Queries/IQRouter.h"
#include "Swiften/Elements/DiscoItems.h"
#include "Swiften/Swiften.h"
#include "transport/transport.h"
#include "transport/logging.h"
using namespace Swift;
using namespace boost;
namespace Transport {
DiscoItemsResponder::DiscoItemsResponder(Swift::IQRouter *router) : Swift::GetResponder<DiscoItems>(router) {
DEFINE_LOGGER(logger, "DiscoItemsResponder");
DiscoItemsResponder::DiscoItemsResponder(Component *component) : Swift::GetResponder<DiscoItems>(component->getIQRouter()) {
m_component = component;
m_commands = boost::shared_ptr<DiscoItems>(new DiscoItems());
m_commands->setNode("http://jabber.org/protocol/commands");
}
DiscoItemsResponder::~DiscoItemsResponder() {
}
void DiscoItemsResponder::addAdHocCommand(const std::string &node, const std::string &name) {
m_commands->addItem(DiscoItems::Item(name, m_component->getJID(), node));
}
bool DiscoItemsResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr<Swift::DiscoItems> info) {
// presence for transport
if (to.getNode().empty()) {
LOG4CXX_INFO(logger, "get request received with node " << info->getNode());
if (info->getNode() == "http://jabber.org/protocol/commands") {
sendResponse(from, id, m_commands);
}
else if (to.getNode().empty()) {
sendResponse(from, id, boost::shared_ptr<DiscoItems>(new DiscoItems()));
}
// presence for buddy
else {
sendResponse(from, id, boost::shared_ptr<DiscoItems>(new DiscoItems()));
}

View file

@ -263,6 +263,7 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U
LOG4CXX_INFO(logger, "Listening on host " << CONFIG_STRING(m_config, "service.backend_host") << " port " << CONFIG_STRING(m_config, "service.backend_port"));
unsigned long pid = exec_(CONFIG_STRING(m_config, "service.backend"), CONFIG_STRING(m_config, "service.backend_host").c_str(), CONFIG_STRING(m_config, "service.backend_port").c_str(), m_config->getConfigFile().c_str());
LOG4CXX_INFO(logger, "Tried to spawn first backend with pid " << pid);
LOG4CXX_INFO(logger, "Backend should now connect to Spectrum2 instance. Spectrum2 won't accept any connection before backend connects");
#ifndef _WIN32
@ -521,6 +522,20 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) {
}
}
void NetworkPluginServer::handleBuddyRemovedPayload(const std::string &data) {
pbnetwork::Buddy payload;
if (payload.ParseFromString(data) == false) {
// TODO: ERROR
return;
}
User *user = m_userManager->getUser(payload.username());
if (!user)
return;
user->getRosterManager()->removeBuddy(payload.buddyname());
}
void NetworkPluginServer::handleParticipantChangedPayload(const std::string &data) {
pbnetwork::Participant payload;
if (payload.ParseFromString(data) == false) {
@ -825,6 +840,9 @@ void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr<Swift::Sa
case pbnetwork::WrapperMessage_Type_TYPE_FT_DATA:
handleFTDataPayload(c, wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_REMOVED:
handleBuddyRemovedPayload(wrapper.payload());
break;
default:
return;
}

View file

@ -99,6 +99,46 @@ void RosterManager::setBuddy(Buddy *buddy) {
setBuddyCallback(buddy);
}
void RosterManager::removeBuddy(const std::string &name) {
Buddy *buddy = getBuddy(name);
if (!buddy) {
LOG4CXX_WARN(logger, m_user->getJID().toString() << ": Tried to remove unknown buddy " << name);
return;
}
if (m_component->inServerMode() || m_remoteRosterRequest) {
sendBuddyRosterRemove(buddy);
}
else {
sendBuddyUnsubscribePresence(buddy);
}
unsetBuddy(buddy);
delete buddy;
}
void RosterManager::sendBuddyRosterRemove(Buddy *buddy) {
Swift::RosterPayload::ref p = Swift::RosterPayload::ref(new Swift::RosterPayload());
Swift::RosterItemPayload item;
item.setJID(buddy->getJID().toBare());
item.setSubscription(Swift::RosterItemPayload::Remove);
p->addItem(item);
// In server mode we have to send pushes to all resources, but in gateway-mode we send it only to bare JID
if (m_component->inServerMode()) {
std::vector<Swift::Presence::ref> presences = m_component->getPresenceOracle()->getAllPresence(m_user->getJID().toBare());
BOOST_FOREACH(Swift::Presence::ref presence, presences) {
Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(p, presence->getFrom(), m_component->getIQRouter());
request->send();
}
}
else {
Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(p, m_user->getJID().toBare(), m_component->getIQRouter());
request->send();
}
}
void RosterManager::sendBuddyRosterPush(Buddy *buddy) {
// user can't receive anything in server mode if he's not logged in.
// He will ask for roster later (handled in rosterreponsder.cpp)
@ -142,6 +182,20 @@ void RosterManager::sendBuddyRosterPush(Buddy *buddy) {
}
}
void RosterManager::sendBuddyUnsubscribePresence(Buddy *buddy) {
Swift::Presence::ref response = Swift::Presence::create();
response->setTo(m_user->getJID());
response->setFrom(buddy->getJID());
response->setType(Swift::Presence::Unsubscribe);
m_component->getStanzaChannel()->sendPresence(response);
response = Swift::Presence::create();
response->setTo(m_user->getJID());
response->setFrom(buddy->getJID());
response->setType(Swift::Presence::Unsubscribed);
m_component->getStanzaChannel()->sendPresence(response);
}
void RosterManager::sendBuddySubscribePresence(Buddy *buddy) {
Swift::Presence::ref response = Swift::Presence::create();
response->setTo(m_user->getJID());

View file

@ -26,7 +26,6 @@
#include "transport/userregistry.h"
#include "transport/logging.h"
#include "discoinforesponder.h"
#include "discoitemsresponder.h"
#include "storageparser.h"
#include "Swiften/TLS/OpenSSL/OpenSSLServerContext.h"
#include "Swiften/TLS/PKCS12Certificate.h"
@ -149,9 +148,6 @@ Component::Component(Swift::EventLoop *loop, Swift::NetworkFactories *factories,
m_discoInfoResponder = new DiscoInfoResponder(m_iqRouter, m_config);
m_discoInfoResponder->start();
m_discoItemsResponder = new DiscoItemsResponder(m_iqRouter);
m_discoItemsResponder->start();
//
// m_registerHandler = new SpectrumRegisterHandler(m_component);
// m_registerHandler->start();
@ -163,7 +159,6 @@ Component::~Component() {
delete m_capsManager;
delete m_capsMemoryStorage;
delete m_discoInfoResponder;
delete m_discoItemsResponder;
if (m_component)
delete m_component;
if (m_server) {