diff options
| author | Linus Jahn <lnj@kaidan.im> | 2019-05-05 14:58:42 +0200 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2019-10-20 17:01:35 +0200 |
| commit | 6b3e41ee933b260a80b3ec197c7e76a14eb4ba4a (patch) | |
| tree | 35b4af6bf99d5c22e55984ac54508fef2938b970 /src/client/QXmppUploadRequestManager.h | |
| parent | a4ac49e2e3c69ba2d42558fbfb52eaa931ca8e28 (diff) | |
| download | qxmpp-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.h | 141 |
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 |
