Rockbox Utility: fix proxy password getting lost (FS#12166).
The proxy settings are stored as string representation in the configuration
file. If username / password contains characters used as separators parsing the
string again will cause wrong results. Percent-encode them before storing, and
parse it as percent-encoded string when reading it back.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30071 a1c6a512-1295-4272-9138-f99709370657
diff --git a/rbutil/rbutilqt/configure.cpp b/rbutil/rbutilqt/configure.cpp
index 50af453..35654f8 100644
--- a/rbutil/rbutilqt/configure.cpp
+++ b/rbutil/rbutilqt/configure.cpp
@@ -121,7 +121,16 @@
proxy.setPort(ui.proxyPort->text().toInt());
}
- RbSettings::setValue(RbSettings::Proxy, proxy.toString());
+ // QUrl::toEncoded() doesn't encode a colon in the password correctly,
+ // which will result in errors during parsing the string.
+ // QUrl::toPercentEncoding() does work as expected, so build the string to
+ // store in the configuration file manually.
+ QString proxystring = "http://"
+ + QString(QUrl::toPercentEncoding(proxy.userName())) + ":"
+ + QString(QUrl::toPercentEncoding(proxy.password())) + "@"
+ + proxy.host() + ":"
+ + QString::number(proxy.port());
+ RbSettings::setValue(RbSettings::Proxy, proxystring);
qDebug() << "[Config] setting proxy to:" << proxy;
// proxy type
QString proxyType;
@@ -218,7 +227,7 @@
void Config::setUserSettings()
{
// set proxy
- proxy = RbSettings::value(RbSettings::Proxy).toString();
+ proxy.setEncodedUrl(RbSettings::value(RbSettings::Proxy).toByteArray());
if(proxy.port() > 0)
ui.proxyPort->setText(QString("%1").arg(proxy.port()));
diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp
index 59ba9e3..835fb0d 100644
--- a/rbutil/rbutilqt/rbutilqt.cpp
+++ b/rbutil/rbutilqt/rbutilqt.cpp
@@ -1240,11 +1240,13 @@
QUrl RbUtilQt::proxy()
{
+ QUrl proxy;
if(RbSettings::value(RbSettings::ProxyType) == "manual")
- return QUrl(RbSettings::value(RbSettings::Proxy).toString());
+ proxy.setEncodedUrl(RbSettings::value(RbSettings::Proxy).toByteArray());
else if(RbSettings::value(RbSettings::ProxyType) == "system")
- return System::systemProxy();
- return QUrl("");
+ proxy = System::systemProxy();
+ qDebug() << proxy.userName() << proxy.password() << proxy.host() << proxy.port();
+ return proxy;
}