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