20 #include "awssignaturev0.h"
21 #include "awssignaturev0_p.h"
23 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) && QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
24 #include "qmessageauthenticationcode.h"
26 #include <QMessageAuthenticationCode>
29 #include <QCryptographicHash>
31 #include <QNetworkRequest>
81 QNetworkRequest &request,
const QByteArray &data)
const
88 #ifndef QTAWS_ALLOW_INSECURE_SIGNATURES
89 if (request.url().scheme() != QString::fromLatin1(
"https")) {
90 qWarning(
"AwsSignatureV%d::sign Refusing to sign insecure (non-HTTPS) request",
version());
91 Q_ASSERT_X(
false, Q_FUNC_INFO,
"insecure V1 signatures not enabled");
97 d->adornRequest(request, credentials);
100 const QByteArray stringToSign = d->canonicalQuery(QUrlQuery(request.url().query()));
101 const QString signature = QString::fromUtf8(QUrl::toPercentEncoding(QString::fromUtf8(
102 QMessageAuthenticationCode::hash(stringToSign, credentials.
secretKey().toUtf8(),
103 QCryptographicHash::Sha1).toBase64())));
106 QUrl url = request.url();
107 url.setQuery(url.query() + QLatin1String(
"&Signature=") + signature);
179 QUrl url = request.url();
180 QUrlQuery query(url);
182 setQueryItem(query, QLatin1String(
"SignatureVersion"), QString::fromLatin1(
"%1").arg(q->version()));
186 if (!query.hasQueryItem(QLatin1String(
"Expires"))) {
188 QString::fromUtf8(QUrl::toPercentEncoding(
189 QDateTime::currentDateTimeUtc().toString(QLatin1String(
"yyyy-MM-ddThh:mm:ssZ"))
195 if (query != QUrlQuery(url.query())) {
196 qDebug() << Q_FUNC_INFO << url;
198 qDebug() << Q_FUNC_INFO << url;
231 Q_ASSERT_X(query.hasQueryItem(QLatin1String(
"Action")), Q_FUNC_INFO,
"Action query parameter required");
232 Q_ASSERT_X(query.hasQueryItem(QLatin1String(
"Timestamp")) || query.hasQueryItem(QLatin1String(
"Expires")),
233 Q_FUNC_INFO,
"Timestamp or Expires query parameter required");
235 return (query.queryItemValue(QLatin1String(
"Action")) + query.queryItemValue(QLatin1String(
236 (query.hasQueryItem(QLatin1String(
"Timestamp"))) ?
"Timestamp" :
"Expires"))).toUtf8();
AwsSignatureV0()
Constructs a new AwsSignatureV0 object.
bool setQueryItem(QUrlQuery &query, const QString &key, const QString &value, const bool warnOnNonIdenticalDuplicate=true) const
Set a query item, checking for existing values first.
virtual int version() const
AWS Signature version implemented by this class.
virtual QByteArray canonicalQuery(const QUrlQuery &query) const
Create an AWS Signature version 0 canonical query.
Private implementation for AwsAbstractSignature.
virtual QString secretKey() const =0
AWS secret access key for this credentials object.
Interface class for providing AWS credentials.
Private implementation for AwsSignatureV0.
virtual void sign(const AwsAbstractCredentials &credentials, const QNetworkAccessManager::Operation operation, QNetworkRequest &request, const QByteArray &data=QByteArray()) const
Sign an AWS request.
AwsSignatureV0Private(AwsSignatureV0 *const q)
Constructs a new AwsSignatureV0Private object.
void adornRequest(QNetworkRequest &request, const AwsAbstractCredentials &credentials) const
Add AWS Signature Version 0 adornments to an AWS request.
virtual ~AwsSignatureV0Private()
AwsSignatureV0Private destructor.
virtual QString accessKeyId() const =0
AWS access key ID for this credentials object.
Implements AWS Signature Version 0 (deprecated by Amazon).
Interface class for providing AWS signatures.