TTKMusicPlayer  3.7.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 
32  return QCryptographicHash::hash(total, QCryptographicHash::Sha1).toBase64();
33 }
34 
35 static const char *self_define_header_prefix = "x-oss-";
36 
37 static TTKStringMap formatHeader(const TTKStringMap &headers)
38 {
39  TTKStringMap value;
40  for(auto it = headers.constBegin(); it != headers.constEnd(); ++it)
41  {
42  if(it.key().toLower().startsWith(self_define_header_prefix))
43  {
44  value.insert(it.key().toLower(), it.value());
45  }
46  else
47  {
48  value.insert(it.key(), it.value());
49  }
50  }
51  return value;
52 }
53 
54 QString QSyncUtils::authorizationCode(const QString &key, const QString &method, const TTKStringMap &headers, const QString &resource)
55 {
56  const QString &content_md5 = headers.value("Content-Md5");
57  const QString &content_type = headers.value("Content-Type");
58  const QString &date = headers.value("Date");
59  const QString &canonicalized_resource = resource;
60 
61  QString canonicalized_headers;
62  TTKStringMap origin_headers = formatHeader(headers);
63 
64  if(origin_headers.count() > 0)
65  {
66  for(auto it = origin_headers.constBegin(); it != origin_headers.constEnd(); ++it)
67  {
68  if(it.key().startsWith(self_define_header_prefix))
69  {
70  canonicalized_headers += it.key() + ":" + it.value() + "\n";
71  }
72  }
73  }
74 
75  const QString &sign = method + "\n" + content_md5 + "\n" + content_type + "\n" + date + "\n" + canonicalized_headers + canonicalized_resource;
76  return hmacSha1(key.toUtf8(), sign.toUtf8());
77 }
78 
79 QString QSyncUtils::createSignForNormalAuth(const QString &method, const QString &access, const QString &secret, const TTKStringMap &headers, const QString &resource)
80 {
81  return QString("OSS ") + access + ":" + authorizationCode(secret, method, headers, resource);
82 }
83 
84 QString QSyncUtils::GMT()
85 {
86  QLocale local(QLocale::English, QLocale::UnitedStates);
87  return local.toString(QDateTime::currentDateTimeUtc(), "ddd, dd MMM yyyy hh:mm:ss") + " GMT";
88 }
89 
91 {
92  return QString("http://%1.%2/").arg(SYNC_DATA_BUCKET, QSyncConfig::HOST);
93 }
static QString GMT()
Definition: qsyncutils.cpp:84
static QString HOST
Definition: qsyncconfig.h:32
static constexpr wchar_t key[]
static const char * self_define_header_prefix
Definition: qsyncutils.cpp:35
#define local
Definition: unzip.c:91
#define SYNC_DATA_BUCKET
Definition: qsyncconfig.h:24
static TTKStringMap formatHeader(const TTKStringMap &headers)
Definition: qsyncutils.cpp:37
static QString createSignForNormalAuth(const QString &method, const QString &access, const QString &secret, const TTKStringMap &headers, const QString &resource)
Definition: qsyncutils.cpp:79
static QString authorizationCode(const QString &key, const QString &method, const TTKStringMap &headers, const QString &resource)
Definition: qsyncutils.cpp:54
static QString hmacSha1(QByteArray key, const QByteArray &baseString)
Definition: qsyncutils.cpp:8
QMap< QString, QString > TTKStringMap
Definition: ttkqtglobal.h:190
static QString makeDataBucketUrl()
Definition: qsyncutils.cpp:90