aboutsummaryrefslogtreecommitdiff
path: root/src/client/QXmppUploadRequestManager.h
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2019-05-05 14:58:42 +0200
committerLNJ <lnj@kaidan.im>2019-10-20 17:01:35 +0200
commit6b3e41ee933b260a80b3ec197c7e76a14eb4ba4a (patch)
tree35b4af6bf99d5c22e55984ac54508fef2938b970 /src/client/QXmppUploadRequestManager.h
parenta4ac49e2e3c69ba2d42558fbfb52eaa931ca8e28 (diff)
downloadqxmpp-6b3e41ee933b260a80b3ec197c7e76a14eb4ba4a.tar.gz
Implement XEP-0363: HTTP File Upload: UploadRequestManager
This adds a manager to simplify service discovery and IQ sending for XEP-0363: HTTP File Upload.
Diffstat (limited to 'src/client/QXmppUploadRequestManager.h')
-rw-r--r--src/client/QXmppUploadRequestManager.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/client/QXmppUploadRequestManager.h b/src/client/QXmppUploadRequestManager.h
new file mode 100644
index 00000000..bebf9954
--- /dev/null
+++ b/src/client/QXmppUploadRequestManager.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2008-2019 The QXmpp developers
+ *
+ * Author:
+ * Linus Jahn <lnj@kaidan.im>
+ *
+ * Source:
+ * https://github.com/qxmpp-project/qxmpp
+ *
+ * This file is a part of QXmpp library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#ifndef QXMPPUPLOADREQUESTMANAGER_H
+#define QXMPPUPLOADREQUESTMANAGER_H
+
+#include <QXmppClientExtension.h>
+#include <QSharedDataPointer>
+
+class QFileInfo;
+class QMimeType;
+class QXmppHttpUploadRequestIq;
+class QXmppHttpUploadSlotIq;
+class QXmppUploadServicePrivate;
+class QXmppUploadRequestManagerPrivate;
+
+/// \class QXmppUploadService The QXmppUploadService represents an HTTP File
+/// Upload service.
+///
+/// It is only used to store the JID and maximum file size for uploads.
+
+class QXMPP_EXPORT QXmppUploadService
+{
+public:
+ QXmppUploadService();
+ QXmppUploadService(const QXmppUploadService &);
+ ~QXmppUploadService();
+
+ QXmppUploadService &operator=(const QXmppUploadService &);
+
+ QString jid() const;
+ void setJid(const QString &jid);
+
+ qint64 sizeLimit() const;
+ void setSizeLimit(qint64 sizeLimit);
+
+private:
+ QSharedDataPointer<QXmppUploadServicePrivate> d;
+};
+
+/// \class QXmppUploadRequestManager This class implements the core of
+/// XEP-0369: HTTP File Upload.
+///
+/// It handles the discovery of QXmppUploadServices and can send upload
+/// requests and outputs the upload slots. It doesn't do the actual upload via.
+/// HTTP.
+///
+/// To make use of this manager, you need to instantiate it and load it into
+/// the QXmppClient instance as follows:
+///
+/// \code
+/// auto *manager = new QXmppUploadRequestManager;
+/// client->addExtension(manager);
+/// \endcode
+///
+/// Apart from that, you also need to discover HTTP File Upload service(s) by
+/// requesting the Service Discovery info for each Service Discovery item of
+/// the server. The QXmppUploadManager will then automatically recognize upload
+/// services and add them to the list of discovered services
+/// \c uploadServices().
+///
+/// Keep in mind that theoretically any XMPP entity could promote to be an
+/// upload service and so is recognized by this manager. A potential attacker
+/// could exploit this vulnerability, so the client could be uploading files to
+/// the attacker (e.g. a normal user JID) instead of the own server.
+///
+/// As soon as at least one upload service has been discovered, you can start
+/// to request upload slots by using \c requestUploadSlot(). Alternatively you
+/// can provide the JID of the upload service which should be used for
+/// uploading.
+///
+/// \ingroup Managers
+
+class QXMPP_EXPORT QXmppUploadRequestManager : public QXmppClientExtension
+{
+ Q_OBJECT
+ Q_PROPERTY(bool serviceFound READ serviceFound NOTIFY serviceFoundChanged)
+
+public:
+ QXmppUploadRequestManager();
+ ~QXmppUploadRequestManager();
+
+ QString requestUploadSlot(const QFileInfo &file,
+ const QString &uploadService = QString());
+ QString requestUploadSlot(const QFileInfo &file,
+ const QString &customFileName,
+ const QString &uploadService = QString());
+ QString requestUploadSlot(const QString &fileName,
+ qint64 fileSize,
+ const QMimeType &mimeType,
+ const QString &uploadService = QString());
+
+ bool serviceFound() const;
+
+ QVector<QXmppUploadService> uploadServices() const;
+
+ bool handleStanza(const QDomElement &stanza) override;
+
+signals:
+ /// Emitted when an upload slot was received.
+ void slotReceived(const QXmppHttpUploadSlotIq &slot);
+
+ /// Emitted when the slot request failed.
+ ///
+ /// You can get the reason from the QXmppStanza::Error of the returned
+ /// request.
+ void requestFailed(const QXmppHttpUploadRequestIq &request);
+
+ void serviceFoundChanged();
+
+protected:
+ void setClient(QXmppClient *client) override;
+ bool handleStanza(const QDomElement &stanza) override;
+
+private:
+ void handleDiscoInfo(const QXmppDiscoveryIq &iq);
+
+ QSharedDataPointer<QXmppUploadRequestManagerPrivate> d;
+};
+
+#endif // QXMPPUPLOADREQUESTMANAGER_H