PageRenderTime 25ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/auto/oauth1signature/tst_oauth1signature.cpp

https://gitlab.com/f3822/qtnetworkauth
C++ | 262 lines | 212 code | 20 blank | 30 comment | 3 complexity | 9bd1f6701705ee0934ae5e610b710040 MD5 | raw file
  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2017 The Qt Company Ltd.
  4. ** Contact: https://www.qt.io/licensing/
  5. **
  6. ** This file is part of the test suite of the Qt Toolkit.
  7. **
  8. ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
  9. ** Commercial License Usage
  10. ** Licensees holding valid commercial Qt licenses may use this file in
  11. ** accordance with the commercial license agreement provided with the
  12. ** Software or, alternatively, in accordance with the terms contained in
  13. ** a written agreement between you and The Qt Company. For licensing terms
  14. ** and conditions see https://www.qt.io/terms-conditions. For further
  15. ** information use the contact form at https://www.qt.io/contact-us.
  16. **
  17. ** GNU General Public License Usage
  18. ** Alternatively, this file may be used under the terms of the GNU
  19. ** General Public License version 3 as published by the Free Software
  20. ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
  21. ** included in the packaging of this file. Please review the following
  22. ** information to ensure the GNU General Public License requirements will
  23. ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
  24. **
  25. ** $QT_END_LICENSE$
  26. **
  27. ****************************************************************************/
  28. #include <QtCore>
  29. #include <QtTest>
  30. #include <QtNetworkAuth/qoauth1signature.h>
  31. Q_DECLARE_METATYPE(QOAuth1Signature::HttpRequestMethod)
  32. class tst_OAuth1Signature : public QObject
  33. {
  34. Q_OBJECT
  35. public:
  36. QOAuth1Signature createTwitterSignature();
  37. private Q_SLOTS:
  38. void twitterSignatureExample();
  39. void copyAndModify();
  40. void signatures_data();
  41. void signatures();
  42. };
  43. const auto oauthVersion = QStringLiteral("oauth_version");
  44. const auto oauthConsumerKey = QStringLiteral("oauth_consumer_key");
  45. const auto oauthNonce = QStringLiteral("oauth_nonce");
  46. const auto oauthSignatureMethod = QStringLiteral("oauth_signature_method");
  47. const auto oauthTimestamp = QStringLiteral("oauth_timestamp");
  48. const auto oauthToken = QStringLiteral("oauth_token");
  49. QOAuth1Signature tst_OAuth1Signature::createTwitterSignature()
  50. {
  51. // Example from https://dev.twitter.com/oauth/overview/creating-signatures
  52. const QUrl url("https://api.twitter.com/1/statuses/update.json?include_entities=true");
  53. QOAuth1Signature signature(url,
  54. QStringLiteral("kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw"),
  55. QStringLiteral("LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE"),
  56. QOAuth1Signature::HttpRequestMethod::Post);
  57. const QString body = QUrl::fromPercentEncoding("status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a"
  58. "%20signed%20OAuth%20request%21");
  59. signature.insert(oauthConsumerKey,
  60. QStringLiteral("xvz1evFS4wEEPTGEFPHBog"));
  61. signature.insert(oauthNonce,
  62. QStringLiteral("kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg"));
  63. signature.insert(oauthSignatureMethod,
  64. QStringLiteral("HMAC-SHA1"));
  65. signature.insert(oauthTimestamp, QStringLiteral("1318622958"));
  66. signature.insert(oauthToken,
  67. QStringLiteral("370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb"));
  68. signature.insert(oauthVersion, QStringLiteral("1.0"));
  69. signature.addRequestBody(QUrlQuery(body));
  70. return signature;
  71. }
  72. void tst_OAuth1Signature::twitterSignatureExample()
  73. {
  74. const QOAuth1Signature signature = createTwitterSignature();
  75. QByteArray signatureData = signature.hmacSha1();
  76. QCOMPARE(signatureData.toBase64(), QByteArray("tnnArxj06cWHq44gCs1OSKk/jLY="));
  77. }
  78. void tst_OAuth1Signature::copyAndModify()
  79. {
  80. const QOAuth1Signature signature = createTwitterSignature();
  81. QOAuth1Signature copy = signature;
  82. QCOMPARE(signature.hmacSha1(), copy.hmacSha1());
  83. copy.insert(QStringLiteral("signature"), QStringLiteral("modified"));
  84. QVERIFY(signature.hmacSha1() != copy.hmacSha1());
  85. }
  86. void tst_OAuth1Signature::signatures_data()
  87. {
  88. QTest::addColumn<QUrl>("url");
  89. QTest::addColumn<QOAuth1Signature::HttpRequestMethod>("method");
  90. QTest::addColumn<QByteArray>("customVerb");
  91. QTest::addColumn<QString>("version");
  92. QTest::addColumn<QString>("consumerKey");
  93. QTest::addColumn<QString>("consumerSecret");
  94. QTest::addColumn<QString>("token");
  95. QTest::addColumn<QString>("tokenSecret");
  96. QTest::addColumn<QString>("nonce");
  97. QTest::addColumn<QString>("timestamp");
  98. QTest::addColumn<QMultiMap<QString, QVariant>>("parameters");
  99. QTest::addColumn<QString>("result");
  100. QTest::newRow("standard") << QUrl("http://example.net")
  101. << QOAuth1Signature::HttpRequestMethod::Get
  102. << QByteArray()
  103. << "1.0"
  104. << "key"
  105. << "secret"
  106. << "accesskey"
  107. << "accesssecret"
  108. << "468167367"
  109. << "1494852816"
  110. << QMultiMap<QString, QVariant>()
  111. << "mQaARxv7pqJyViuwNGtUfm6QSIQ=";
  112. QTest::newRow("post") << QUrl("http://example.net")
  113. << QOAuth1Signature::HttpRequestMethod::Post
  114. << QByteArray()
  115. << "1.0"
  116. << "key"
  117. << "secret"
  118. << "accesskey"
  119. << "accesssecret"
  120. << "468167367"
  121. << "1494852816"
  122. << QMultiMap<QString, QVariant>()
  123. << "L4blJKqYMTSNUEt32rCgDLhxQxM=";
  124. QTest::newRow("put") << QUrl("http://example.net")
  125. << QOAuth1Signature::HttpRequestMethod::Put
  126. << QByteArray()
  127. << "1.0"
  128. << "key"
  129. << "secret"
  130. << "accesskey"
  131. << "accesssecret"
  132. << "468167367"
  133. << "1494852816"
  134. << QMultiMap<QString, QVariant>()
  135. << "+eiZ+phNoYnETf6SqI+XSE43JSY=";
  136. QTest::newRow("delete") << QUrl("http://example.net")
  137. << QOAuth1Signature::HttpRequestMethod::Delete
  138. << QByteArray()
  139. << "1.0"
  140. << "key"
  141. << "secret"
  142. << "accesskey"
  143. << "accesssecret"
  144. << "468167367"
  145. << "1494852816"
  146. << QMultiMap<QString, QVariant>()
  147. << "enbOVNG7/vGliie2/L44NdccMaw=";
  148. QTest::newRow("head") << QUrl("http://example.net")
  149. << QOAuth1Signature::HttpRequestMethod::Head
  150. << QByteArray()
  151. << "1.0"
  152. << "key"
  153. << "secret"
  154. << "accesskey"
  155. << "accesssecret"
  156. << "468167367"
  157. << "1494852816"
  158. << QMultiMap<QString, QVariant>()
  159. << "6v74w0rRsVibJsJ796Nj8cJPqEU=";
  160. QTest::newRow("no-hmac-key") << QUrl("http://example.net")
  161. << QOAuth1Signature::HttpRequestMethod::Get
  162. << QByteArray()
  163. << "1.0"
  164. << "key"
  165. << QString()
  166. << "accesskey"
  167. << QString()
  168. << "468167367"
  169. << "1494852816"
  170. << QMultiMap<QString, QVariant>()
  171. << "N2qP+LJdLbjalZq71M7oxPdeUjc=";
  172. QTest::newRow("custom-values") << QUrl("http://example.net")
  173. << QOAuth1Signature::HttpRequestMethod::Get
  174. << QByteArray()
  175. << "1.0"
  176. << "key"
  177. << "secret"
  178. << "accesskey"
  179. << "accesssecret"
  180. << "468167367"
  181. << "1494852816"
  182. << QMultiMap<QString, QVariant> {
  183. { "firstKey", "firstValue" },
  184. { "secondKey", "secondValue" }
  185. }
  186. << "xNXgQaO0LrQMbJZGSfKFUmWwGDw=";
  187. QTest::newRow("custom-verb-get") << QUrl("http://example.net")
  188. << QOAuth1Signature::HttpRequestMethod::Custom
  189. << QByteArray("GET")
  190. << "1.0"
  191. << "key"
  192. << "secret"
  193. << "accesskey"
  194. << "accesssecret"
  195. << "468167367"
  196. << "1494852816"
  197. << QMultiMap<QString, QVariant>()
  198. << "mQaARxv7pqJyViuwNGtUfm6QSIQ=";
  199. QTest::newRow("custom-verb-patch") << QUrl("http://example.net")
  200. << QOAuth1Signature::HttpRequestMethod::Custom
  201. << QByteArray("PATCH")
  202. << "1.0"
  203. << "key"
  204. << "secret"
  205. << "accesskey"
  206. << "accesssecret"
  207. << "468167367"
  208. << "1494852816"
  209. << QMultiMap<QString, QVariant>()
  210. << "kcRO68D7IBQWlQvUR/jkhuF8AKM=";
  211. }
  212. void tst_OAuth1Signature::signatures()
  213. {
  214. // Should match the reference implementation at
  215. // http://bettiolo.github.io/oauth-reference-page/
  216. QFETCH(QUrl, url);
  217. QFETCH(QOAuth1Signature::HttpRequestMethod, method);
  218. QFETCH(QByteArray, customVerb);
  219. QFETCH(QString, version);
  220. QFETCH(QString, consumerKey);
  221. QFETCH(QString, consumerSecret);
  222. QFETCH(QString, token);
  223. QFETCH(QString, tokenSecret);
  224. QFETCH(QString, nonce);
  225. QFETCH(QString, timestamp);
  226. using MultiMap = QMultiMap<QString, QVariant>;
  227. QFETCH(MultiMap, parameters);
  228. QFETCH(QString, result);
  229. parameters.insert(oauthVersion, version);
  230. parameters.insert(oauthConsumerKey, consumerKey);
  231. parameters.insert(oauthNonce, nonce);
  232. parameters.insert(oauthSignatureMethod, "HMAC-SHA1");
  233. parameters.insert(oauthTimestamp, timestamp);
  234. parameters.insert(oauthToken, token);
  235. QOAuth1Signature signature(url, consumerSecret, tokenSecret, method, parameters);
  236. if (method == QOAuth1Signature::HttpRequestMethod::Custom)
  237. signature.setCustomMethodString(customVerb);
  238. const auto signatureData = signature.hmacSha1();
  239. QCOMPARE(signatureData.toBase64(), result.toLatin1());
  240. }
  241. QTEST_MAIN(tst_OAuth1Signature)
  242. #include "tst_oauth1signature.moc"