diff --git a/src/subsonic/subsonicbaserequest.cpp b/src/subsonic/subsonicbaserequest.cpp
index 4e5afcd5f..c10b05840 100644
--- a/src/subsonic/subsonicbaserequest.cpp
+++ b/src/subsonic/subsonicbaserequest.cpp
@@ -57,7 +57,25 @@ SubsonicBaseRequest::SubsonicBaseRequest(SubsonicService *service, QObject *pare
}
-QUrl SubsonicBaseRequest::CreateUrl(const QString &ressource_name, const QList ¶ms_provided) const {
+void SubsonicBaseRequest::AddPasswordToParams(ParamList ¶ms, const SubsonicSettingsPage::AuthMethod auth_method, const QString &password) {
+
+ if (password.isEmpty()) return;
+
+ if (auth_method == SubsonicSettingsPage::AuthMethod_Hex) {
+ params << Param("p", QString("enc:" + password.toUtf8().toHex()));
+ }
+ else {
+ const QString salt = Utilities::CryptographicRandomString(20);
+ QCryptographicHash md5(QCryptographicHash::Md5);
+ md5.addData(password.toUtf8());
+ md5.addData(salt.toUtf8());
+ params << Param("s", salt);
+ params << Param("t", md5.result().toHex());
+ }
+
+}
+
+QUrl SubsonicBaseRequest::CreateUrl(const QString &ressource_name, const ParamList ¶ms_provided) const {
ParamList params = ParamList() << params_provided
<< Param("c", client_name())
@@ -65,17 +83,7 @@ QUrl SubsonicBaseRequest::CreateUrl(const QString &ressource_name, const QList
auth_method() == SubsonicSettingsPage::AuthMethod_Hex) {
- params << Param("p", QString("enc:" + password().toUtf8().toHex()));
- }
- else {
- const QString salt = Utilities::CryptographicRandomString(20);
- QCryptographicHash md5(QCryptographicHash::Md5);
- md5.addData(password().toUtf8());
- md5.addData(salt.toUtf8());
- params << Param("s", salt);
- params << Param("t", md5.result().toHex());
- }
+ AddPasswordToParams(params, auth_method(), password());
QUrlQuery url_query;
for (const Param ¶m : params) {
@@ -97,7 +105,7 @@ QUrl SubsonicBaseRequest::CreateUrl(const QString &ressource_name, const QList
¶ms_provided) {
+QNetworkReply *SubsonicBaseRequest::CreateGetRequest(const QString &ressource_name, const ParamList ¶ms_provided) const {
QUrl url = CreateUrl(ressource_name, params_provided);
QNetworkRequest req(url);
diff --git a/src/subsonic/subsonicbaserequest.h b/src/subsonic/subsonicbaserequest.h
index de0ad1ffb..de4811ea9 100644
--- a/src/subsonic/subsonicbaserequest.h
+++ b/src/subsonic/subsonicbaserequest.h
@@ -37,6 +37,7 @@
#include
#include "subsonicservice.h"
+#include "settings/subsonicsettingspage.h"
class QNetworkAccessManager;
class QNetworkReply;
@@ -51,8 +52,12 @@ class SubsonicBaseRequest : public QObject {
typedef QPair Param;
typedef QList ParamList;
- QUrl CreateUrl(const QString &ressource_name, const QList ¶ms_provided) const;
- QNetworkReply *CreateGetRequest(const QString &ressource_name, const QList ¶ms_provided);
+ public:
+ static void AddPasswordToParams(ParamList ¶ms, const SubsonicSettingsPage::AuthMethod auth_method, const QString &password);
+
+ protected:
+ QUrl CreateUrl(const QString &ressource_name, const ParamList ¶ms_provided) const;
+ QNetworkReply *CreateGetRequest(const QString &ressource_name, const ParamList ¶ms_provided) const;
QByteArray GetReplyData(QNetworkReply *reply);
QJsonObject ExtractJsonObj(QByteArray &data);
@@ -64,6 +69,7 @@ class SubsonicBaseRequest : public QObject {
QUrl server_url() const { return service_->server_url(); }
QString username() const { return service_->username(); }
QString password() const { return service_->password(); }
+ SubsonicSettingsPage::AuthMethod auth_method() const { return service_->auth_method(); }
bool http2() const { return service_->http2(); }
bool verify_certificate() const { return service_->verify_certificate(); }
bool download_album_covers() const { return service_->download_album_covers(); }
diff --git a/src/subsonic/subsonicurlhandler.cpp b/src/subsonic/subsonicurlhandler.cpp
index 935f701e3..07234aed3 100644
--- a/src/subsonic/subsonicurlhandler.cpp
+++ b/src/subsonic/subsonicurlhandler.cpp
@@ -27,6 +27,7 @@
#include "core/song.h"
#include "subsonicservice.h"
+#include "subsonicbaserequest.h"
#include "subsonicurlhandler.h"
class Application;
@@ -45,13 +46,14 @@ UrlHandler::LoadResult SubsonicUrlHandler::StartLoading(const QUrl &url) {
return LoadResult(url, LoadResult::Error, tr("Missing Subsonic username or password."));
}
- ParamList params = ParamList() << Param("c", service_->client_name())
- << Param("v", service_->api_version())
+ ParamList params = ParamList() << Param("c", client_name())
+ << Param("v", api_version())
<< Param("f", "json")
- << Param("u", service_->username())
- << Param("p", QString("enc:" + service_->password().toUtf8().toHex()))
+ << Param("u", username())
<< Param("id", url.path());
+ SubsonicBaseRequest::AddPasswordToParams(params, auth_method(), password());
+
QUrlQuery url_query;
for (const Param ¶m : params) {
url_query.addQueryItem(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second));
diff --git a/src/subsonic/subsonicurlhandler.h b/src/subsonic/subsonicurlhandler.h
index 387a18bc5..6fca16d53 100644
--- a/src/subsonic/subsonicurlhandler.h
+++ b/src/subsonic/subsonicurlhandler.h
@@ -42,9 +42,12 @@ class SubsonicUrlHandler : public UrlHandler {
explicit SubsonicUrlHandler(Application *app, SubsonicService *service);
QString scheme() const override { return service_->url_scheme(); }
+ QString client_name() const { return service_->client_name(); }
+ QString api_version() const { return service_->api_version(); }
QUrl server_url() const { return service_->server_url(); }
QString username() const { return service_->username(); }
QString password() const { return service_->password(); }
+ SubsonicSettingsPage::AuthMethod auth_method() const { return service_->auth_method(); }
LoadResult StartLoading(const QUrl &url) override;