libqtaws  0.1.0
UnofficialAWSlibraryforQt-InternalDocumentation
Public Member Functions | Public Attributes | Friends | List of all members
AwsSignatureV2Private Class Reference

Private implementation for AwsSignatureV2. More...

Inheritance diagram for AwsSignatureV2Private:
Inheritance graph
[legend]
Collaboration diagram for AwsSignatureV2Private:
Collaboration graph
[legend]

Public Member Functions

 AwsSignatureV2Private (AwsSignatureV2 *const q)
 Constructs a new AwsSignatureV2Private object. More...
 
void adornRequest (QNetworkRequest &request, const AwsAbstractCredentials &credentials) const
 Add AWS Signature Version 2 adornments to an AWS request. More...
 
QByteArray canonicalRequest (const QNetworkAccessManager::Operation operation, const QUrl &url) const
 Create an AWS V2 Signature canonical request. More...
 
QByteArray signatureMethod (const QCryptographicHash::Algorithm algorithm) const
 Create an AWS V2 Signature method designation. More...
 
- Public Member Functions inherited from AwsAbstractSignaturePrivate
virtual ~AwsAbstractSignaturePrivate ()
 AwsAbstractSignaturePrivate destructor. More...
 
 AwsAbstractSignaturePrivate (AwsAbstractSignature *const q)
 Constructs a new AwsAbstractSignaturePrivate object. More...
 
QString canonicalPath (const QUrl &url) const
 Create an AWS Signature canonical path. More...
 
QByteArray canonicalQuery (const QUrlQuery &query) const
 Create an AWS Signature canonical query. More...
 
QString httpMethod (const QNetworkAccessManager::Operation operation) const
 Create an AWS Signature request method string. More...
 
bool setQueryItem (QUrlQuery &query, const QString &key, const QString &value, const bool warnOnNonIdenticalDuplicate=true) const
 Set a query item, checking for existing values first. More...
 

Public Attributes

QCryptographicHash::Algorithm hashAlgorithm
 Hash algorithm to use when signing.
 

Friends

class TestAwsSignatureV2
 

Additional Inherited Members

- Protected Attributes inherited from AwsAbstractSignaturePrivate
AwsAbstractSignature *const q_ptr
 Internal q-pointer.
 

Detailed Description

Private implementation for AwsSignatureV2.

Warning
This is an internal private implementation class, and as such external should code should not depend directly on anything contained within this class.
See also
http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

Definition at line 34 of file awssignaturev2_p.h.

Constructor & Destructor Documentation

AwsSignatureV2Private::AwsSignatureV2Private ( AwsSignatureV2 *const  q)

Constructs a new AwsSignatureV2Private object.

Parameters
qPointer to this object's public AwsSignatureV2 instance.

Definition at line 105 of file awssignaturev2.cpp.

106 {
107 
108 }
AwsAbstractSignaturePrivate(AwsAbstractSignature *const q)
Constructs a new AwsAbstractSignaturePrivate object.

Member Function Documentation

void AwsSignatureV2Private::adornRequest ( QNetworkRequest &  request,
const AwsAbstractCredentials credentials 
) const

Add AWS Signature Version 2 adornments to an AWS request.

In addition to service-specific request parameters, Amazon requires that version 2 signatures contain a number of common query parameters. This functions adds those query parameters to request if they're not already present.

The query parameters added by this function, as required by Amazon, are:

  • AWSAccessKeyId - set to credentials.accessKeyId().
  • SignatureMethod - set to HMAC-SHA1 or HMAC-SHA256.
  • SignatureVersion - set to 2.
  • Timestamp - set to a current UTC timestamp in an ISO 8601 format, like 2013-10-30T12:34:56Z.
Parameters
requestRequest to adorn.
credentialsCredentials to use when adorning request.
See also
signatureMethod
http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html

Definition at line 132 of file awssignaturev2.cpp.

References AwsAbstractCredentials::accessKeyId(), hashAlgorithm, AwsAbstractSignaturePrivate::setQueryItem(), and signatureMethod().

