summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Component')
-rw-r--r--Swiften/Component/Component.cpp4
-rw-r--r--Swiften/Component/Component.h7
-rw-r--r--Swiften/Component/ComponentConnector.cpp2
-rw-r--r--Swiften/Component/ComponentConnector.h5
-rw-r--r--Swiften/Component/ComponentError.h2
-rw-r--r--Swiften/Component/ComponentHandshakeGenerator.cpp6
-rw-r--r--Swiften/Component/ComponentHandshakeGenerator.h10
-rw-r--r--Swiften/Component/ComponentSession.cpp14
-rw-r--r--Swiften/Component/ComponentSession.h19
-rw-r--r--Swiften/Component/ComponentSessionStanzaChannel.h5
-rw-r--r--Swiften/Component/ComponentXMLTracer.h3
-rw-r--r--Swiften/Component/CoreComponent.cpp18
-rw-r--r--Swiften/Component/CoreComponent.h12
-rw-r--r--Swiften/Component/UnitTest/ComponentHandshakeGeneratorTest.cpp14
-rw-r--r--Swiften/Component/UnitTest/ComponentSessionTest.cpp19
15 files changed, 90 insertions, 50 deletions
diff --git a/Swiften/Component/Component.cpp b/Swiften/Component/Component.cpp
index af378a7..a53f514 100644
--- a/Swiften/Component/Component.cpp
+++ b/Swiften/Component/Component.cpp
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2010-2013 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -11,5 +11,5 @@
namespace Swift {
-Component::Component(EventLoop* eventLoop, NetworkFactories* networkFactories, const JID& jid, const std::string& secret) : CoreComponent(eventLoop, networkFactories, jid, secret) {
+Component::Component(const JID& jid, const std::string& secret, NetworkFactories* networkFactories) : CoreComponent(jid, secret, networkFactories) {
softwareVersionResponder = new SoftwareVersionResponder(getIQRouter());
softwareVersionResponder->start();
diff --git a/Swiften/Component/Component.h b/Swiften/Component/Component.h
index 0b29ff7..3ead1a5 100644
--- a/Swiften/Component/Component.h
+++ b/Swiften/Component/Component.h
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2010-2013 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -7,4 +7,5 @@
#pragma once
+#include <Swiften/Base/API.h>
#include <Swiften/Component/CoreComponent.h>
@@ -18,7 +19,7 @@ namespace Swift {
* performing most component tasks on the XMPP network.
*/
- class Component : public CoreComponent {
+ class SWIFTEN_API Component : public CoreComponent {
public:
- Component(EventLoop* eventLoop, NetworkFactories* networkFactories, const JID& jid, const std::string& secret);
+ Component(const JID& jid, const std::string& secret, NetworkFactories* networkFactories);
~Component();
diff --git a/Swiften/Component/ComponentConnector.cpp b/Swiften/Component/ComponentConnector.cpp
index b7bdd34..0dd8e82 100644
--- a/Swiften/Component/ComponentConnector.cpp
+++ b/Swiften/Component/ComponentConnector.cpp
@@ -105,3 +105,3 @@ void ComponentConnector::handleTimeout() {
}
-};
+}
diff --git a/Swiften/Component/ComponentConnector.h b/Swiften/Component/ComponentConnector.h
index b47f5da..0e35ab2 100644
--- a/Swiften/Component/ComponentConnector.h
+++ b/Swiften/Component/ComponentConnector.h
@@ -11,4 +11,5 @@
#include <boost/shared_ptr.hpp>
+#include <Swiften/Base/API.h>
#include <Swiften/Network/Connection.h>
#include <Swiften/Network/Timer.h>
@@ -23,5 +24,5 @@ namespace Swift {
class TimerFactory;
- class ComponentConnector : public boost::bsignals::trackable, public boost::enable_shared_from_this<ComponentConnector> {
+ class SWIFTEN_API ComponentConnector : public boost::bsignals::trackable, public boost::enable_shared_from_this<ComponentConnector> {
public:
typedef boost::shared_ptr<ComponentConnector> ref;
@@ -62,3 +63,3 @@ namespace Swift {
boost::shared_ptr<Connection> currentConnection;
};
-};
+}
diff --git a/Swiften/Component/ComponentError.h b/Swiften/Component/ComponentError.h
index 928af2a..9c54b53 100644
--- a/Swiften/Component/ComponentError.h
+++ b/Swiften/Component/ComponentError.h
@@ -17,5 +17,5 @@ namespace Swift {
XMLError,
AuthenticationFailedError,
- UnexpectedElementError,
+ UnexpectedElementError
};
diff --git a/Swiften/Component/ComponentHandshakeGenerator.cpp b/Swiften/Component/ComponentHandshakeGenerator.cpp
index 79ba9b3..495d530 100644
--- a/Swiften/Component/ComponentHandshakeGenerator.cpp
+++ b/Swiften/Component/ComponentHandshakeGenerator.cpp
@@ -7,10 +7,10 @@
#include <Swiften/Component/ComponentHandshakeGenerator.h>
#include <Swiften/StringCodecs/Hexify.h>
-#include <Swiften/StringCodecs/SHA1.h>
#include <Swiften/Base/String.h>
+#include <Swiften/Crypto/CryptoProvider.h>
namespace Swift {
-std::string ComponentHandshakeGenerator::getHandshake(const std::string& streamID, const std::string& secret) {
+std::string ComponentHandshakeGenerator::getHandshake(const std::string& streamID, const std::string& secret, CryptoProvider* crypto) {
std::string concatenatedString = streamID + secret;
String::replaceAll(concatenatedString, '&', "&amp;");
@@ -19,5 +19,5 @@ std::string ComponentHandshakeGenerator::getHandshake(const std::string& streamI
String::replaceAll(concatenatedString, '\'', "&apos;");
String::replaceAll(concatenatedString, '"', "&quot;");
- return Hexify::hexify(SHA1::getHash(createByteArray(concatenatedString)));
+ return Hexify::hexify(crypto->getSHA1Hash(createByteArray(concatenatedString)));
}
diff --git a/Swiften/Component/ComponentHandshakeGenerator.h b/Swiften/Component/ComponentHandshakeGenerator.h
index 4181d3c..e0e3ef8 100644
--- a/Swiften/Component/ComponentHandshakeGenerator.h
+++ b/Swiften/Component/ComponentHandshakeGenerator.h
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2013 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -9,8 +9,12 @@
#include <string>
+#include <Swiften/Base/API.h>
+
namespace Swift {
- class ComponentHandshakeGenerator {
+ class CryptoProvider;
+
+ class SWIFTEN_API ComponentHandshakeGenerator {
public:
- static std::string getHandshake(const std::string& streamID, const std::string& secret);
+ static std::string getHandshake(const std::string& streamID, const std::string& secret, CryptoProvider* crypto);
};
diff --git a/Swiften/Component/ComponentSession.cpp b/Swiften/Component/ComponentSession.cpp
index 51d9d15..826451d 100644
--- a/Swiften/Component/ComponentSession.cpp
+++ b/Swiften/Component/ComponentSession.cpp
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2010-2014 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -11,4 +11,5 @@
#include <Swiften/Elements/ProtocolHeader.h>
+#include <Swiften/Elements/StreamFeatures.h>
#include <Swiften/Elements/ComponentHandshake.h>
#include <Swiften/Session/SessionStream.h>
@@ -17,5 +18,5 @@
namespace Swift {
-ComponentSession::ComponentSession(const JID& jid, const std::string& secret, boost::shared_ptr<SessionStream> stream) : jid(jid), secret(secret), stream(stream), state(Initial) {
+ComponentSession::ComponentSession(const JID& jid, const std::string& secret, boost::shared_ptr<SessionStream> stream, CryptoProvider* crypto) : jid(jid), secret(secret), stream(stream), crypto(crypto), state(Initial) {
}
@@ -46,8 +47,8 @@ void ComponentSession::handleStreamStart(const ProtocolHeader& header) {
checkState(WaitingForStreamStart);
state = Authenticating;
- stream->writeElement(ComponentHandshake::ref(new ComponentHandshake(ComponentHandshakeGenerator::getHandshake(header.getID(), secret))));
+ stream->writeElement(ComponentHandshake::ref(new ComponentHandshake(ComponentHandshakeGenerator::getHandshake(header.getID(), secret, crypto))));
}
-void ComponentSession::handleElement(boost::shared_ptr<Element> element) {
+void ComponentSession::handleElement(boost::shared_ptr<ToplevelElement> element) {
if (boost::shared_ptr<Stanza> stanza = boost::dynamic_pointer_cast<Stanza>(element)) {
if (getState() == Initialized) {
@@ -67,7 +68,12 @@ void ComponentSession::handleElement(boost::shared_ptr<Element> element) {
}
else if (getState() == Authenticating) {
+ if (boost::dynamic_pointer_cast<StreamFeatures>(element)) {
+ // M-Link sends stream features, so swallow that.
+ }
+ else {
// FIXME: We should actually check the element received
finishSession(Error::AuthenticationFailedError);
}
+ }
else {
finishSession(Error::UnexpectedElementError);
diff --git a/Swiften/Component/ComponentSession.h b/Swiften/Component/ComponentSession.h
index 647bad7..1fa7b5c 100644
--- a/Swiften/Component/ComponentSession.h
+++ b/Swiften/Component/ComponentSession.h
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2010-2014 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -10,9 +10,10 @@
#include <boost/enable_shared_from_this.hpp>
+#include <Swiften/Base/API.h>
#include <Swiften/JID/JID.h>
#include <Swiften/Base/boost_bsignals.h>
#include <Swiften/Base/Error.h>
#include <string>
-#include <Swiften/Elements/Element.h>
+#include <Swiften/Elements/ToplevelElement.h>
#include <Swiften/Elements/Stanza.h>
#include <Swiften/Session/SessionStream.h>
@@ -20,6 +21,7 @@
namespace Swift {
class ComponentAuthenticator;
+ class CryptoProvider;
- class ComponentSession : public boost::enable_shared_from_this<ComponentSession> {
+ class SWIFTEN_API ComponentSession : public boost::enable_shared_from_this<ComponentSession> {
public:
enum State {
@@ -35,5 +37,5 @@ namespace Swift {
enum Type {
AuthenticationFailedError,
- UnexpectedElementError,
+ UnexpectedElementError
} type;
Error(Type type) : type(type) {}
@@ -42,6 +44,6 @@ namespace Swift {
~ComponentSession();
- static boost::shared_ptr<ComponentSession> create(const JID& jid, const std::string& secret, boost::shared_ptr<SessionStream> stream) {
- return boost::shared_ptr<ComponentSession>(new ComponentSession(jid, secret, stream));
+ static boost::shared_ptr<ComponentSession> create(const JID& jid, const std::string& secret, boost::shared_ptr<SessionStream> stream, CryptoProvider* crypto) {
+ return boost::shared_ptr<ComponentSession>(new ComponentSession(jid, secret, stream, crypto));
}
@@ -61,5 +63,5 @@ namespace Swift {
private:
- ComponentSession(const JID& jid, const std::string& secret, boost::shared_ptr<SessionStream>);
+ ComponentSession(const JID& jid, const std::string& secret, boost::shared_ptr<SessionStream>, CryptoProvider*);
void finishSession(Error::Type error);
@@ -68,5 +70,5 @@ namespace Swift {
void sendStreamHeader();
- void handleElement(boost::shared_ptr<Element>);
+ void handleElement(boost::shared_ptr<ToplevelElement>);
void handleStreamStart(const ProtocolHeader&);
void handleStreamClosed(boost::shared_ptr<Swift::Error>);
@@ -78,4 +80,5 @@ namespace Swift {
std::string secret;
boost::shared_ptr<SessionStream> stream;
+ CryptoProvider* crypto;
boost::shared_ptr<Swift::Error> error;
State state;
diff --git a/Swiften/Component/ComponentSessionStanzaChannel.h b/Swiften/Component/ComponentSessionStanzaChannel.h
index 45f90b5..4e133b8 100644
--- a/Swiften/Component/ComponentSessionStanzaChannel.h
+++ b/Swiften/Component/ComponentSessionStanzaChannel.h
@@ -32,4 +32,9 @@ namespace Swift {
}
+ std::vector<Certificate::ref> getPeerCertificateChain() const {
+ // TODO: actually implement this method
+ return std::vector<Certificate::ref>();
+ }
+
bool isAvailable() const {
return session && session->getState() == ComponentSession::Initialized;
diff --git a/Swiften/Component/ComponentXMLTracer.h b/Swiften/Component/ComponentXMLTracer.h
index c12ec07..57b9dcf 100644
--- a/Swiften/Component/ComponentXMLTracer.h
+++ b/Swiften/Component/ComponentXMLTracer.h
@@ -7,8 +7,9 @@
#pragma once
+#include <Swiften/Base/API.h>
#include <Swiften/Component/Component.h>
namespace Swift {
- class ComponentXMLTracer {
+ class SWIFTEN_API ComponentXMLTracer {
public:
ComponentXMLTracer(CoreComponent* component);
diff --git a/Swiften/Component/CoreComponent.cpp b/Swiften/Component/CoreComponent.cpp
index e11d2b0..cc6be42 100644
--- a/Swiften/Component/CoreComponent.cpp
+++ b/Swiften/Component/CoreComponent.cpp
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2010-2013 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -21,5 +21,5 @@
namespace Swift {
-CoreComponent::CoreComponent(EventLoop* eventLoop, NetworkFactories* networkFactories, const JID& jid, const std::string& secret) : eventLoop(eventLoop), networkFactories(networkFactories), resolver_(eventLoop), jid_(jid), secret_(secret), disconnectRequested_(false) {
+CoreComponent::CoreComponent(const JID& jid, const std::string& secret, NetworkFactories* networkFactories) : networkFactories(networkFactories), jid_(jid), secret_(secret), disconnectRequested_(false) {
stanzaChannel_ = new ComponentSessionStanzaChannel();
stanzaChannel_->onMessageReceived.connect(boost::ref(onMessageReceived));
@@ -45,5 +45,5 @@ CoreComponent::~CoreComponent() {
void CoreComponent::connect(const std::string& host, int port) {
assert(!connector_);
- connector_ = ComponentConnector::create(host, port, &resolver_, networkFactories->getConnectionFactory(), networkFactories->getTimerFactory());
+ connector_ = ComponentConnector::create(host, port, networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory());
connector_->onConnectFinished.connect(boost::bind(&CoreComponent::handleConnectorFinished, this, _1));
connector_->setTimeoutMilliseconds(60*1000);
@@ -68,5 +68,5 @@ void CoreComponent::handleConnectorFinished(boost::shared_ptr<Connection> connec
sessionStream_->onDataWritten.connect(boost::bind(&CoreComponent::handleDataWritten, this, _1));
- session_ = ComponentSession::create(jid_, secret_, sessionStream_);
+ session_ = ComponentSession::create(jid_, secret_, sessionStream_, networkFactories->getCryptoProvider());
stanzaChannel_->setSession(session_);
session_->onFinished.connect(boost::bind(&CoreComponent::handleSessionFinished, this, _1));
@@ -86,7 +86,7 @@ void CoreComponent::disconnect() {
assert(!session_);
}
- assert(!session_);
- assert(!sessionStream_);
- assert(!connector_);
+ //assert(!session_); /* commenting out until we have time to refactor to be like CoreClient */
+ //assert(!sessionStream_);
+ //assert(!connector_);
disconnectRequested_ = false;
}
@@ -162,3 +162,7 @@ void CoreComponent::sendPresence(boost::shared_ptr<Presence> presence) {
}
+void CoreComponent::sendData(const std::string& data) {
+ sessionStream_->writeData(data);
+}
+
}
diff --git a/Swiften/Component/CoreComponent.h b/Swiften/Component/CoreComponent.h
index e7945d1..e9fdd88 100644
--- a/Swiften/Component/CoreComponent.h
+++ b/Swiften/Component/CoreComponent.h
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2010-2013 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -9,7 +9,7 @@
#include <boost/shared_ptr.hpp>
+#include <Swiften/Base/API.h>
#include <Swiften/Base/boost_bsignals.h>
#include <Swiften/Base/Error.h>
-#include <Swiften/Network/PlatformDomainNameResolver.h>
#include <Swiften/Component/ComponentConnector.h>
#include <Swiften/Component/ComponentSession.h>
@@ -26,4 +26,5 @@
namespace Swift {
+ class EventLoop;
class IQRouter;
class NetworkFactories;
@@ -41,7 +42,7 @@ namespace Swift {
* for most needs.
*/
- class CoreComponent : public Entity {
+ class SWIFTEN_API CoreComponent : public Entity {
public:
- CoreComponent(EventLoop* eventLoop, NetworkFactories* networkFactories, const JID& jid, const std::string& secret);
+ CoreComponent(const JID& jid, const std::string& secret, NetworkFactories* networkFactories);
~CoreComponent();
@@ -51,4 +52,5 @@ namespace Swift {
void sendMessage(boost::shared_ptr<Message>);
void sendPresence(boost::shared_ptr<Presence>);
+ void sendData(const std::string& data);
IQRouter* getIQRouter() const {
@@ -88,7 +90,5 @@ namespace Swift {
private:
- EventLoop* eventLoop;
NetworkFactories* networkFactories;
- PlatformDomainNameResolver resolver_;
JID jid_;
std::string secret_;
diff --git a/Swiften/Component/UnitTest/ComponentHandshakeGeneratorTest.cpp b/Swiften/Component/UnitTest/ComponentHandshakeGeneratorTest.cpp
index fd8f6fc..280e46e 100644
--- a/Swiften/Component/UnitTest/ComponentHandshakeGeneratorTest.cpp
+++ b/Swiften/Component/UnitTest/ComponentHandshakeGeneratorTest.cpp
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2010-2013 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -9,4 +9,6 @@
#include <Swiften/Component/ComponentHandshakeGenerator.h>
+#include <Swiften/Crypto/CryptoProvider.h>
+#include <Swiften/Crypto/PlatformCryptoProvider.h>
using namespace Swift;
@@ -19,14 +21,20 @@ class ComponentHandshakeGeneratorTest : public CppUnit::TestFixture {
public:
+ void setUp() {
+ crypto = boost::shared_ptr<CryptoProvider>(PlatformCryptoProvider::create());
+ }
+
void testGetHandshake() {
- std::string result = ComponentHandshakeGenerator::getHandshake("myid", "mysecret");
+ std::string result = ComponentHandshakeGenerator::getHandshake("myid", "mysecret", crypto.get());
CPPUNIT_ASSERT_EQUAL(std::string("4011cd31f9b99ac089a0cd7ce297da7323fa2525"), result);
}
void testGetHandshake_SpecialChars() {
- std::string result = ComponentHandshakeGenerator::getHandshake("&<", ">'\"");
+ std::string result = ComponentHandshakeGenerator::getHandshake("&<", ">'\"", crypto.get());
CPPUNIT_ASSERT_EQUAL(std::string("33631b3e0aaeb2a11c4994c917919324028873fe"), result);
}
+ private:
+ boost::shared_ptr<CryptoProvider> crypto;
};
diff --git a/Swiften/Component/UnitTest/ComponentSessionTest.cpp b/Swiften/Component/UnitTest/ComponentSessionTest.cpp
index da9ca7d..79d9ab3 100644
--- a/Swiften/Component/UnitTest/ComponentSessionTest.cpp
+++ b/Swiften/Component/UnitTest/ComponentSessionTest.cpp
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2010-2014 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -15,4 +15,6 @@
#include <Swiften/Elements/ComponentHandshake.h>
#include <Swiften/Elements/AuthFailure.h>
+#include <Swiften/Crypto/CryptoProvider.h>
+#include <Swiften/Crypto/PlatformCryptoProvider.h>
using namespace Swift;
@@ -29,4 +31,5 @@ class ComponentSessionTest : public CppUnit::TestFixture {
server = boost::make_shared<MockSessionStream>();
sessionFinishedReceived = false;
+ crypto = boost::shared_ptr<CryptoProvider>(PlatformCryptoProvider::create());
}
@@ -71,5 +74,5 @@ class ComponentSessionTest : public CppUnit::TestFixture {
private:
boost::shared_ptr<ComponentSession> createSession() {
- boost::shared_ptr<ComponentSession> session = ComponentSession::create(JID("service.foo.com"), "servicesecret", server);
+ boost::shared_ptr<ComponentSession> session = ComponentSession::create(JID("service.foo.com"), "servicesecret", server, crypto.get());
session->onFinished.connect(boost::bind(&ComponentSessionTest::handleSessionFinished, this, _1));
return session;
@@ -84,9 +87,9 @@ class ComponentSessionTest : public CppUnit::TestFixture {
public:
struct Event {
- Event(boost::shared_ptr<Element> element) : element(element), footer(false) {}
+ Event(boost::shared_ptr<ToplevelElement> element) : element(element), footer(false) {}
Event(const ProtocolHeader& header) : header(header), footer(false) {}
Event() : footer(true) {}
- boost::shared_ptr<Element> element;
+ boost::shared_ptr<ToplevelElement> element;
boost::optional<ProtocolHeader> header;
bool footer;
@@ -112,5 +115,5 @@ class ComponentSessionTest : public CppUnit::TestFixture {
}
- virtual void writeElement(boost::shared_ptr<Element> element) {
+ virtual void writeElement(boost::shared_ptr<ToplevelElement> element) {
receivedEvents.push_back(Event(element));
}
@@ -139,4 +142,8 @@ class ComponentSessionTest : public CppUnit::TestFixture {
}
+ virtual std::vector<Certificate::ref> getPeerCertificateChain() const {
+ return std::vector<Certificate::ref>();
+ }
+
virtual boost::shared_ptr<CertificateVerificationError> getPeerCertificateVerificationError() const {
return boost::shared_ptr<CertificateVerificationError>();
@@ -207,6 +214,6 @@ class ComponentSessionTest : public CppUnit::TestFixture {
boost::shared_ptr<MockSessionStream> server;
bool sessionFinishedReceived;
- bool needCredentials;
boost::shared_ptr<Error> sessionFinishedError;
+ boost::shared_ptr<CryptoProvider> crypto;
};