TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
qsyncutils.cpp
Go to the documentation of this file.
1 #include "qsyncutils.h"
2 #include "qsyncconfig.h"
3 
4 #include <QLocale>
5 #include <QDateTime>
6 #include <QCryptographicHash>
7 
8 static QString hmacSha1(QByteArray key, const QByteArray &baseString)
9 {
10  int blockSize = 64; // HMAC-SHA-1 block size, defined in SHA-1 standard
11  if(key.length() > blockSize)
12  { // if key is longer than block size (64), reduce key length with SHA-1 compression
13  key = QCryptographicHash::hash(key, QCryptographicHash::Sha1);
14  }
15 
16  QByteArray innerPadding(blockSize, char(0x36)); // initialize inner padding with char "6"
17  QByteArray outerPadding(blockSize, char(0x5c)); // initialize outer padding with char "\"
18  // ascii characters 0x36 ("6") and 0x5c ("\") are selected because they have large
19  // Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance)
20 
21  for(int i = 0; i < key.length(); ++i)
22  {
23  innerPadding[i] = innerPadding[i] ^ key.at(i); // XOR operation between every byte in key and innerpadding, of key length
24  outerPadding[i] = outerPadding[i] ^ key.at(i); // XOR operation between every byte in key and outerpadding, of key length
25  }
26 
27  QByteArray total = outerPadding;
28  QByteArray part = innerPadding;
29  part.append(baseString);
30  total.append(QCryptographicHash::hash(part, QCryptographicHash::Sha1));
31  return QCryptographicHash::hash(total, QCryptographicHash::Sha1).toBase64();
32 }
33 
34 static const char *self_define_header_prefix = "x-oss-";
35 
36 static TTKStringMap formatHeader(const TTKStringMap &headers)
37 {
38  TTKStringMap value;
39  for(auto it = headers.constBegin(); it != headers.constEnd(); ++it)
40  {
41  if(it.key().startsWith(self_define_header_prefix, Qt::CaseInsensitive))
42  {
43  value.insert(it.key().toLower(), it.value());
44  }
45  else
46  {
47  value.insert(it.key(), it.value());
48  }
49  }
50  return value;
51 }
52 
53 QString QSyncUtils::authorizationCode(const QString &key, const QString &method, const TTKStringMap &headers, const QString &resource)
54 {
55  const QString &content_md5 = headers.value("Content-Md5");
56  const QString &content_type = headers.value("Content-Type");
57  const QString &date = headers.value("Date");
58  const QString &canonicalized_resource = resource;
59 
60  QString canonicalized_headers;
61  TTKStringMap origin_headers = formatHeader(headers);
62 
63  if(origin_headers.count() > 0)
64  {
65  for(auto it = origin_headers.constBegin(); it != origin_headers.constEnd(); ++it)
66  {
67  if(it.key().startsWith(self_define_header_prefix))
68  {
69  canonicalized_headers += it.key() + ":" + it.value() + "\n";
70  }
71  }
72  }
73 
74  const QString &sign = method + "\n" + content_md5 + "\n" + content_type + "\n" + date + "\n" + canonicalized_headers + canonicalized_resource;
75  return hmacSha1(key.toUtf8(), sign.toUtf8());
76 }
77 
78 QString QSyncUtils::createSignForNormalAuth(const QString &method, const QString &access, const QString &secret, const TTKStringMap &headers, const QString &resource)
79 {
80  return QString("OSS ") + access + ":" + authorizationCode(secret, method, headers, resource);
81 }
82 
83 QString QSyncUtils::GMT()
84 {
85  QLocale local(QLocale::English, QLocale::UnitedStates);
86  return local.toString(QDateTime::currentDateTimeUtc(), "ddd, dd MMM yyyy hh:mm:ss") + " GMT";
87 }
88 
90 {
91  return QString("%1%2.%3/").arg(HTTP_PROTOCOL, SYNC_DATA_BUCKET, QSyncConfig::HOST);
92 }
static QString GMT()
Definition: qsyncutils.cpp:83
#define HTTP_PROTOCOL
Definition: ttkglobal.h:285
static QString HOST
Definition: qsyncconfig.h:32
static const char * self_define_header_prefix
Definition: qsyncutils.cpp:34
static constexpr wchar_t key[]
#define local
Definition: unzip.c:91
#define SYNC_DATA_BUCKET
Definition: qsyncconfig.h:24
static TTKStringMap formatHeader(const TTKStringMap &headers)
Definition: qsyncutils.cpp:36
static QString createSignForNormalAuth(const QString &method, const QString &access, const QString &secret, const TTKStringMap &headers, const QString &resource)
Definition: qsyncutils.cpp:78
static QString authorizationCode(const QString &key, const QString &method, const TTKStringMap &headers, const QString &resource)
Definition: qsyncutils.cpp:53
static QString hmacSha1(QByteArray key, const QByteArray &baseString)
Definition: qsyncutils.cpp:8
QMap< QString, QString > TTKStringMap
Definition: ttkqtglobal.h:202
static QString makeDataBucketUrl()
Definition: qsyncutils.cpp:89