Merge pull request #7951 from nextcloud/feature/rmglobalnetwork

Removes global network settings
This commit is contained in:
Matthieu Gallien 2025-07-16 19:21:48 +02:00 committed by GitHub
commit c7cd3585d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 241 additions and 319 deletions

View File

@ -42,7 +42,6 @@ constexpr auto serverVersionC = "serverVersion";
constexpr auto serverColorC = "serverColor";
constexpr auto serverTextColorC = "serverTextColor";
constexpr auto skipE2eeMetadataChecksumValidationC = "skipE2eeMetadataChecksumValidation";
constexpr auto networkProxySettingC = "networkProxySetting";
constexpr auto networkProxyTypeC = "networkProxyType";
constexpr auto networkProxyHostNameC = "networkProxyHostName";
constexpr auto networkProxyPortC = "networkProxyPort";
@ -118,22 +117,25 @@ AccountManager::AccountsRestoreResult AccountManager::restore(const bool alsoRes
for (const auto &accountId : settingsChildGroups) {
settings->beginGroup(accountId);
if (!skipSettingsKeys.contains(settings->group())) {
if (const auto acc = loadAccountHelper(*settings)) {
acc->_id = accountId;
const auto accState = new AccountState(acc);
const auto jar = qobject_cast<CookieJar*>(acc->_networkAccessManager->cookieJar());
Q_ASSERT(jar);
if (jar) {
jar->restore(acc->cookieJarPath());
}
addAccountState(accState);
const auto acc = loadAccountHelper(*settings);
if (!acc) {
continue;
}
acc->_id = accountId;
const auto accState = new AccountState(acc);
const auto jar = qobject_cast<CookieJar*>(acc->_networkAccessManager->cookieJar());
Q_ASSERT(jar);
if (jar) {
jar->restore(acc->cookieJarPath());
}
addAccountState(accState);
settings->endGroup();
moveNetworkSettingsFromGlobalToAccount(acc);
} else {
qCInfo(lcAccountManager) << "Account" << accountId << "is too new, ignoring";
_additionalBlockedAccountIds.insert(accountId);
result = AccountsRestoreSuccessWithSkipped;
}
settings->endGroup();
}
return result;
@ -265,10 +267,13 @@ bool AccountManager::restoreFromLegacySettings()
const auto childGroups = settings->childGroups();
for (const auto &accountId : childGroups) {
settings->beginGroup(accountId);
if (const auto acc = loadAccountHelper(*settings)) {
addAccount(acc);
const auto acc = loadAccountHelper(*settings);
if (!acc) {
continue;
}
addAccount(acc);
settings->endGroup();
moveNetworkSettingsFromGlobalToAccount(acc);
}
return true;
}
@ -336,7 +341,7 @@ void AccountManager::saveAccountHelper(const AccountPtr &account, QSettings &set
} else {
settings.setValue(QLatin1String(skipE2eeMetadataChecksumValidationC), account->_skipE2eeMetadataChecksumValidation);
}
settings.setValue(networkProxySettingC, static_cast<std::underlying_type_t<Account::AccountNetworkProxySetting>>(account->networkProxySetting()));
settings.setValue(networkProxyTypeC, account->proxyType());
settings.setValue(networkProxyHostNameC, account->proxyHostName());
settings.setValue(networkProxyPortC, account->proxyPort());
@ -427,6 +432,34 @@ void AccountManager::saveAccountHelper(const AccountPtr &account, QSettings &set
}
}
void AccountManager::moveNetworkSettingsFromGlobalToAccount(const AccountPtr &account)
{
ConfigFile configFile;
const auto hostname = configFile.proxyHostName();
if (!hostname.isEmpty()) {
account->setProxySettings(static_cast<QNetworkProxy::ProxyType>(configFile.proxyType()),
hostname,
configFile.proxyPort(),
configFile.proxyNeedsAuth(),
configFile.proxyUser(),
configFile.proxyPassword());
ClientProxy().cleanupGlobalNetworkConfiguration();
}
const auto useUploadLimit = configFile.useUploadLimit();
const auto useDownloadLimit = configFile.useDownloadLimit();
if (useUploadLimit == 0 && useDownloadLimit == 0) {
return;
}
account->setUploadLimitSetting(static_cast<Account::AccountNetworkTransferLimitSetting>(useUploadLimit));
account->setUploadLimit(configFile.uploadLimit());
account->setDownloadLimitSetting(static_cast<Account::AccountNetworkTransferLimitSetting>(useDownloadLimit));
account->setDownloadLimit(configFile.downloadLimit());
configFile.cleanupGlobalNetworkConfiguration();
}
AccountPtr AccountManager::loadAccountHelper(QSettings &settings)
{
const auto urlConfig = settings.value(QLatin1String(urlC));
@ -500,8 +533,6 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings)
}
acc->setCredentials(CredentialsFactory::create(authType));
acc->setNetworkProxySetting(settings.value(networkProxySettingC).value<Account::AccountNetworkProxySetting>());
acc->setProxyType(settings.value(networkProxyTypeC).value<QNetworkProxy::ProxyType>());
acc->setProxyHostName(settings.value(networkProxyHostNameC).toString());
acc->setProxyPort(settings.value(networkProxyPortC).toInt());
@ -510,13 +541,14 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings)
acc->setUploadLimitSetting(
settings.value(
networkUploadLimitSettingC,
QVariant::fromValue(Account::AccountNetworkTransferLimitSetting::GlobalLimit)
QVariant::fromValue(Account::AccountNetworkTransferLimitSetting::NoLimit)
).value<Account::AccountNetworkTransferLimitSetting>());
acc->setDownloadLimitSetting(
settings.value(
networkDownloadLimitSettingC,
QVariant::fromValue(Account::AccountNetworkTransferLimitSetting::GlobalLimit)
QVariant::fromValue(Account::AccountNetworkTransferLimitSetting::NoLimit)
).value<Account::AccountNetworkTransferLimitSetting>());
acc->setUploadLimit(settings.value(networkUploadLimitC).toInt());
acc->setDownloadLimit(settings.value(networkDownloadLimitC).toInt());