134 {
135  // Set / add the necessary query items.
136  QUrl url = request.url();
137  QUrlQuery query(url);
138  setQueryItem(query, QLatin1String("AWSAccessKeyId"), credentials.accessKeyId());
139  setQueryItem(query, QLatin1String("SignatureVersion"), QLatin1String("2"));
140  setQueryItem(query, QLatin1String("SignatureMethod"), QString::fromUtf8(signatureMethod(hashAlgorithm)));
141  setQueryItem(query, QLatin1String("Timestamp"),
142  QString::fromUtf8(QUrl::toPercentEncoding(
143  QDateTime::currentDateTimeUtc().toString(QLatin1String("yyyy-MM-ddThh:mm:ssZ"))
144  )),
145  false); // Don't warn if its already set to something else.
146 
147  // If we've touched the query items (likely), then update the request.
148  if (query != QUrlQuery(url)) {
149  qDebug() << Q_FUNC_INFO << url;
150  url.setQuery(query);
151  qDebug() << Q_FUNC_INFO << url;
152  request.setUrl(url);
153  }
154 }
bool setQueryItem(QUrlQuery &query, const QString &key, const QString &value, const bool warnOnNonIdenticalDuplicate=true) const
Set a query item, checking for existing values first.
QCryptographicHash::Algorithm hashAlgorithm
Hash algorithm to use when signing.
virtual QString accessKeyId() const =0
AWS access key ID for this credentials object.
QByteArray signatureMethod(const QCryptographicHash::Algorithm algorithm) const
Create an AWS V2 Signature method designation.
QByteArray AwsSignatureV2Private::canonicalRequest ( const QNetworkAccessManager::Operation  operation,
const QUrl &  url 
) const

Create an AWS V2 Signature canonical request.

This function creates a canonical representation of an AWS request as defined by Amazon's V2 signature specification.

For example, for the following HTTP GET request:

https://elasticmapreduce.amazonaws.com?Action=DescribeJobFlows&Version=2009-03-31&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&SignatureVersion=2SignatureMethod=HmacSHA256Timestamp=2011-10-03T15%3A19%3A30

this function will return the following canonical form:

GET
elasticmapreduce.amazonaws.com
/
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31
Note
All URL components are encoded to UTF-8, as required by Amazon.
Parameters
operationThe HTTP method being requested.
urlThe URL being request.
Returns
An AWS V2 Signature canonical request.
See also
http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html

Definition at line 184 of file awssignaturev2.cpp.

References AwsAbstractSignaturePrivate::canonicalPath(), AwsAbstractSignaturePrivate::canonicalQuery(), and AwsAbstractSignaturePrivate::httpMethod().

186 {
187  return httpMethod(operation).toUtf8() + '\n' +
188  url.host().toUtf8() + '\n' +
189  canonicalPath(url).toUtf8() + '\n' +
190  canonicalQuery(QUrlQuery(url));
191 }
QByteArray canonicalQuery(const QUrlQuery &query) const
Create an AWS Signature canonical query.
QString httpMethod(const QNetworkAccessManager::Operation operation) const
Create an AWS Signature request method string.
QString canonicalPath(const QUrl &url) const
Create an AWS Signature canonical path.
QByteArray AwsSignatureV2Private::signatureMethod ( const QCryptographicHash::Algorithm  algorithm) const

Create an AWS V2 Signature method designation.

This function returns a signature method designation, as defined by Amazon, for use with V2 signatures.

For example, if the algorith is QCryptographicHash::Sha256, this function will return HmacSHA256.

Note
Amazon only supports two algorithms for V2 signatures - SHA1 and SHA256.
Parameters
algorithmThe hash algorithm to get the canonical designation for.
Returns
An AWS V2 Signature method designation.
See also
http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html

Definition at line 210 of file awssignaturev2.cpp.

Referenced by adornRequest().

211 {
212  switch (algorithm) {
213  case QCryptographicHash::Sha1: return "HmacSHA1";
214  case QCryptographicHash::Sha256: return "HmacSHA256";
215  default:
216  Q_ASSERT_X(false, Q_FUNC_INFO, "invalid algorithm");
217  return "invalid-algorithm";
218  }
219 }

The documentation for this class was generated from the following files: