[SCM] ktp-common-internals packaging branch, master, updated. debian/15.12.1-2-1839-gf0635e9
Maximiliano Curia
maxy at moszumanska.debian.org
Mon May 9 09:08:20 UTC 2016
Gitweb-URL: http://git.debian.org/?p=pkg-kde/applications/ktp-common-internals.git;a=commitdiff;h=ab063bf
The following commit has been merged in the master branch:
commit ab063bfad8417c4538230b2f7cf983d8f8ab5b74
Author: Marcin Ziemiński <zieminn at gmail.com>
Date: Mon Jul 28 21:02:47 2014 +0200
Connected OTR implementation to dbus interfaces.
Signed-off-by: Marcin Ziemiński <zieminn at gmail.com>
---
otr-proxy/KTpProxy/CMakeLists.txt | 4 +
otr-proxy/KTpProxy/constants.h | 1 +
otr-proxy/KTpProxy/ktp-proxy-config.kcfg | 25 ++++
otr-proxy/KTpProxy/ktp-proxy-config.kcfgc | 7 ++
otr-proxy/KTpProxy/main.cpp | 5 +-
.../test-session.cpp => KTpProxy/otr-config.cpp} | 61 ++++++----
otr-proxy/KTpProxy/otr-config.h | 6 +-
otr-proxy/KTpProxy/otr-proxy-channel-adaptee.cpp | 131 +++++++++++++++++----
otr-proxy/KTpProxy/otr-proxy-channel-adaptee.h | 23 +++-
otr-proxy/KTpProxy/otr-proxy-channel.cpp | 19 ++-
otr-proxy/KTpProxy/otr-proxy-channel.h | 19 ++-
otr-proxy/KTpProxy/otr-session.cpp | 50 +++++++-
otr-proxy/KTpProxy/otr-session.h | 30 +++--
otr-proxy/KTpProxy/otr-utils.h | 11 +-
otr-proxy/KTpProxy/proxy-observer.cpp | 7 +-
otr-proxy/KTpProxy/proxy-service.cpp | 63 +++++++---
otr-proxy/KTpProxy/proxy-service.h | 6 +-
otr-proxy/spec/ChannelProxy_Interface_OTR.xml | 5 +
otr-proxy/test/otr-test.cpp | 4 +-
19 files changed, 382 insertions(+), 95 deletions(-)
diff --git a/otr-proxy/KTpProxy/CMakeLists.txt b/otr-proxy/KTpProxy/CMakeLists.txt
index 5c220e7..077e3d7 100644
--- a/otr-proxy/KTpProxy/CMakeLists.txt
+++ b/otr-proxy/KTpProxy/CMakeLists.txt
@@ -10,8 +10,12 @@ set(ktp-proxy_SRCS
otr-session.cpp
otr-manager.cpp
otr-message.cpp
+ otr-config.cpp
)
+kde4_add_kcfg_files(ktp-proxy_SRCS ktp-proxy-config.kcfgc)
+install(FILES ktp-proxy-config.kcfg DESTINATION ${KCFG_INSTALL_DIR})
+
kde4_add_library(ktp-proxy-lib STATIC ${ktp-proxy_SRCS})
set(ktp-proxy_LIBS
diff --git a/otr-proxy/KTpProxy/constants.h b/otr-proxy/KTpProxy/constants.h
index 578c5d4..db1c168 100644
--- a/otr-proxy/KTpProxy/constants.h
+++ b/otr-proxy/KTpProxy/constants.h
@@ -25,5 +25,6 @@
#define KTP_PROXY_CHANNEL_OBJECT_PATH_PREFIX (QString::fromLatin1("/org/freedesktop/TelepathyProxy/OtrChannelProxy/"))
#define KTP_PROXY_ERROR_NOT_CONNECTED (QString::fromLatin1("org.freedesktop.TelepathyProxy.Error.NotConnected"))
+#define KTP_PROXY_ERROR_ENCRYPTION_ERROR (QString::fromLatin1("org.freedesktop.TelepathyProxy.Error.EncryptionError"))
#endif
diff --git a/otr-proxy/KTpProxy/ktp-proxy-config.kcfg b/otr-proxy/KTpProxy/ktp-proxy-config.kcfg
new file mode 100644
index 0000000..e1ac6bb
--- /dev/null
+++ b/otr-proxy/KTpProxy/ktp-proxy-config.kcfg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
+<kcfg>
+<kcfgfile name="ktp-proxy-config"/>
+ <group name="Policy">
+ <entry name="OTRPolicy" type="Enum">
+ <label> OTR policy to choose </label>
+ <choices>
+ <choice name="Always">
+ <label>Always encrypt outgoing messages</label>
+ </choice>
+ <choice name="Opportunistic">
+ <label>Automatically encrypt messages if the other side supports OTR</label>
+ </choice>
+ <choice name="Manual">
+ <label>Encrypt messages if the other side requests an OTR connection</label>
+ </choice>
+ <choice name="Never">
+ <label>Never encrypt outgoing messages</label>
+ </choice>
+ </choices>
+ <default>Manual</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/otr-proxy/KTpProxy/ktp-proxy-config.kcfgc b/otr-proxy/KTpProxy/ktp-proxy-config.kcfgc
new file mode 100644
index 0000000..cc2ef62
--- /dev/null
+++ b/otr-proxy/KTpProxy/ktp-proxy-config.kcfgc
@@ -0,0 +1,7 @@
+File=ktp-proxy-config.kcfg
+ClassName=KTpProxyConfig
+Singleton=true
+Mutators=true
+MemberVariables=private
+ItemAccessors=true
+GlobalEnums=true
diff --git a/otr-proxy/KTpProxy/main.cpp b/otr-proxy/KTpProxy/main.cpp
index e58c800..59e2685 100644
--- a/otr-proxy/KTpProxy/main.cpp
+++ b/otr-proxy/KTpProxy/main.cpp
@@ -18,6 +18,7 @@
***************************************************************************/
#include "proxy-service.h"
+#include "otr-config.h"
#include "version.h"
#include <KAboutData>
@@ -56,9 +57,11 @@ int main(int argc, char *argv[])
Tp::registerTypes();
OTRL_INIT;
+ OTR::Config config;
+
Tp::DBusError error;
QDBusConnection dbusConnection = QDBusConnection::sessionBus();
- ProxyService ps(dbusConnection);
+ ProxyService ps(dbusConnection, &config);
ps.registerService(&error);
if(error.isValid())
diff --git a/otr-proxy/test/lib/test-session.cpp b/otr-proxy/KTpProxy/otr-config.cpp
similarity index 50%
copy from otr-proxy/test/lib/test-session.cpp
copy to otr-proxy/KTpProxy/otr-config.cpp
index 2f442b7..a06be4e 100644
--- a/otr-proxy/test/lib/test-session.cpp
+++ b/otr-proxy/KTpProxy/otr-config.cpp
@@ -17,39 +17,54 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-#include "test-session.h"
+#include "otr-config.h"
+#include "ktp-proxy-config.h"
+
+#include <KGlobal>
+#include <KStandardDirs>
+
+#include <QLatin1String>
namespace OTR
{
-
- TestSession::TestSession(const SessionContext &context, Manager *parent)
- : Session(context, parent)
+ QString Config::saveLocation()
{
+ return KGlobal::dirs()->saveLocation("data", QLatin1String("ktp_proxy/"), true);
}
- void TestSession::handleMessage(const Message &message)
+ OtrlPolicy Config::getPolicy() const
{
- if(message.isOTRevent()) {
- eventQueue.push_back(message);
- } else {
- mesQueue.push_back(message);
- }
- }
+ KTpProxyConfig::EnumOTRPolicy policy =
+ static_cast<KTpProxyConfig::EnumOTRPolicy>(KTpProxyConfig::oTRPolicy());
- void TestSession::handleSmpEvent(OtrlSMPEvent smpEvent)
- {
- // NOT implemented yet
- Q_UNUSED(smpEvent);
- }
-
- int TestSession::recipientStatus() const
- {
- // user is online
- return 1;
+ switch(policy) {
+ case KTpProxyConfig::Always:
+ return OTRL_POLICY_ALWAYS;
+ case KTpProxyConfig::Opportunistic:
+ return OTRL_POLICY_OPPORTUNISTIC;
+ case KTpProxyConfig::Manual:
+ return OTRL_POLICY_MANUAL;
+ case KTpProxyConfig::Never:
+ return OTRL_POLICY_NEVER;
+ }
+ return OTRL_POLICY_MANUAL;
}
- unsigned int TestSession::maxMessageSize() const
+ void Config::setPolicy(OtrlPolicy policy)
{
- return maxSize;
+ switch(policy) {
+ case OTRL_POLICY_ALWAYS:
+ KTpProxyConfig::setOTRPolicy(KTpProxyConfig::Always);
+ return;
+ case OTRL_POLICY_OPPORTUNISTIC:
+ KTpProxyConfig::setOTRPolicy(KTpProxyConfig::Opportunistic);
+ return;
+ case OTRL_POLICY_MANUAL:
+ KTpProxyConfig::setOTRPolicy(KTpProxyConfig::Manual);
+ return;
+ case OTRL_POLICY_NEVER:
+ KTpProxyConfig::setOTRPolicy(KTpProxyConfig::Never);
+ return;
+ }
}
}
diff --git a/otr-proxy/KTpProxy/otr-config.h b/otr-proxy/KTpProxy/otr-config.h
index d86824b..f85210b 100644
--- a/otr-proxy/KTpProxy/otr-config.h
+++ b/otr-proxy/KTpProxy/otr-config.h
@@ -34,9 +34,9 @@ namespace OTR
public:
virtual ~Config() = default;
- virtual QString saveLocation() = 0;
- virtual OtrlPolicy getPolicy() const = 0;
- virtual void setPolicy(OtrlPolicy policy) = 0;
+ virtual QString saveLocation();
+ virtual OtrlPolicy getPolicy() const;
+ virtual void setPolicy(OtrlPolicy policy);
};
diff --git a/otr-proxy/KTpProxy/otr-proxy-channel-adaptee.cpp b/otr-proxy/KTpProxy/otr-proxy-channel-adaptee.cpp
index 09342e5..2577749 100644
--- a/otr-proxy/KTpProxy/otr-proxy-channel-adaptee.cpp
+++ b/otr-proxy/KTpProxy/otr-proxy-channel-adaptee.cpp
@@ -19,6 +19,8 @@
#include "otr-proxy-channel-adaptee.h"
#include "otr-proxy-channel.h"
+#include "otr-constants.h"
+#include "otr-manager.h"
#include "constants.h"
#include "pending-curry-operation.h"
@@ -27,8 +29,6 @@
#include <KDebug>
-// TODO
-// - add errors to spec
class PendingSendMessageResult : public PendingCurryOperation
{
@@ -37,12 +37,14 @@ class PendingSendMessageResult : public PendingCurryOperation
const Tp::TextChannelPtr &chan,
const Tp::Service::ChannelProxyInterfaceOTRAdaptor::SendMessageContextPtr &context,
const Tp::MessagePartList &message,
- uint flags)
+ uint flags,
+ bool isOTRmessage = false)
: PendingCurryOperation(op, Tp::SharedPtr<Tp::RefCounted>::dynamicCast(chan)),
token(QString::fromLatin1("")),
context(context),
message(message),
- flags(flags)
+ flags(flags),
+ isOTRmessage(isOTRmessage)
{ }
Tp::Service::ChannelProxyInterfaceOTRAdaptor::SendMessageContextPtr getContext()
@@ -75,16 +77,25 @@ class PendingSendMessageResult : public PendingCurryOperation
Tp::Service::ChannelProxyInterfaceOTRAdaptor::SendMessageContextPtr context;
Tp::MessagePartList message;
uint flags;
+ public:
+ const bool isOTRmessage;
};
-OtrProxyChannel::Adaptee::Adaptee(OtrProxyChannel *pc, const QDBusConnection &dbusConnection, const Tp::TextChannelPtr &channel)
+OtrProxyChannel::Adaptee::Adaptee(OtrProxyChannel *pc,
+ const QDBusConnection &dbusConnection,
+ const Tp::TextChannelPtr &channel,
+ const OTR::SessionContext &context,
+ OTR::Manager *manager)
: adaptor(new Tp::Service::ChannelProxyInterfaceOTRAdaptor(dbusConnection, this, pc->dbusObject())),
pc(pc),
chan(channel),
- isConnected(false)
+ isConnected(false),
+ otrSes(this, context, manager)
{
connect(chan.data(), SIGNAL(invalidated(Tp::DBusProxy*,const QString&,const QString&)), SIGNAL(closed()));
+ connect(&otrSes, SIGNAL(trustLevelChanged(TrustLevel)), SLOT(onTrustLevelChanged(TrustLevel)));
+ connect(&otrSes, SIGNAL(sessionRefreshed()), SIGNAL(sessionRefreshed()));
}
QDBusObjectPath OtrProxyChannel::Adaptee::wrappedChannel() const
@@ -109,7 +120,7 @@ Tp::MessagePartListList OtrProxyChannel::Adaptee::pendingMessages() const
uint OtrProxyChannel::Adaptee::trustLevel() const
{
- return 0;
+ return static_cast<uint>(otrSes.trustLevel());
}
QString OtrProxyChannel::Adaptee::localFingerprint() const
@@ -150,6 +161,9 @@ void OtrProxyChannel::Adaptee::connectProxy(
void OtrProxyChannel::Adaptee::disconnectProxy(
const Tp::Service::ChannelProxyInterfaceOTRAdaptor::DisconnectProxyContextPtr &context)
{
+ if(otrSes.trustLevel() != OTR::TrustLevel::NOT_PRIVATE) {
+ otrSes.stopSession();
+ }
kDebug() << "Disconnecting proxy: " << pc->objectPath();
disconnect(chan.data(), SIGNAL(messageReceived(const Tp::ReceivedMessage&)),
this, SLOT(onMessageReceived(const Tp::ReceivedMessage&)));
@@ -162,6 +176,37 @@ void OtrProxyChannel::Adaptee::disconnectProxy(
context->setFinished();
}
+void OtrProxyChannel::Adaptee::processOTRmessage(const OTR::Message &message)
+{
+ kDebug();
+ switch(message.direction()) {
+ case OTR::MessageDirection::INTERNAL:
+ case OTR::MessageDirection::FROM_PEER:
+ Q_EMIT messageReceived(message.parts());
+ return;
+ case OTR::MessageDirection::TO_PEER:
+ sendOTRmessage(message);
+ return;
+ }
+}
+
+void OtrProxyChannel::Adaptee::sendOTRmessage(const OTR::Message &message)
+{
+ kDebug();
+ uint flags = 0;
+ PendingSendMessageResult *pending = new PendingSendMessageResult(
+ chan->send(message.parts(), (Tp::MessageSendingFlags) flags),
+ chan,
+ Tp::Service::ChannelProxyInterfaceOTRAdaptor::SendMessageContextPtr(),
+ message.parts(),
+ flags,
+ true);
+
+ connect(pending,
+ SIGNAL(finished(Tp::PendingOperation*)),
+ SLOT(onPendingSendFinished(Tp::PendingOperation*)));
+}
+
void OtrProxyChannel::Adaptee::sendMessage(const Tp::MessagePartList &message, uint flags,
const Tp::Service::ChannelProxyInterfaceOTRAdaptor::SendMessageContextPtr &context)
{
@@ -170,12 +215,20 @@ void OtrProxyChannel::Adaptee::sendMessage(const Tp::MessagePartList &message, u
return;
}
+ OTR::Message otrMessage(message);
+ const OTR::CryptResult cres = otrSes.encrypt(otrMessage);
+ if(cres == OTR::CryptResult::ERROR) {
+ context->setFinishedWithError(KTP_PROXY_ERROR_ENCRYPTION_ERROR,
+ QLatin1String("Message could not be encrypted with OTR"));
+ return;
+ }
+
kDebug();
PendingSendMessageResult *pending = new PendingSendMessageResult(
- chan->send(message, (Tp::MessageSendingFlags) flags),
+ chan->send(otrMessage.parts(), (Tp::MessageSendingFlags) flags),
chan,
context,
- message,
+ otrMessage.parts(),
flags);
connect(pending,
@@ -212,10 +265,13 @@ void OtrProxyChannel::Adaptee::acknowledgePendingMessages(const Tp::UIntList &id
void OtrProxyChannel::Adaptee::initialize(const Tp::Service::ChannelProxyInterfaceOTRAdaptor::InitializeContextPtr &context)
{
+ kDebug();
if(!connected()) {
context->setFinishedWithError(KTP_PROXY_ERROR_NOT_CONNECTED, QString::fromLatin1("Proxy is not connected"));
return;
}
+
+ sendOTRmessage(otrSes.startSession());
context->setFinished();
}
@@ -225,16 +281,26 @@ void OtrProxyChannel::Adaptee::stop(const Tp::Service::ChannelProxyInterfaceOTRA
context->setFinishedWithError(KTP_PROXY_ERROR_NOT_CONNECTED, QString::fromLatin1("Proxy is not connected"));
return;
}
+ otrSes.stopSession();
context->setFinished();
}
void OtrProxyChannel::Adaptee::trustFingerprint(const QString& fingerprint, bool trust,
const Tp::Service::ChannelProxyInterfaceOTRAdaptor::TrustFingerprintContextPtr &context)
{
- // TODO implement
- Q_UNUSED(fingerprint);
- Q_UNUSED(trust);
+ if(otrSes.remoteFingerprint().isEmpty() || fingerprint != otrSes.remoteFingerprint()) {
+ context->setFinishedWithError(TP_QT_ERROR_INVALID_ARGUMENT,
+ QLatin1String("No such fingerprint currently in use by remote contact"));
+ return;
+ }
+ OTR::TrustFpResult fpRes = otrSes.trustFingerprint(trust);
+ if(fpRes != OTR::TrustFpResult::OK) {
+ // should not happend, TODO clarify
+ context->setFinishedWithError(TP_QT_ERROR_INVALID_ARGUMENT,
+ QLatin1String("No such fingerprint currently in use by remote contact"));
+ return;
+ }
context->setFinished();
}
@@ -242,8 +308,20 @@ void OtrProxyChannel::Adaptee::onMessageReceived(const Tp::ReceivedMessage &rece
{
const uint id = receivedMessage.header()[QLatin1String("pending-message-id")].variant().toUInt(nullptr);
kDebug() << "Received message: " << receivedMessage.text() << " with id: " << id;
- messages.insert(id, receivedMessage);
- Q_EMIT messageReceived(receivedMessage.parts());
+ OTR::Message otrMsg(receivedMessage.parts());
+ const OTR::CryptResult cres = otrSes.decrypt(otrMsg);
+
+ if(cres == OTR::CryptResult::CHANGED || cres == OTR::CryptResult::UNCHANGED) {
+ messages.insert(id, receivedMessage);
+
+ Q_EMIT messageReceived(otrMsg.parts());
+ } else {
+ // Error or OTR message - acknowledge right now
+ if(cres == OTR::CryptResult::ERROR) {
+ kWarning() << "Decryption error of the message: " << otrMsg.text();
+ }
+ chan->acknowledge(QList<Tp::ReceivedMessage>() << receivedMessage);
+ }
}
void OtrProxyChannel::Adaptee::onPendingMessageRemoved(const Tp::ReceivedMessage &receivedMessage)
@@ -252,7 +330,7 @@ void OtrProxyChannel::Adaptee::onPendingMessageRemoved(const Tp::ReceivedMessage
if(messages.remove(id)) {
Q_EMIT pendingMessagesRemoved(Tp::UIntList() << id);
} else {
- kDebug() << "Text channel removed missing pending message with id: " << id;
+ kDebug() << "Text channel removed missing pending message with id or an OTR message: " << id;
}
}
@@ -260,13 +338,24 @@ void OtrProxyChannel::Adaptee::onPendingSendFinished(Tp::PendingOperation *op)
{
PendingSendMessageResult *sendResult = dynamic_cast<PendingSendMessageResult*>(op);
- Tp::Service::ChannelProxyInterfaceOTRAdaptor::SendMessageContextPtr ctx = sendResult->getContext();
-
- if(sendResult->isError()) {
- ctx->setFinishedWithError(sendResult->errorName(), sendResult->errorMessage());
+ if(sendResult->isOTRmessage) {
+ if(sendResult->isError()) {
+ // TODO check the message and provide information to the user
+ }
} else {
- ctx->setFinished(sendResult->getToken());
- Q_EMIT messageSent(sendResult->getMessage(), sendResult->getFlags(), sendResult->getToken());
+ Tp::Service::ChannelProxyInterfaceOTRAdaptor::SendMessageContextPtr ctx = sendResult->getContext();
+
+ if(sendResult->isError()) {
+ ctx->setFinishedWithError(sendResult->errorName(), sendResult->errorMessage());
+ } else {
+ ctx->setFinished(sendResult->getToken());
+ Q_EMIT messageSent(sendResult->getMessage(), sendResult->getFlags(), sendResult->getToken());
+ }
}
}
+void OtrProxyChannel::Adaptee::onTrustLevelChanged(TrustLevel trustLevel)
+{
+ Q_EMIT trustLevelChanged(static_cast<uint>(trustLevel));
+}
+
diff --git a/otr-proxy/KTpProxy/otr-proxy-channel-adaptee.h b/otr-proxy/KTpProxy/otr-proxy-channel-adaptee.h
index efa8eb7..eedca55 100644
--- a/otr-proxy/KTpProxy/otr-proxy-channel-adaptee.h
+++ b/otr-proxy/KTpProxy/otr-proxy-channel-adaptee.h
@@ -22,12 +22,21 @@
#include "svc-channel-proxy.h"
#include "otr-proxy-channel.h"
+#include "otr-session.h"
+#include "otr-message.h"
#include <TelepathyQt/ReceivedMessage>
#include <QDBusObjectPath>
#include <QDBusConnection>
+using namespace OTR;
+
+namespace OTR
+{
+ class Manager;
+}
+
class OtrProxyChannel::Adaptee : public QObject
{
Q_OBJECT
@@ -39,7 +48,11 @@ class OtrProxyChannel::Adaptee : public QObject
Q_PROPERTY(QString remoteFingerprint READ remoteFingerprint)
public:
- Adaptee(OtrProxyChannel *pc, const QDBusConnection &dbusConnection, const Tp::TextChannelPtr &channel);
+ Adaptee(OtrProxyChannel *pc,
+ const QDBusConnection &dbusConnection,
+ const Tp::TextChannelPtr &channel,
+ const OTR::SessionContext &context,
+ OTR::Manager *manager);
QDBusObjectPath wrappedChannel() const;
bool connected() const;
@@ -50,6 +63,10 @@ class OtrProxyChannel::Adaptee : public QObject
Tp::TextChannelPtr channel() const;
+ void processOTRmessage(const OTR::Message &message);
+ private:
+ void sendOTRmessage(const OTR::Message &message);
+
private Q_SLOTS:
void connectProxy(const Tp::Service::ChannelProxyInterfaceOTRAdaptor::ConnectProxyContextPtr &context);
void disconnectProxy(const Tp::Service::ChannelProxyInterfaceOTRAdaptor::DisconnectProxyContextPtr &context);
@@ -65,9 +82,10 @@ class OtrProxyChannel::Adaptee : public QObject
void onMessageReceived(const Tp::ReceivedMessage &receivedMessage);
void onPendingMessageRemoved(const Tp::ReceivedMessage &receivedMessage);
-
void onPendingSendFinished(Tp::PendingOperation *pendingSend);
+ void onTrustLevelChanged(TrustLevel trustLevel);
+
Q_SIGNALS:
void messageSent(const Tp::MessagePartList &content, uint flags, const QString &messageToken);
void messageReceived(const Tp::MessagePartList &message);
@@ -81,6 +99,7 @@ class OtrProxyChannel::Adaptee : public QObject
OtrProxyChannel *pc;
Tp::TextChannelPtr chan;
bool isConnected;
+ OTR::ProxySession otrSes;
QMap<uint, Tp::ReceivedMessage> messages; // queue
};
diff --git a/otr-proxy/KTpProxy/otr-proxy-channel.cpp b/otr-proxy/KTpProxy/otr-proxy-channel.cpp
index 9c4e8f8..b92e6ca 100644
--- a/otr-proxy/KTpProxy/otr-proxy-channel.cpp
+++ b/otr-proxy/KTpProxy/otr-proxy-channel.cpp
@@ -31,17 +31,23 @@ class OtrProxyChannel::Private
public:
Private(const QDBusConnection &dbusConnection,
OtrProxyChannel *pc,
- const Tp::TextChannelPtr &channel)
- : adaptee(pc, dbusConnection, channel)
+ const Tp::TextChannelPtr &channel,
+ const OTR::SessionContext &context,
+ OTR::Manager *manager)
+ : adaptee(pc, dbusConnection, channel, context, manager)
{
}
Adaptee adaptee;
};
-OtrProxyChannel::OtrProxyChannel(const QDBusConnection &dbusConnection, const Tp::TextChannelPtr &channel)
+OtrProxyChannel::OtrProxyChannel(
+ const QDBusConnection &dbusConnection,
+ const Tp::TextChannelPtr &channel,
+ const OTR::SessionContext &context,
+ OTR::Manager *manager)
: Tp::DBusService(dbusConnection),
- d(new Private(dbusConnection, this, channel))
+ d(new Private(dbusConnection, this, channel, context, manager))
{
connect(&d->adaptee, SIGNAL(closed()), SLOT(onClosed()));
}
@@ -51,9 +57,10 @@ OtrProxyChannel::~OtrProxyChannel()
delete d;
}
-OtrProxyChannelPtr OtrProxyChannel::create(const QDBusConnection &dbusConnection, const Tp::TextChannelPtr &channel)
+OtrProxyChannelPtr OtrProxyChannel::create(const QDBusConnection &dbusConnection, const Tp::TextChannelPtr &channel,
+ const OTR::SessionContext &context, OTR::Manager *manager)
{
- return OtrProxyChannelPtr(new OtrProxyChannel(dbusConnection, channel));
+ return OtrProxyChannelPtr(new OtrProxyChannel(dbusConnection, channel, context, manager));
}
void OtrProxyChannel::registerService(Tp::DBusError *error)
diff --git a/otr-proxy/KTpProxy/otr-proxy-channel.h b/otr-proxy/KTpProxy/otr-proxy-channel.h
index e2dd1e6..e472525 100644
--- a/otr-proxy/KTpProxy/otr-proxy-channel.h
+++ b/otr-proxy/KTpProxy/otr-proxy-channel.h
@@ -21,12 +21,18 @@
#define KTP_PROXY_OTR_PROXY_CHANNEL_HEADER
#include "types.h"
+#include "otr-utils.h"
#include <TelepathyQt/DBusService>
#include <TelepathyQt/TextChannel>
#include <QDBusObjectPath>
+namespace OTR
+{
+ class Manager;
+}
+
class OtrProxyChannel : public Tp::DBusService
{
@@ -34,11 +40,15 @@ class OtrProxyChannel : public Tp::DBusService
Q_DISABLE_COPY(OtrProxyChannel)
private:
- OtrProxyChannel(const QDBusConnection &dbusConnection, const Tp::TextChannelPtr &channel);
+ OtrProxyChannel(const QDBusConnection &dbusConnection,
+ const Tp::TextChannelPtr &channel,
+ const OTR::SessionContext &context,
+ OTR::Manager *manager);
public:
~OtrProxyChannel();
- static OtrProxyChannelPtr create(const QDBusConnection &dbusConnection, const Tp::TextChannelPtr &channel);
+ static OtrProxyChannelPtr create(const QDBusConnection &dbusConnection, const Tp::TextChannelPtr &channel,
+ const OTR::SessionContext &context, OTR::Manager *manager);
void registerService(Tp::DBusError *error);
@@ -48,6 +58,9 @@ class OtrProxyChannel : public Tp::DBusService
Tp::TextChannelPtr wrappedChannel() const;
+ class Adaptee;
+ friend class Adaptee;
+
Q_SIGNALS:
void connected(const QDBusObjectPath &proxyPath);
void disconnected(const QDBusObjectPath &proxyPath);
@@ -57,8 +70,6 @@ class OtrProxyChannel : public Tp::DBusService
void onClosed();
private:
- class Adaptee;
- friend class Adaptee;
class Private;
friend class Private;
Private *d;
diff --git a/otr-proxy/KTpProxy/otr-session.cpp b/otr-proxy/KTpProxy/otr-session.cpp
index d729c2f..b9de914 100644
--- a/otr-proxy/KTpProxy/otr-session.cpp
+++ b/otr-proxy/KTpProxy/otr-session.cpp
@@ -19,7 +19,9 @@
#include "otr-session.h"
#include "otr-manager.h"
+#include "otr-message.h"
#include "otr-utils.h"
+#include "otr-proxy-channel-adaptee.h"
extern "C" {
#include <libotr/privkey.h>
@@ -30,6 +32,8 @@ extern "C" {
namespace OTR
{
+ // -------- UserStateBox --------------------------------------------
+
UserStateBox::UserStateBox(OtrlUserState userState)
: us(userState)
{
@@ -62,6 +66,7 @@ namespace OTR
otrl_message_poll(us, 0, 0);
}
+ // -------- Session -------------------------------------------------
Session::Session(const SessionContext &ctx, Manager *parent)
: instance(OTRL_INSTAG_BEST),
@@ -77,12 +82,12 @@ namespace OTR
return tlevel;
}
- UserStateBox* Session::userStateBox()
+ UserStateBox* Session::userStateBox() const
{
return userstate;
}
- Manager* Session::parent()
+ Manager* Session::parent() const
{
return pr;
}
@@ -274,8 +279,45 @@ namespace OTR
void Session::onNewFingerprintReceived(const QString &fingerprint)
{
- //qDebug() << "Received";
- emit newFingeprintReceived(fingerprint);
+ emit newFingerprintReceived(fingerprint);
+ }
+
+ // -------- ProxySession --------------------------------------------
+ ProxySession::ProxySession(OtrProxyChannel::Adaptee *pca, const SessionContext &ctx, Manager *parent)
+ : Session(ctx, parent),
+ pca(pca)
+ {
+ }
+
+ void ProxySession::handleMessage(const Message &message)
+ {
+ pca->processOTRmessage(message);
+ }
+
+ void ProxySession::handleSmpEvent(OtrlSMPEvent smpEvent)
+ {
+ // TODO implement
+ Q_UNUSED(smpEvent);
+ }
+
+ int ProxySession::recipientStatus() const
+ {
+ if(pca->channel()->hasChatStateInterface()) {
+ switch(pca->channel()->chatState(pca->channel()->targetContact())) {
+ case Tp::ChannelChatStateGone:
+ return 0;
+ default:
+ return 1;
+ }
+ } else {
+ return -1;
+ }
+ }
+
+ unsigned int ProxySession::maxMessageSize() const
+ {
+ // FIXME cannot determine maximum message size with Telepathy
+ return 0;
}
} /* namespace OTR */
diff --git a/otr-proxy/KTpProxy/otr-session.h b/otr-proxy/KTpProxy/otr-session.h
index 51c1358..b56bc4d 100644
--- a/otr-proxy/KTpProxy/otr-session.h
+++ b/otr-proxy/KTpProxy/otr-session.h
@@ -22,6 +22,8 @@
#include "otr-message.h"
#include "otr-constants.h"
+#include "otr-proxy-channel.h"
+#include "otr-utils.h"
#include <QString>
#include <QTimer>
@@ -35,14 +37,6 @@ namespace OTR
{
class Manager;
- struct SessionContext
- {
- const QString accountId;
- const QString accountName;
- const QString recipientName;
- const QString protocol;
- };
-
class UserStateBox : public QObject
{
Q_OBJECT
@@ -71,8 +65,8 @@ namespace OTR
Session(const SessionContext &context, Manager *parent);
virtual ~Session() = default;
- UserStateBox* userStateBox();
- Manager* parent();
+ UserStateBox* userStateBox() const;
+ Manager* parent() const;
TrustLevel trustLevel() const;
const SessionContext& context() const;
QString remoteFingerprint() const;
@@ -101,7 +95,7 @@ namespace OTR
Q_SIGNALS:
void trustLevelChanged(TrustLevel trustLevel);
void sessionRefreshed();
- void newFingeprintReceived(const QString &fingeprint);
+ void newFingerprintReceived(const QString &fingeprint);
private:
otrl_instag_t instance;
@@ -112,6 +106,20 @@ namespace OTR
};
typedef QSharedPointer<Session> SessionPtr;
+ class ProxySession : public Session
+ {
+ public:
+ ProxySession(OtrProxyChannel::Adaptee *pca, const SessionContext &ctx, Manager *parent);
+
+ virtual void handleMessage(const Message &message) override;
+ virtual void handleSmpEvent(OtrlSMPEvent smpEvent) override;
+ virtual int recipientStatus() const override;
+ virtual unsigned int maxMessageSize() const override;
+
+ private:
+ OtrProxyChannel::Adaptee *pca;
+ };
+
} /* namespace OTR */
#endif
diff --git a/otr-proxy/KTpProxy/otr-utils.h b/otr-proxy/KTpProxy/otr-utils.h
index 6398116..884dcb5 100644
--- a/otr-proxy/KTpProxy/otr-utils.h
+++ b/otr-proxy/KTpProxy/otr-utils.h
@@ -27,7 +27,16 @@ extern "C" {
}
namespace OTR {
-namespace utils
+
+ struct SessionContext
+ {
+ const QString accountId;
+ const QString accountName;
+ const QString recipientName;
+ const QString protocol;
+ };
+
+namespace utils
{
inline QString humanReadable(const unsigned char fingerprint[20])
{
diff --git a/otr-proxy/KTpProxy/proxy-observer.cpp b/otr-proxy/KTpProxy/proxy-observer.cpp
index 87e7b54..1df7372 100644
--- a/otr-proxy/KTpProxy/proxy-observer.cpp
+++ b/otr-proxy/KTpProxy/proxy-observer.cpp
@@ -45,9 +45,14 @@ void ProxyObserver::observeChannels(
const Tp::AbstractClientObserver::ObserverInfo &observerInfo)
{
+ Q_UNUSED(connection);
+ Q_UNUSED(dispatchOperation);
+ Q_UNUSED(requestsSatisfied);
+ Q_UNUSED(observerInfo);
+
kDebug() << "Observed a channel";
Q_FOREACH(const Tp::ChannelPtr &chan, channels) {
- ps->addChannel(chan);
+ ps->addChannel(chan, account);
}
context->setFinished();
}
diff --git a/otr-proxy/KTpProxy/proxy-service.cpp b/otr-proxy/KTpProxy/proxy-service.cpp
index a40806e..7150fb8 100644
--- a/otr-proxy/KTpProxy/proxy-service.cpp
+++ b/otr-proxy/KTpProxy/proxy-service.cpp
@@ -20,6 +20,8 @@
#include "proxy-service.h"
#include "proxy-observer.h"
#include "otr-proxy-channel.h"
+#include "otr-config.h"
+#include "pending-curry-operation.h"
#include "constants.h"
#include <TelepathyQt/ClientRegistrar>
@@ -29,11 +31,31 @@
#include <KDebug>
#include <KApplication>
-ProxyService::ProxyService(const QDBusConnection &dbusConnection)
+class PendingChannelReadyResult : public PendingCurryOperation
+{
+ public:
+ PendingChannelReadyResult(Tp::PendingOperation *op, const Tp::TextChannelPtr &chan, const Tp::AccountPtr &account)
+ : PendingCurryOperation(op, Tp::SharedPtr<Tp::RefCounted>::dynamicCast(chan)),
+ channel(chan),
+ account(account)
+ {
+ }
+
+ virtual void extract(Tp::PendingOperation *op)
+ {
+ Q_UNUSED(op);
+ }
+
+ Tp::TextChannelPtr channel;
+ Tp::AccountPtr account;
+};
+
+ProxyService::ProxyService(const QDBusConnection &dbusConnection, OTR::Config *config)
: Tp::DBusService(dbusConnection),
adaptee(this, dbusConnection),
observer(new ProxyObserver(this)),
- registrar(Tp::ClientRegistrar::create(dbusConnection))
+ registrar(Tp::ClientRegistrar::create(dbusConnection)),
+ manager(config)
{
}
@@ -42,17 +64,22 @@ ProxyService::~ProxyService()
registrar->unregisterClients();
}
-void ProxyService::addChannel(const Tp::ChannelPtr &channel)
+void ProxyService::addChannel(const Tp::ChannelPtr &channel, const Tp::AccountPtr &account)
{
Tp::TextChannelPtr textChannel = Tp::TextChannel::create(channel->connection(), channel->objectPath(), QVariantMap());
- Tp::PendingReady *pendingReady =
- textChannel->becomeReady(Tp::Features()
- << Tp::TextChannel::FeatureCore
- << Tp::TextChannel::FeatureMessageQueue
- << Tp::TextChannel::FeatureMessageCapabilities
- );
-
- connect(pendingReady, SIGNAL(finished(Tp::PendingOperation*)), SLOT(onChannelReady(Tp::PendingOperation*)));
+
+ PendingChannelReadyResult *pending = new PendingChannelReadyResult(
+ textChannel->becomeReady(Tp::Features()
+ << Tp::TextChannel::FeatureCore
+ << Tp::TextChannel::FeatureMessageQueue
+ << Tp::TextChannel::FeatureMessageCapabilities
+ << Tp::TextChannel::FeatureChatState
+ ),
+ textChannel,
+ account);
+
+
+ connect(pending, SIGNAL(finished(Tp::PendingOperation*)), SLOT(onChannelReady(Tp::PendingOperation*)));
}
void ProxyService::registerService(Tp::DBusError *error)
@@ -90,12 +117,20 @@ void ProxyService::onChannelReady(Tp::PendingOperation *pendingChanReady)
<< pendingChanReady->errorName() << " - " << pendingChanReady->errorMessage();
return;
}
- Tp::PendingReady *pendingReady = dynamic_cast<Tp::PendingReady*>(pendingChanReady);
- Tp::TextChannelPtr textChannel = Tp::TextChannelPtr::dynamicCast(pendingReady->proxy());
+ PendingChannelReadyResult *pendingReady = dynamic_cast<PendingChannelReadyResult*>(pendingChanReady);
+ Tp::TextChannelPtr textChannel = pendingReady->channel;
kDebug() << "Channel ready: " << textChannel->objectPath();
Tp::DBusError error;
- OtrProxyChannelPtr proxyChannel = OtrProxyChannel::create(dbusConnection(), textChannel);
+ OTR::SessionContext ctx =
+ {
+ pendingReady->account->uniqueIdentifier(),
+ pendingReady->account->normalizedName(),
+ textChannel->targetId(),
+ textChannel->connection()->protocolName()
+ };
+
+ OtrProxyChannelPtr proxyChannel = OtrProxyChannel::create(dbusConnection(), textChannel, ctx, &manager);
proxyChannel->registerService(&error);
if(error.isValid()) {
diff --git a/otr-proxy/KTpProxy/proxy-service.h b/otr-proxy/KTpProxy/proxy-service.h
index d395e3d..fae4a9e 100644
--- a/otr-proxy/KTpProxy/proxy-service.h
+++ b/otr-proxy/KTpProxy/proxy-service.h
@@ -23,6 +23,7 @@
#include "proxy-service-adaptee.h"
#include "proxy-observer.h"
#include "types.h"
+#include "otr-manager.h"
#include <TelepathyQt/AbstractClientObserver>
#include <TelepathyQt/Types>
@@ -43,10 +44,10 @@ class ProxyService : public Tp::DBusService
Q_DISABLE_COPY(ProxyService)
public:
- ProxyService(const QDBusConnection &dbusConnection);
+ ProxyService(const QDBusConnection &dbusConnection, OTR::Config *config);
~ProxyService();
- void addChannel(const Tp::ChannelPtr &channel);
+ void addChannel(const Tp::ChannelPtr &channel, const Tp::AccountPtr &account);
void registerService(Tp::DBusError *error);
@@ -63,6 +64,7 @@ class ProxyService : public Tp::DBusService
QMap<OtrProxyChannel*, OtrProxyChannelPtr> channels;
ProxyObserverPtr observer;
Tp::ClientRegistrarPtr registrar;
+ OTR::Manager manager;
};
#endif
diff --git a/otr-proxy/spec/ChannelProxy_Interface_OTR.xml b/otr-proxy/spec/ChannelProxy_Interface_OTR.xml
index edd3f32..59e7552 100644
--- a/otr-proxy/spec/ChannelProxy_Interface_OTR.xml
+++ b/otr-proxy/spec/ChannelProxy_Interface_OTR.xml
@@ -86,6 +86,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</
The proxy is not connected to the channel.
</tp:docstring>
</tp:error>
+ <tp:error name="org.freedesktop.TelepathyProxy.Error.EncryptionError">
+ <tp:docstring>
+ Message could not be encrypted.
+ </tp:docstring>
+ </tp:error>
</tp:possible-errors>
</method>
diff --git a/otr-proxy/test/otr-test.cpp b/otr-proxy/test/otr-test.cpp
index 1c171f8..c4ce6a6 100644
--- a/otr-proxy/test/otr-test.cpp
+++ b/otr-proxy/test/otr-test.cpp
@@ -183,9 +183,9 @@ void OTRTest::testSimpleSession()
TestSession &alice = aliceEnv->ses;
TestSession &bob = bobEnv->ses;
- QVERIFY(connect(&alice, SIGNAL(newFingeprintReceived(const QString&)),
+ QVERIFY(connect(&alice, SIGNAL(newFingerprintReceived(const QString&)),
aliceEnv, SLOT(onNewFingerprintReceived(const QString&))));
- QVERIFY(connect(&bob, SIGNAL(newFingeprintReceived(const QString&)),
+ QVERIFY(connect(&bob, SIGNAL(newFingerprintReceived(const QString&)),
bobEnv, SLOT(onNewFingerprintReceived(const QString&))));
Message mes = alice.startSession();
--
ktp-common-internals packaging
More information about the pkg-kde-commits
mailing list