View File

@ -112,6 +112,7 @@ private:
// saving and loading Account to settings
void saveAccountHelper(const AccountPtr &account, QSettings &settings, bool saveCredentials = true);
AccountPtr loadAccountHelper(QSettings &settings);
void moveNetworkSettingsFromGlobalToAccount(const AccountPtr &account);
bool restoreFromLegacySettings();

View File

@ -293,7 +293,7 @@ Application::Application(int &argc, char **argv)
ConfigFile().setProxyType(QNetworkProxy::NoProxy);
for (const auto &accountState : AccountManager::instance()->accounts()) {
if (accountState && accountState->account()) {
accountState->account()->setNetworkProxySetting(Account::AccountNetworkProxySetting::GlobalProxy);
accountState->account()->setProxyType(QNetworkProxy::NoProxy);
}
}
}
@ -397,6 +397,15 @@ Application::Application(int &argc, char **argv)
_gui->setupCloudProviders();
#endif
if (_theme->doNotUseProxy()) {
ConfigFile().setProxyType(QNetworkProxy::NoProxy);
for (const auto &accountState : AccountManager::instance()->accounts()) {
if (accountState && accountState->account()) {
accountState->account()->setProxyType(QNetworkProxy::NoProxy);
}
}
}
_proxy.setupQtProxyFromConfig(); // folders have to be defined first, than we set up the Qt proxy.
connect(AccountManager::instance(), &AccountManager::accountAdded,

View File

@ -52,8 +52,7 @@ void ConnectionValidator::checkServerAndAuth()
_isCheckingServerAndAuth = true;
// Lookup system proxy in a thread https://github.com/owncloud/client/issues/2993
if ((ClientProxy::isUsingSystemDefault() && _account->networkProxySetting() == Account::AccountNetworkProxySetting::GlobalProxy)
|| _account->proxyType() == QNetworkProxy::DefaultProxy) {
if (ClientProxy::isUsingSystemDefault() || _account->proxyType() == QNetworkProxy::DefaultProxy) {
qCDebug(lcConnectionValidator) << "Trying to look up system proxy";
ClientProxy::lookupSystemProxyAsync(_account->url(), this, SLOT(systemProxyLookupDone(QNetworkProxy)));
} else {

View File

@ -1202,27 +1202,21 @@ SyncOptions Folder::initializeSyncOptions() const
void Folder::setDirtyNetworkLimits()
{
const auto account = _accountState->account();
const auto useGlobalDown = account->downloadLimitSetting() == Account::AccountNetworkTransferLimitSetting::GlobalLimit;
const auto useGlobalUp = account->uploadLimitSetting() == Account::AccountNetworkTransferLimitSetting::GlobalLimit;
ConfigFile cfg;
int downloadLimit = -75; // 75%
const auto useDownLimit = useGlobalDown
? cfg.useDownloadLimit()
: static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(account->downloadLimitSetting());
const auto useDownLimit = static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(account->downloadLimitSetting());
if (useDownLimit >= 1) {
downloadLimit = useGlobalDown ? cfg.downloadLimit() * 1000 : account->downloadLimit() * 1000;
downloadLimit = account->downloadLimit() * 1000;
} else if (useDownLimit == 0) {
downloadLimit = 0;
}
int uploadLimit = -75; // 75%
const auto useUpLimit = useGlobalUp
? cfg.useUploadLimit()
: static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(account->uploadLimitSetting());
const auto useUpLimit = static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(account->uploadLimitSetting());
if (useUpLimit >= 1) {
uploadLimit = useGlobalUp ? cfg.uploadLimit() * 1000 : account->uploadLimit() * 1000;
uploadLimit = account->uploadLimit() * 1000;
} else if (useUpLimit == 0) {
uploadLimit = 0;
}

View File

@ -1567,11 +1567,10 @@ void FolderMan::setDirtyProxy()
if (folder
&& folder->accountState()
&& folder->accountState()->account()
&& folder->accountState()->account()->networkAccessManager()
&& folder->accountState()->account()->networkProxySetting() == Account::AccountNetworkProxySetting::GlobalProxy) {
&& folder->accountState()->account()->networkAccessManager()) {
// Need to do this so we do not use the old determined system proxy
const auto proxy = QNetworkProxy(QNetworkProxy::DefaultProxy);
folder->accountState()->account()->networkAccessManager()->setProxy(proxy);
folder->accountState()->account()->setProxyType(proxy.type());
}
}
}

View File

@ -32,12 +32,6 @@ NetworkSettings::NetworkSettings(const AccountPtr &account, QWidget *parent)
_ui->proxyGroupBox->setVisible(!Theme::instance()->doNotUseProxy());
if (!account) {
_ui->globalProxySettingsRadioButton->setVisible(false);
_ui->globalDownloadSettingsRadioButton->setVisible(false);
_ui->globalUploadSettingsRadioButton->setVisible(false);
}
if (!Theme::instance()->doNotUseProxy()) {
_ui->hostLineEdit->setPlaceholderText(tr("Hostname of proxy server"));
_ui->userLineEdit->setPlaceholderText(tr("Username for proxy server"));
@ -83,11 +77,9 @@ NetworkSettings::NetworkSettings(const AccountPtr &account, QWidget *parent)
_ui->uploadSpinBox->setVisible(_ui->uploadLimitRadioButton->isChecked());
_ui->uploadSpinBoxLabel->setVisible(_ui->uploadLimitRadioButton->isChecked());
connect(_ui->globalUploadSettingsRadioButton, &QAbstractButton::clicked, this, &NetworkSettings::saveBWLimitSettings);
connect(_ui->uploadLimitRadioButton, &QAbstractButton::clicked, this, &NetworkSettings::saveBWLimitSettings);
connect(_ui->noUploadLimitRadioButton, &QAbstractButton::clicked, this, &NetworkSettings::saveBWLimitSettings);
connect(_ui->autoUploadLimitRadioButton, &QAbstractButton::clicked, this, &NetworkSettings::saveBWLimitSettings);
connect(_ui->globalDownloadSettingsRadioButton, &QAbstractButton::clicked, this, &NetworkSettings::saveBWLimitSettings);
connect(_ui->downloadLimitRadioButton, &QAbstractButton::clicked, this, &NetworkSettings::saveBWLimitSettings);
connect(_ui->noDownloadLimitRadioButton, &QAbstractButton::clicked, this, &NetworkSettings::saveBWLimitSettings);
connect(_ui->autoDownloadLimitRadioButton, &QAbstractButton::clicked, this, &NetworkSettings::saveBWLimitSettings);
@ -116,34 +108,28 @@ void NetworkSettings::loadProxySettings()
return;
}
const auto useGlobalProxy = !_account || _account->networkProxySetting() == Account::AccountNetworkProxySetting::GlobalProxy;
const auto cfgFile = ConfigFile();
const auto proxyType = useGlobalProxy ? cfgFile.proxyType() : _account->proxyType();
const auto proxyPort = useGlobalProxy ? cfgFile.proxyPort() : _account->proxyPort();
const auto proxyHostName = useGlobalProxy ? cfgFile.proxyHostName() : _account->proxyHostName();
const auto proxyNeedsAuth = useGlobalProxy ? cfgFile.proxyNeedsAuth() : _account->proxyNeedsAuth();
const auto proxyUser = useGlobalProxy ? cfgFile.proxyUser() : _account->proxyUser();
const auto proxyPassword = useGlobalProxy ? cfgFile.proxyPassword() : _account->proxyPassword();
const auto proxyType = _account->proxyType();
const auto proxyPort = _account->proxyPort();
const auto proxyHostName = _account->proxyHostName();
const auto proxyNeedsAuth = _account->proxyNeedsAuth();
const auto proxyUser = _account->proxyUser();
const auto proxyPassword = _account->proxyPassword();
// load current proxy settings
if (_account && _account->networkProxySetting() == Account::AccountNetworkProxySetting::GlobalProxy) {
_ui->globalProxySettingsRadioButton->setChecked(true);
} else {
switch (proxyType) {
case QNetworkProxy::NoProxy:
_ui->noProxyRadioButton->setChecked(true);
break;
case QNetworkProxy::DefaultProxy:
_ui->systemProxyRadioButton->setChecked(true);
break;
case QNetworkProxy::Socks5Proxy:
case QNetworkProxy::HttpProxy:
_ui->typeComboBox->setCurrentIndex(_ui->typeComboBox->findData(proxyType));
_ui->manualProxyRadioButton->setChecked(true);
break;
default:
break;
}
switch (proxyType) {
case QNetworkProxy::NoProxy:
_ui->noProxyRadioButton->setChecked(true);
break;
case QNetworkProxy::DefaultProxy:
_ui->systemProxyRadioButton->setChecked(true);
break;
case QNetworkProxy::Socks5Proxy:
case QNetworkProxy::HttpProxy:
_ui->typeComboBox->setCurrentIndex(_ui->typeComboBox->findData(proxyType));
_ui->manualProxyRadioButton->setChecked(true);
break;
default:
break;
}
_ui->hostLineEdit->setText(proxyHostName);
@ -155,16 +141,12 @@ void NetworkSettings::loadProxySettings()
void NetworkSettings::loadBWLimitSettings()
{
const auto useGlobalLimit = !_account || _account->downloadLimitSetting() == Account::AccountNetworkTransferLimitSetting::GlobalLimit;
const auto cfgFile = ConfigFile();
const auto useDownloadLimit = useGlobalLimit ? cfgFile.useDownloadLimit() : static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(_account->downloadLimitSetting());
const auto downloadLimit = useGlobalLimit ? cfgFile.downloadLimit() : _account->downloadLimit();
const auto useUploadLimit = useGlobalLimit ? cfgFile.useUploadLimit() : static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(_account->uploadLimitSetting());
const auto uploadLimit = useGlobalLimit ? cfgFile.uploadLimit() : _account->uploadLimit();
const auto useDownloadLimit = static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(_account->downloadLimitSetting());
const auto downloadLimit = _account->downloadLimit();
const auto useUploadLimit = static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(_account->uploadLimitSetting());
const auto uploadLimit = _account->uploadLimit();
if (_account && _account->downloadLimitSetting() == Account::AccountNetworkTransferLimitSetting::GlobalLimit) {
_ui->globalDownloadSettingsRadioButton->setChecked(true);
} else if (useDownloadLimit >= 1) {
if (useDownloadLimit >= 1) {
_ui->downloadLimitRadioButton->setChecked(true);
} else if (useDownloadLimit == 0) {
_ui->noDownloadLimitRadioButton->setChecked(true);
@ -173,9 +155,7 @@ void NetworkSettings::loadBWLimitSettings()
}
_ui->downloadSpinBox->setValue(downloadLimit);
if (_account && _account->uploadLimitSetting() == Account::AccountNetworkTransferLimitSetting::GlobalLimit) {
_ui->globalUploadSettingsRadioButton->setChecked(true);
} else if (useUploadLimit >= 1) {
if (useUploadLimit >= 1) {
_ui->uploadLimitRadioButton->setChecked(true);
} else if (useUploadLimit == 0) {
_ui->noUploadLimitRadioButton->setChecked(true);
@ -189,7 +169,6 @@ void NetworkSettings::saveProxySettings()
{
checkEmptyProxyHost();
const auto useGlobalProxy = _ui->globalProxySettingsRadioButton->isChecked();
const auto user = _ui->userLineEdit->text();
const auto password = _ui->passwordLineEdit->text();
const auto host = _ui->hostLineEdit->text();
@ -210,27 +189,10 @@ void NetworkSettings::saveProxySettings()
}
if (_account) { // We must be setting up network proxy for a specific account
const auto proxySetting = useGlobalProxy ? Account::AccountNetworkProxySetting::GlobalProxy : Account::AccountNetworkProxySetting::AccountSpecificProxy;
_account->setProxySettings(proxySetting, proxyType, host, port, needsAuth, user, password);
_account->setProxySettings(proxyType, host, port, needsAuth, user, password);
const auto accountState = AccountManager::instance()->accountFromUserId(_account->userIdAtHostWithPort());
accountState->freshConnectionAttempt();
AccountManager::instance()->saveAccount(_account);
} else {
ConfigFile().setProxyType(proxyType, host, port, needsAuth, user, password);
ClientProxy proxy;
proxy.setupQtProxyFromConfig(); // Refresh the Qt proxy settings as the
// quota check can happen all the time.
// ...and set the folders dirty, they refresh their proxy next time they
// start the sync.
FolderMan::instance()->setDirtyProxy();
const auto accounts = AccountManager::instance()->accounts();
for (const auto &accountState : accounts) {
if (accountState->account()->networkProxySetting() == Account::AccountNetworkProxySetting::GlobalProxy) {
accountState->freshConnectionAttempt();
}
}
}
}
@ -248,7 +210,7 @@ void NetworkSettings::saveBWLimitSettings()
useDownloadLimit = 0;
} else if (_ui->autoDownloadLimitRadioButton->isChecked()) {
useDownloadLimit = -1;
} else if (_account && _ui->globalDownloadSettingsRadioButton->isChecked()) {
} else if (_account) {
useDownloadLimit = -2;
}
@ -258,7 +220,7 @@ void NetworkSettings::saveBWLimitSettings()
useUploadLimit = 0;
} else if (_ui->autoUploadLimitRadioButton->isChecked()) {
useUploadLimit = -1;
} else if (_account && _ui->globalUploadSettingsRadioButton->isChecked()) {
} else if (_account) {
useUploadLimit = -2;
}
@ -268,12 +230,6 @@ void NetworkSettings::saveBWLimitSettings()
_account->setUploadLimitSetting(static_cast<Account::AccountNetworkTransferLimitSetting>(useUploadLimit));
_account->setUploadLimit(uploadLimit);
AccountManager::instance()->saveAccount(_account);
} else {
ConfigFile cfg;
cfg.setUseDownloadLimit(useDownloadLimit);
cfg.setUseUploadLimit(useUploadLimit);
cfg.setDownloadLimit(downloadLimit);
cfg.setUploadLimit(uploadLimit);
}
FolderMan::instance()->setDirtyNetworkLimits(_account);

View File

@ -45,7 +45,33 @@
<string>Proxy Settings</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<item row="0" column="0">
<widget class="QRadioButton" name="noProxyRadioButton">
<property name="text">
<string>No proxy</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">proxyButtonGroup</string>
</attribute>
</widget>
</item>
<item row="2" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="systemProxyRadioButton">
<property name="text">
<string>Use system proxy</string>
@ -55,7 +81,7 @@
</attribute>
</widget>
</item>
<item row="4" column="0" colspan="3">
<item row="3" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QWidget" name="manualSettings" native="true">
@ -90,7 +116,7 @@
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -211,7 +237,7 @@
<string/>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
<enum>QLineEdit::EchoMode::Password</enum>
</property>
</widget>
</item>
@ -231,7 +257,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -243,7 +269,7 @@
</item>
</layout>
</item>
<item row="3" column="0">
<item row="2" column="0">
<widget class="QRadioButton" name="manualProxyRadioButton">
<property name="text">
<string>Manually specify proxy</string>
@ -253,42 +279,6 @@
</attribute>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="noProxyRadioButton">
<property name="text">
<string>No proxy</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">proxyButtonGroup</string>
</attribute>
</widget>
</item>
<item row="3" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="globalProxySettingsRadioButton">
<property name="text">
<string>Use global settings</string>
</property>
<attribute name="buttonGroup">
<string notr="true">proxyButtonGroup</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
@ -312,7 +302,7 @@
<string>Download Bandwidth</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="topMargin">
@ -324,7 +314,14 @@
<property name="verticalSpacing">
<number>6</number>
</property>
<item row="1" column="0" colspan="2">
<item row="3" column="0">
<widget class="QRadioButton" name="downloadLimitRadioButton">
<property name="text">
<string>Limit to</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="noDownloadLimitRadioButton">
<property name="text">
<string>No limit</string>
@ -334,7 +331,17 @@
</property>
</widget>
</item>
<item row="5" column="0">
<item row="1" column="0" colspan="2">
<widget class="QRadioButton" name="autoDownloadLimitRadioButton">
<property name="toolTip">
<string>Limit to 3/4 of estimated bandwidth</string>
</property>
<property name="text">
<string>Limit automatically</string>
</property>
</widget>
</item>
<item row="4" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QSpinBox" name="downloadSpinBox">
@ -364,10 +371,10 @@
</item>
</layout>
</item>
<item row="6" column="0">
<item row="5" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -377,30 +384,6 @@
</property>
</spacer>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="downloadLimitRadioButton">
<property name="text">
<string>Limit to</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QRadioButton" name="autoDownloadLimitRadioButton">
<property name="toolTip">
<string>Limit to 3/4 of estimated bandwidth</string>
</property>
<property name="text">
<string>Limit automatically</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="globalDownloadSettingsRadioButton">
<property name="text">
<string>Use global settings</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -416,7 +399,7 @@
<string>Upload Bandwidth</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
</property>
<property name="flat">
<bool>false</bool>
@ -431,47 +414,7 @@
<property name="verticalSpacing">
<number>6</number>
</property>
<item row="2" column="0" colspan="2">
<widget class="QRadioButton" name="autoUploadLimitRadioButton">
<property name="toolTip">
<string>Limit to 3/4 of estimated bandwidth</string>
</property>
<property name="text">
<string>Limit automatically</string>
</property>
</widget>
</item>
<item row="5" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="uploadLimitRadioButton">
<property name="text">
<string>Limit to</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QRadioButton" name="noUploadLimitRadioButton">
<property name="text">
<string>No limit</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0,0">
<item>
<widget class="QSpinBox" name="uploadSpinBox">
@ -504,19 +447,51 @@
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="globalUploadSettingsRadioButton">
<item row="2" column="0">
<widget class="QRadioButton" name="uploadLimitRadioButton">
<property name="text">
<string>Use global settings</string>
<string>Limit to</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QRadioButton" name="autoUploadLimitRadioButton">
<property name="toolTip">
<string>Limit to 3/4 of estimated bandwidth</string>
</property>
<property name="text">
<string>Limit automatically</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="noUploadLimitRadioButton">
<property name="text">
<string>No limit</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
<zorder>autoUploadLimitRadioButton</zorder>
<zorder>uploadLimitRadioButton</zorder>
<zorder>noUploadLimitRadioButton</zorder>
<zorder>verticalSpacer_3</zorder>
<zorder>globalUploadSettingsRadioButton</zorder>
</widget>
</item>
</layout>

View File

@ -178,8 +178,7 @@ void OwncloudSetupWizard::slotCheckServer(const QString &urlString)
account->networkAccessManager()->clearAccessCache();
// Lookup system proxy in a thread https://github.com/owncloud/client/issues/2993
if ((ClientProxy::isUsingSystemDefault() && account->networkProxySetting() == Account::AccountNetworkProxySetting::GlobalProxy)
|| account->proxyType() == QNetworkProxy::DefaultProxy) {
if (ClientProxy::isUsingSystemDefault() || account->proxyType() == QNetworkProxy::DefaultProxy) {
qCDebug(lcWizard) << "Trying to look up system proxy";
ClientProxy::lookupSystemProxyAsync(account->url(), this, SLOT(slotSystemProxyLookupDone(QNetworkProxy)));
} else {

View File

@ -62,8 +62,7 @@ void ProxyAuthHandler::handleProxyAuthenticationRequired(
// If the user explicitly configured the proxy in the
// network settings, don't ask about it.
if ((account && (account->networkProxySetting() == Account::AccountNetworkProxySetting::GlobalProxy
|| account->proxyType() == QNetworkProxy::HttpProxy
if ((account && (account->proxyType() == QNetworkProxy::HttpProxy
|| account->proxyType() == QNetworkProxy::Socks5Proxy))
|| _configFile->proxyType() == QNetworkProxy::HttpProxy
|| _configFile->proxyType() == QNetworkProxy::Socks5Proxy) {

View File

@ -126,14 +126,7 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent)
connect(AccountManager::instance(), &AccountManager::capabilitiesChanged, generalSettings, &GeneralSettings::loadUpdateChannelsList);
#endif
QAction *networkAction = createColorAwareAction(QLatin1String(":/client/theme/network.svg"), tr("Network"));
_actionGroup->addAction(networkAction);
_toolBar->addAction(networkAction);
auto *networkSettings = new NetworkSettings;
_ui->stack->addWidget(networkSettings);
_actionGroupWidgets.insert(generalAction, generalSettings);
_actionGroupWidgets.insert(networkAction, networkSettings);
const auto accountsList = AccountManager::instance()->accounts();
for (const auto &account : accountsList) {

View File

@ -1169,38 +1169,6 @@ void Account::updateDesktopEnterpriseChannel()
}
}
Account::AccountNetworkProxySetting Account::networkProxySetting() const
{
return _networkProxySetting;
}
void Account::setNetworkProxySetting(const AccountNetworkProxySetting setting)
{
if (setting == _networkProxySetting) {
return;
}
_networkProxySetting = setting;
if (setting == AccountNetworkProxySetting::AccountSpecificProxy) {
auto proxy = _networkAccessManager->proxy();
proxy.setType(proxyType());
proxy.setHostName(proxyHostName());
proxy.setPort(proxyPort());
proxy.setUser(proxyUser());
proxy.setPassword(proxyPassword());
_networkAccessManager->setProxy(proxy);
} else {
const auto proxy = QNetworkProxy::applicationProxy();
_networkAccessManager->setProxy(proxy);
setProxyType(proxy.type());
setProxyHostName(proxy.hostName());
setProxyPort(proxy.port());
setProxyUser(proxy.user());
setProxyPassword(proxy.password());
}
emit networkProxySettingChanged();
}
QNetworkProxy::ProxyType Account::proxyType() const
{
return _proxyType;
@ -1214,11 +1182,13 @@ void Account::setProxyType(QNetworkProxy::ProxyType proxyType)
_proxyType = proxyType;
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
auto proxy = _networkAccessManager->proxy();
proxy.setType(proxyType);
_networkAccessManager->setProxy(proxy);
}
auto proxy = _networkAccessManager->proxy();
proxy.setType(proxyType);
proxy.setHostName(proxyHostName());
proxy.setPort(proxyPort());
proxy.setUser(proxyUser());
proxy.setPassword(proxyPassword());
_networkAccessManager->setProxy(proxy);
emit proxyTypeChanged();
}
@ -1236,11 +1206,9 @@ void Account::setProxyHostName(const QString &hostName)
_proxyHostName = hostName;
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
auto proxy = _networkAccessManager->proxy();
proxy.setHostName(hostName);
_networkAccessManager->setProxy(proxy);
}
auto proxy = _networkAccessManager->proxy();
proxy.setHostName(hostName);
_networkAccessManager->setProxy(proxy);
emit proxyHostNameChanged();
}
@ -1258,11 +1226,9 @@ void Account::setProxyPort(const int port)
_proxyPort = port;
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
auto proxy = _networkAccessManager->proxy();
proxy.setPort(port);
_networkAccessManager->setProxy(proxy);
}
auto proxy = _networkAccessManager->proxy();
proxy.setPort(port);
_networkAccessManager->setProxy(proxy);
emit proxyPortChanged();
}
@ -1295,11 +1261,9 @@ void Account::setProxyUser(const QString &user)
_proxyUser = user;
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
auto proxy = _networkAccessManager->proxy();
proxy.setUser(user);
_networkAccessManager->setProxy(proxy);
}
auto proxy = _networkAccessManager->proxy();
proxy.setUser(user);
_networkAccessManager->setProxy(proxy);
emit proxyUserChanged();
}
@ -1317,35 +1281,26 @@ void Account::setProxyPassword(const QString &password)
_proxyPassword = password;
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
auto proxy = _networkAccessManager->proxy();
proxy.setPassword(password);
_networkAccessManager->setProxy(proxy);
}
auto proxy = _networkAccessManager->proxy();
proxy.setPassword(password);
_networkAccessManager->setProxy(proxy);
emit proxyPasswordChanged();
}
void Account::setProxySettings(const AccountNetworkProxySetting networkProxySetting,
const QNetworkProxy::ProxyType proxyType,
void Account::setProxySettings(const QNetworkProxy::ProxyType proxyType,
const QString &hostName,
const int port,
const bool needsAuth,
const QString &user,
const QString &password)
{
if (networkProxySetting == AccountNetworkProxySetting::GlobalProxy) {
setNetworkProxySetting(networkProxySetting);
return;
}
setProxyType(proxyType);
setProxyHostName(hostName);
setProxyPort(port);
setProxyNeedsAuth(needsAuth);
setProxyUser(user);
setProxyPassword(password);
setNetworkProxySetting(networkProxySetting);
}
Account::AccountNetworkTransferLimitSetting Account::uploadLimitSetting() const

View File

@ -82,7 +82,6 @@ class OWNCLOUDSYNC_EXPORT Account : public QObject
Q_PROPERTY(QUrl url MEMBER _url)
Q_PROPERTY(bool e2eEncryptionKeysGenerationAllowed MEMBER _e2eEncryptionKeysGenerationAllowed)
Q_PROPERTY(bool askUserForMnemonic READ askUserForMnemonic WRITE setAskUserForMnemonic NOTIFY askUserForMnemonicChanged)
Q_PROPERTY(AccountNetworkProxySetting networkProxySetting READ networkProxySetting WRITE setNetworkProxySetting NOTIFY networkProxySettingChanged)
Q_PROPERTY(QNetworkProxy::ProxyType proxyType READ proxyType WRITE setProxyType NOTIFY proxyTypeChanged)
Q_PROPERTY(QString proxyHostName READ proxyHostName WRITE setProxyHostName NOTIFY proxyHostNameChanged)
Q_PROPERTY(int proxyPort READ proxyPort WRITE setProxyPort NOTIFY proxyPortChanged)
@ -98,17 +97,8 @@ class OWNCLOUDSYNC_EXPORT Account : public QObject
Q_PROPERTY(QByteArray encryptionCertificateFingerprint READ encryptionCertificateFingerprint WRITE setEncryptionCertificateFingerprint NOTIFY encryptionCertificateFingerprintChanged)
public:
// We need to decide whether to use the client's global proxy settings or whether to use
// a specific setting for each account. Hence this enum
enum class AccountNetworkProxySetting {
GlobalProxy = 0,
AccountSpecificProxy,
};
Q_ENUM(AccountNetworkProxySetting)
enum class AccountNetworkTransferLimitSetting {
GlobalLimit = -2,
AutoLimit, // Value under 0 is interpreted as auto in general
AutoLimit = -1, // Value under 0 is interpreted as auto in general
NoLimit,
ManualLimit,
};
@ -366,9 +356,6 @@ public:
void updateDesktopEnterpriseChannel();
// Network-related settings
[[nodiscard]] AccountNetworkProxySetting networkProxySetting() const;
void setNetworkProxySetting(AccountNetworkProxySetting networkProxySetting);
[[nodiscard]] QNetworkProxy::ProxyType proxyType() const;
void setProxyType(QNetworkProxy::ProxyType proxyType);
@ -387,8 +374,7 @@ public:
[[nodiscard]] QString proxyPassword() const;
void setProxyPassword(const QString &password);
void setProxySettings(const AccountNetworkProxySetting networkProxySetting,
const QNetworkProxy::ProxyType proxyType,
void setProxySettings(const QNetworkProxy::ProxyType proxyType,
const QString &proxyHostName,
const int proxyPort,
const bool proxyNeedsAuth,
@ -558,15 +544,14 @@ private:
QHash<QString, QVector<SyncFileItem::LockStatus>> _lockStatusChangeInprogress;
AccountNetworkProxySetting _networkProxySetting = AccountNetworkProxySetting::GlobalProxy;
QNetworkProxy::ProxyType _proxyType = QNetworkProxy::NoProxy;
QString _proxyHostName;
int _proxyPort = 0;
bool _proxyNeedsAuth = false;
QString _proxyUser;
QString _proxyPassword;
AccountNetworkTransferLimitSetting _uploadLimitSetting = AccountNetworkTransferLimitSetting::GlobalLimit;
AccountNetworkTransferLimitSetting _downloadLimitSetting = AccountNetworkTransferLimitSetting::GlobalLimit;
AccountNetworkTransferLimitSetting _uploadLimitSetting = AccountNetworkTransferLimitSetting::NoLimit;
AccountNetworkTransferLimitSetting _downloadLimitSetting = AccountNetworkTransferLimitSetting::NoLimit;
unsigned int _uploadLimit = 0;
unsigned int _downloadLimit = 0;
bool _serverHasValidSubscription = false;

View File

@ -5,8 +5,8 @@
*/
#include "clientproxy.h"
#include "configfile.h"
#include <QLoggingCategory>
#include <QUrl>
#include <QThreadPool>
@ -147,6 +147,19 @@ void ClientProxy::saveProxyConfigurationFromSettings(const QSettings &settings)
settings.value(QLatin1String(proxyPassC)).toString());
}
void ClientProxy::cleanupGlobalNetworkConfiguration()
{
OCC::ConfigFile configFile;
QSettings settings(configFile.configFile(), QSettings::IniFormat);
settings.remove(proxyTypeC);
settings.remove(proxyHostC);
settings.remove(proxyPortC);
settings.remove(proxyUserC);
settings.remove(proxyPassC);
settings.remove(proxyNeedsAuthC);
settings.sync();
}
void ClientProxy::lookupSystemProxyAsync(const QUrl &url, QObject *dst, const char *slot)
{
auto *runnable = new SystemProxyRunnable(url);

View File

@ -15,6 +15,7 @@
#include <csync.h>
#include "common/utility.h"
#include "owncloudlib.h"
#include "account.h"
namespace OCC {
@ -39,6 +40,7 @@ public:
public slots:
void setupQtProxyFromConfig();
void saveProxyConfigurationFromSettings(const QSettings &settings);
void cleanupGlobalNetworkConfiguration();
};
class OWNCLOUDSYNC_EXPORT SystemProxyRunnable : public QObject, public QRunnable

View File

@ -448,6 +448,16 @@ void OCC::ConfigFile::cleanUpdaterConfiguration()
settings.sync();
}
void OCC::ConfigFile::cleanupGlobalNetworkConfiguration()
{
QSettings settings(configFile(), QSettings::IniFormat);
settings.remove(useUploadLimitC);
settings.remove(useDownloadLimitC);
settings.remove(uploadLimitC);
settings.remove(downloadLimitC);
settings.sync();
}
QString ConfigFile::backup(const QString &fileName) const
{
const QString baseFilePath = configPath() + fileName;

View File

@ -41,6 +41,7 @@ public:
static QString excludeFileFromSystem(); // doesn't access config dir
void cleanUpdaterConfiguration();
void cleanupGlobalNetworkConfiguration();
/**
* Creates a backup of any given fileName in the config folder