Merge error message & SSLv3 option for subsonic.

This commit is contained in:
John Maguire 2013-05-30 11:56:03 +02:00
commit 6fa1b60f2f
4 changed files with 64 additions and 5 deletions

View File

@ -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
network_->deleteLater();
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;
@ -237,7 +244,23 @@ void SubsonicService::OnPingFinished(QNetworkReply* reply) {
reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) {
login_state_ = LoginState_BadServer;
switch(reply->error()) {
case QNetworkReply::ConnectionRefusedError:
login_state_ = LoginState_ConnectionRefused;
break;
case QNetworkReply::HostNotFoundError:
login_state_ = LoginState_HostNotFound;
break;
case QNetworkReply::TimeoutError:
login_state_ = LoginState_Timeout;
break;
case QNetworkReply::SslHandshakeFailedError:
login_state_ = LoginState_SslError;
break;
default: //Treat uncaught error types here as generic
login_state_ = LoginState_BadServer;
break;
}
qLog(Error) << "Failed to connect ("
<< Utilities::EnumToString(QNetworkReply::staticMetaObject, "NetworkError", reply->error())
<< "):" << reply->errorString();

View File

@ -33,6 +33,10 @@ class SubsonicService : public InternetService
LoginState_Unlicensed,
LoginState_OtherError,
LoginState_Unknown,
LoginState_ConnectionRefused,
LoginState_HostNotFound,
LoginState_Timeout,
LoginState_SslError,
};
enum ApiError {
@ -68,7 +72,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 +115,7 @@ class SubsonicService : public InternetService
QString server_;
QString username_;
QString password_;
bool usesslv3_;
LoginState login_state_;

View File

@ -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)
@ -100,6 +103,26 @@ void SubsonicSettingsPage::LoginStateChanged(SubsonicService::LoginState newstat
ui_->login_state->SetAccountTypeText(tr("An unspecified error occurred."));
break;
case SubsonicService::LoginState_ConnectionRefused:
ui_->login_state->SetAccountTypeText(tr("Connection refused by server, check server URL. "
"Example: http://localhost:4040/"));
break;
case SubsonicService::LoginState_HostNotFound:
ui_->login_state->SetAccountTypeText(tr("Host not found, check server URL. "
"Example: http://localhost:4040/"));
break;
case SubsonicService::LoginState_Timeout:
ui_->login_state->SetAccountTypeText(tr("Connection timed out, check server URL. "
"Example: http://localhost:4040/"));
break;
case SubsonicService::LoginState_SslError:
ui_->login_state->SetAccountTypeText(tr("SSL handshake error, verify server configuration. "
"SSLv3 option below may workaround some issues."));
break;
default:
break;
}
@ -128,7 +151,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()

View File

@ -57,6 +57,13 @@
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="server"/>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="usesslv3">
<property name="text">
<string>Use SSLv3</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="login">
<property name="text">
@ -94,6 +101,7 @@
<tabstop>server</tabstop>
<tabstop>username</tabstop>
<tabstop>password</tabstop>
<tabstop>usesslv3</tabstop>
<tabstop>login</tabstop>
</tabstops>
<resources/>