1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#ifndef QABSTRACTOAUTH_H
5#define QABSTRACTOAUTH_H
6
7#include <QtNetworkAuth/qoauthglobal.h>
8
9#ifndef QT_NO_HTTP
10
11#include <QtCore/qurl.h>
12#include <QtCore/qobject.h>
13#include <QtCore/qstring.h>
14#include <QtCore/qvariant.h>
15#include <QtCore/qmap.h>
16
17#include <functional>
18
19QT_BEGIN_NAMESPACE
20
21class QString;
22class QByteArray;
23class QNetworkReply;
24class QNetworkRequest;
25class QNetworkAccessManager;
26class QAbstractOAuthReplyHandler;
27
28class QAbstractOAuthPrivate;
29class Q_OAUTH_EXPORT QAbstractOAuth : public QObject
30{
31 Q_OBJECT
32
33 Q_ENUMS(Status)
34 Q_ENUMS(Stage)
35 Q_ENUMS(Error)
36 Q_PROPERTY(QString clientIdentifier
37 READ clientIdentifier
38 WRITE setClientIdentifier
39 NOTIFY clientIdentifierChanged)
40 Q_PROPERTY(QString token READ token WRITE setToken NOTIFY tokenChanged)
41 Q_PROPERTY(Status status READ status NOTIFY statusChanged)
42 Q_PROPERTY(QVariantMap extraTokens READ extraTokens NOTIFY extraTokensChanged)
43 Q_PROPERTY(QUrl authorizationUrl
44 READ authorizationUrl
45 WRITE setAuthorizationUrl
46 NOTIFY authorizationUrlChanged)
47 Q_PROPERTY(QAbstractOAuth::ContentType contentType
48 READ contentType
49 WRITE setContentType
50 NOTIFY contentTypeChanged)
51
52public:
53 enum class Status {
54 NotAuthenticated,
55 TemporaryCredentialsReceived,
56 Granted,
57 RefreshingToken
58 };
59
60 enum class Stage {
61 RequestingTemporaryCredentials,
62 RequestingAuthorization,
63 RequestingAccessToken,
64 RefreshingAccessToken
65 };
66
67 enum class Error {
68 NoError,
69 NetworkError,
70 ServerError,
71
72 OAuthTokenNotFoundError,
73 OAuthTokenSecretNotFoundError,
74 OAuthCallbackNotVerified,
75
76 ClientError,
77 ExpiredError,
78 };
79
80 enum class ContentType {
81 WwwFormUrlEncoded,
82 Json
83 };
84
85 typedef std::function<void(Stage, QMultiMap<QString, QVariant>*)> ModifyParametersFunction;
86
87 virtual ~QAbstractOAuth();
88
89 QString clientIdentifier() const;
90 void setClientIdentifier(const QString &clientIdentifier);
91
92 QString token() const;
93 void setToken(const QString &token);
94
95 QNetworkAccessManager *networkAccessManager() const;
96 void setNetworkAccessManager(QNetworkAccessManager *networkAccessManager);
97
98 Status status() const;
99
100 QUrl authorizationUrl() const;
101 void setAuthorizationUrl(const QUrl &url);
102
103 QVariantMap extraTokens() const;
104
105 QAbstractOAuthReplyHandler *replyHandler() const;
106 void setReplyHandler(QAbstractOAuthReplyHandler *handler);
107
108 Q_INVOKABLE virtual QNetworkReply *head(const QUrl &url,
109 const QVariantMap &parameters = QVariantMap()) = 0;
110 Q_INVOKABLE virtual QNetworkReply *get(const QUrl &url,
111 const QVariantMap &parameters = QVariantMap()) = 0;
112 Q_INVOKABLE virtual QNetworkReply *post(const QUrl &url,
113 const QVariantMap &parameters = QVariantMap()) = 0;
114 Q_INVOKABLE virtual QNetworkReply *put(const QUrl &url,
115 const QVariantMap &parameters = QVariantMap()) = 0;
116 Q_INVOKABLE virtual QNetworkReply *deleteResource(
117 const QUrl &url, const QVariantMap &parameters = QVariantMap()) = 0;
118
119 virtual void prepareRequest(QNetworkRequest *request, const QByteArray &verb,
120 const QByteArray &body = QByteArray()) = 0;
121
122 ModifyParametersFunction modifyParametersFunction() const;
123 void setModifyParametersFunction(const ModifyParametersFunction &modifyParametersFunction);
124
125 ContentType contentType() const;
126 void setContentType(ContentType contentType);
127
128public Q_SLOTS:
129 virtual void grant() = 0;
130
131Q_SIGNALS:
132 void clientIdentifierChanged(const QString &clientIdentifier);
133 void tokenChanged(const QString &token);
134 void statusChanged(Status status);
135 void authorizationUrlChanged(const QUrl &url);
136 void extraTokensChanged(const QVariantMap &tokens);
137 void contentTypeChanged(ContentType contentType);
138
139 void requestFailed(const Error error);
140 void authorizeWithBrowser(const QUrl &url);
141 void granted();
142 void finished(QNetworkReply *reply);
143 void replyDataReceived(const QByteArray &data);
144
145protected:
146 explicit QAbstractOAuth(QAbstractOAuthPrivate &, QObject *parent = nullptr);
147
148 void setStatus(Status status);
149
150 QString callback() const;
151
152 virtual void resourceOwnerAuthorization(const QUrl &url, const QMultiMap<QString, QVariant> &parameters);
153 static QByteArray generateRandomString(quint8 length);
154
155private:
156 Q_DISABLE_COPY(QAbstractOAuth)
157 Q_DECLARE_PRIVATE(QAbstractOAuth)
158};
159
160QT_END_NAMESPACE
161
162#endif // QT_NO_HTTP
163
164#endif // QABSTRACTOAUTH_H
165

source code of qtnetworkauth/src/oauth/qabstractoauth.h