[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