[telepathy-qt4/master] IncomingFileTransferChannel: Added Port access control support.

Andre Moreira Magalhaes (andrunko) andre.magalhaes at collabora.co.uk
Tue Sep 22 20:04:02 PDT 2009


---
 TelepathyQt4/incoming-file-transfer-channel.cpp |   41 ++++++++++++++++++++---
 1 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/TelepathyQt4/incoming-file-transfer-channel.cpp b/TelepathyQt4/incoming-file-transfer-channel.cpp
index 37c5546..f3dd6bb 100644
--- a/TelepathyQt4/incoming-file-transfer-channel.cpp
+++ b/TelepathyQt4/incoming-file-transfer-channel.cpp
@@ -31,6 +31,7 @@
 #include <TelepathyQt4/Types>
 
 #include <QIODevice>
+#include <QTcpServer>
 #include <QTcpSocket>
 
 namespace Tp
@@ -46,6 +47,7 @@ struct IncomingFileTransferChannel::Private
 
     QIODevice *output;
     QTcpSocket *socket;
+    SocketAccessControl accessControl;
     SocketAddressIPv4 addr;
 };
 
@@ -164,9 +166,35 @@ PendingOperation *IncomingFileTransferChannel::acceptFile(qulonglong offset,
 
     mPriv->output = output;
 
+    QDBusVariant accessControlParam;
+    SupportedSocketMap socketTypes = availableSocketTypes();
+    UIntList addressTypeList = socketTypes.value(SocketAddressTypeIPv4);
+    if (addressTypeList.contains(SocketAccessControlPort)) {
+        debug() << "Using SocketAccessControlPort";
+
+        QTcpServer tcpServer;
+        tcpServer.listen(QHostAddress("127.0.0.1"));
+        quint16 port = tcpServer.serverPort();
+        tcpServer.close();
+
+        SocketAddressIPv4 addr;
+        addr.address = "127.0.0.1";
+        addr.port = port;
+
+        mPriv->accessControl = SocketAccessControlPort;
+        // set port here
+        mPriv->addr.port = port;
+        accessControlParam.setVariant(qVariantFromValue(addr));
+    } else {
+        debug() << "Using SocketAccessControlLocalhost";
+
+        mPriv->accessControl = SocketAccessControlLocalhost;
+        accessControlParam = QDBusVariant(QVariant(QString()));
+    }
+
     PendingVariant *pv = new PendingVariant(
             fileTransferInterface(BypassInterfaceCheck)->AcceptFile(SocketAddressTypeIPv4,
-                SocketAccessControlLocalhost, QDBusVariant(QVariant(QString())),
+                mPriv->accessControl, accessControlParam,
                 offset),
             this);
     connect(pv,
@@ -184,10 +212,13 @@ void IncomingFileTransferChannel::onAcceptFileFinished(PendingOperation *op)
         return;
     }
 
-    PendingVariant *pv = qobject_cast<PendingVariant *>(op);
-    mPriv->addr = qdbus_cast<SocketAddressIPv4>(pv->result());
-    debug().nospace() << "Got address " << mPriv->addr.address <<
-        ":" << mPriv->addr.port;
+    if (mPriv->accessControl == SocketAccessControlLocalhost) {
+        PendingVariant *pv = qobject_cast<PendingVariant *>(op);
+        mPriv->addr = qdbus_cast<SocketAddressIPv4>(pv->result());
+    } else {
+        mPriv->addr.address = "127.0.0.1";
+        // the port was already set in acceptFile
+    }
 
     if (state() == FileTransferStateOpen) {
         // now we have the address and we are already opened,
-- 
1.5.6.5




More information about the telepathy-commits mailing list