diff --git a/src/internet/subsonicservice.cpp b/src/internet/subsonicservice.cpp
index ae9d40260..de95ca4cc 100644
--- a/src/internet/subsonicservice.cpp
+++ b/src/internet/subsonicservice.cpp
@@ -151,6 +151,7 @@ void SubsonicService::ReloadSettings() {
server_ = s.value("server").toString();
username_ = s.value("username").toString();
password_ = s.value("password").toString();
+ usesslv3_ = s.value("usesslv3").toBool();
Login();
}
@@ -162,7 +163,9 @@ bool SubsonicService::IsConfigured() const {
}
void SubsonicService::Login() {
- // Forget session ID
+ // Recreate fresh network state, otherwise old HTTPS settings seem to get reused
+ // This might leave stale idle connections around in background, but this shouldn't get called regularly
+ network_ = new QNetworkAccessManager(this);
network_->setCookieJar(new QNetworkCookieJar(network_));
// Forget login state whilst waiting
login_state_ = LoginState_Unknown;
@@ -174,10 +177,11 @@ void SubsonicService::Login() {
}
void SubsonicService::Login(
- const QString& server, const QString& username, const QString& password) {
+ const QString& server, const QString& username, const QString& password, const bool& usesslv3) {
server_ = server;
username_ = username;
password_ = password;
+ usesslv3_ = usesslv3;
Login();
}
@@ -203,6 +207,9 @@ QNetworkReply* SubsonicService::Send(const QUrl& url) {
// certainly be self-signed.
QSslConfiguration sslconfig = QSslConfiguration::defaultConfiguration();
sslconfig.setPeerVerifyMode(QSslSocket::VerifyNone);
+ if (usesslv3_) {
+ sslconfig.setProtocol(QSsl::SslV3);
+ }
request.setSslConfiguration(sslconfig);
QNetworkReply *reply = network_->get(request);
return reply;
diff --git a/src/internet/subsonicservice.h b/src/internet/subsonicservice.h
index d2d22be39..9b58228f3 100644
--- a/src/internet/subsonicservice.h
+++ b/src/internet/subsonicservice.h
@@ -68,7 +68,7 @@ class SubsonicService : public InternetService
void Login();
void Login(
- const QString &server, const QString &username, const QString &password);
+ const QString &server, const QString &username, const QString &password, const bool &usesslv3);
LoginState login_state() const { return login_state_; }
// Subsonic API methods
@@ -111,6 +111,7 @@ class SubsonicService : public InternetService
QString server_;
QString username_;
QString password_;
+ bool usesslv3_;
LoginState login_state_;
diff --git a/src/internet/subsonicsettingspage.cpp b/src/internet/subsonicsettingspage.cpp
index a1a3214e8..e472a83c0 100644
--- a/src/internet/subsonicsettingspage.cpp
+++ b/src/internet/subsonicsettingspage.cpp
@@ -23,6 +23,7 @@ SubsonicSettingsPage::SubsonicSettingsPage(SettingsDialog *dialog)
ui_->login_state->AddCredentialField(ui_->server);
ui_->login_state->AddCredentialField(ui_->username);
ui_->login_state->AddCredentialField(ui_->password);
+ ui_->login_state->AddCredentialField(ui_->usesslv3);
ui_->login_state->AddCredentialGroup(ui_->server_group);
ui_->login_state->SetAccountTypeText(tr(
@@ -43,6 +44,7 @@ void SubsonicSettingsPage::Load()
ui_->server->setText(s.value("server").toString());
ui_->username->setText(s.value("username").toString());
ui_->password->setText(s.value("password").toString());
+ ui_->usesslv3->setChecked(s.value("usesslv3").toBool());
// If the settings are complete, SubsonicService will have used them already and
// we can tell the user if they worked
@@ -59,6 +61,7 @@ void SubsonicSettingsPage::Save()
s.setValue("server", ui_->server->text());
s.setValue("username", ui_->username->text());
s.setValue("password", ui_->password->text());
+ s.setValue("usesslv3", ui_->usesslv3->isChecked());
}
void SubsonicSettingsPage::LoginStateChanged(SubsonicService::LoginState newstate)
@@ -128,7 +131,7 @@ void SubsonicSettingsPage::ServerEditingFinished() {
void SubsonicSettingsPage::Login()
{
ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress);
- service_->Login(ui_->server->text(), ui_->username->text(), ui_->password->text());
+ service_->Login(ui_->server->text(), ui_->username->text(), ui_->password->text(), ui_->usesslv3->isChecked());
}
void SubsonicSettingsPage::Logout()
diff --git a/src/internet/subsonicsettingspage.ui b/src/internet/subsonicsettingspage.ui
index d687ffc53..4b7fd08a6 100644
--- a/src/internet/subsonicsettingspage.ui
+++ b/src/internet/subsonicsettingspage.ui
@@ -57,6 +57,13 @@
-
+ -
+
+
+ Use SSLv3
+
+
+
-
@@ -94,6 +101,7 @@
server
username
password
+ usesslv3
login