summaryrefslogtreecommitdiffstats
path: root/src/oauth/qoauth1.h
blob: bfa4aea27bb4dc2c79543cb4986522d0d8631423 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#ifndef QOAUTH1_H
#define QOAUTH1_H

#ifndef QT_NO_HTTP

#include <QtNetworkAuth/qoauthglobal.h>
#include <QtNetworkAuth/qabstractoauth.h>

#include <QtNetwork/qnetworkaccessmanager.h>

QT_BEGIN_NAMESPACE

class QOAuth1Private;
class Q_OAUTH_EXPORT QOAuth1: public QAbstractOAuth
{
    Q_OBJECT

public:
    enum class SignatureMethod {
        Hmac_Sha1,
        Rsa_Sha1,
        PlainText
    };

    Q_ENUM(SignatureMethod)

    explicit QOAuth1(QObject *parent = nullptr);
    explicit QOAuth1(QNetworkAccessManager *manager,
                     QObject *parent = nullptr);

    QOAuth1(const QString &clientIdentifier,
            const QString &clientSharedSecret,
            QNetworkAccessManager *manager,
            QObject *parent = nullptr);

    QString clientSharedSecret() const;
    void setClientSharedSecret(const QString &clientSharedSecret);
    std::pair<QString, QString> clientCredentials() const;
    void setClientCredentials(const std::pair<QString, QString> &clientCredentials);
    void setClientCredentials(const QString &clientIdentifier, const QString &clientSharedSecret);

    // Token credentials: https://tools.ietf.org/html/rfc5849#section-2.3
    QString tokenSecret() const;
    void setTokenSecret(const QString &tokenSecret);
    std::pair<QString, QString> tokenCredentials() const;
    void setTokenCredentials(const std::pair<QString, QString> &tokenCredentials);
    void setTokenCredentials(const QString &token, const QString &tokenSecret);

    // Temporary Credentials: https://tools.ietf.org/html/rfc5849#section-2.1
    QUrl temporaryCredentialsUrl() const;
    void setTemporaryCredentialsUrl(const QUrl &url);

    // Token Credentials: https://tools.ietf.org/html/rfc5849#section-2.3
    QUrl tokenCredentialsUrl() const;
    void setTokenCredentialsUrl(const QUrl &url);

    // Signature method: https://tools.ietf.org/html/rfc5849#section-3.4
    SignatureMethod signatureMethod() const;
    void setSignatureMethod(SignatureMethod value);

    void prepareRequest(QNetworkRequest *request, const QByteArray &verb,
                                const QByteArray &body = QByteArray()) override;

    QNetworkReply *head(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override;
    QNetworkReply *get(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override;

    QNetworkReply *post(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override;
    QNetworkReply *put(const QUrl &url, const QVariantMap &parameters = QVariantMap()) override;
    QNetworkReply *deleteResource(const QUrl &url,
                                  const QVariantMap &parameters = QVariantMap()) override;

public Q_SLOTS:
    void grant() override;
    void continueGrantWithVerifier(const QString &verifier);

Q_SIGNALS:
    void signatureMethodChanged(QOAuth1::SignatureMethod method);
    void clientSharedSecretChanged(const QString &credential);
    void tokenSecretChanged(const QString &token);
    void temporaryCredentialsUrlChanged(const QUrl &url);
    void tokenCredentialsUrlChanged(const QUrl &url);

protected:
    QNetworkReply *requestTemporaryCredentials(QNetworkAccessManager::Operation operation,
                                               const QUrl &url,
                                               const QVariantMap &parameters = QVariantMap());

    QNetworkReply *requestTokenCredentials(QNetworkAccessManager::Operation operation,
                                           const QUrl &url,
                                           const std::pair<QString, QString> &temporaryToken,
                                           const QVariantMap &parameters = QVariantMap());

    void setup(QNetworkRequest *request,
               const QVariantMap &signingParameters,
               QNetworkAccessManager::Operation operation);
    void setup(QNetworkRequest *request,
               const QVariantMap &signingParameters,
               const QByteArray &operationVerb);

    static QByteArray nonce();
    static QByteArray generateAuthorizationHeader(const QVariantMap &oauthParams);

private:
    Q_DISABLE_COPY(QOAuth1)
    Q_DECLARE_PRIVATE(QOAuth1)
};

QT_END_NAMESPACE

#endif // QT_NO_HTTP

#endif // QOAUTH1_H