mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-28 11:48:56 +03:00
Merge pull request #7436 from nextcloud/bugfix/accounts2
Fix adding account and skipping folder configuration crash.
This commit is contained in:
commit
408955e5b3
12 changed files with 142 additions and 143 deletions
|
@ -123,7 +123,7 @@ AccountManager::AccountsRestoreResult AccountManager::restore(const bool alsoRes
|
|||
if (const auto acc = loadAccountHelper(*settings)) {
|
||||
acc->_id = accountId;
|
||||
const auto accState = new AccountState(acc);
|
||||
const auto jar = qobject_cast<CookieJar*>(acc->_am->cookieJar());
|
||||
const auto jar = qobject_cast<CookieJar*>(acc->_networkAccessManager->cookieJar());
|
||||
Q_ASSERT(jar);
|
||||
if (jar) {
|
||||
jar->restore(acc->cookieJarPath());
|
||||
|
@ -305,12 +305,12 @@ void AccountManager::save(bool saveCredentials)
|
|||
qCInfo(lcAccountManager) << "Saved all account settings, status:" << settings->status();
|
||||
}
|
||||
|
||||
void AccountManager::saveAccount(Account *a)
|
||||
void AccountManager::saveAccount(Account *newAccountData)
|
||||
{
|
||||
qCDebug(lcAccountManager) << "Saving account" << a->url().toString();
|
||||
qCDebug(lcAccountManager) << "Saving account" << newAccountData->url().toString();
|
||||
const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC));
|
||||
settings->beginGroup(a->id());
|
||||
saveAccountHelper(a, *settings, false); // don't save credentials they might not have been loaded yet
|
||||
settings->beginGroup(newAccountData->id());
|
||||
saveAccountHelper(newAccountData, *settings, false); // don't save credentials they might not have been loaded yet
|
||||
settings->endGroup();
|
||||
|
||||
settings->sync();
|
||||
|
@ -328,36 +328,36 @@ void AccountManager::saveAccountState(AccountState *a)
|
|||
qCDebug(lcAccountManager) << "Saved account state settings, status:" << settings->status();
|
||||
}
|
||||
|
||||
void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool saveCredentials)
|
||||
void AccountManager::saveAccountHelper(Account *account, QSettings &settings, bool saveCredentials)
|
||||
{
|
||||
qCDebug(lcAccountManager) << "Saving settings to" << settings.fileName();
|
||||
settings.setValue(QLatin1String(versionC), maxAccountVersion);
|
||||
settings.setValue(QLatin1String(urlC), acc->_url.toString());
|
||||
settings.setValue(QLatin1String(davUserC), acc->_davUser);
|
||||
settings.setValue(QLatin1String(displayNameC), acc->_displayName);
|
||||
settings.setValue(QLatin1String(serverVersionC), acc->_serverVersion);
|
||||
settings.setValue(QLatin1String(serverColorC), acc->_serverColor);
|
||||
settings.setValue(QLatin1String(serverTextColorC), acc->_serverTextColor);
|
||||
settings.setValue(QLatin1String(serverHasValidSubscriptionC), acc->serverHasValidSubscription());
|
||||
settings.setValue(QLatin1String(urlC), account->_url.toString());
|
||||
settings.setValue(QLatin1String(davUserC), account->_davUser);
|
||||
settings.setValue(QLatin1String(displayNameC), account->davDisplayName());
|
||||
settings.setValue(QLatin1String(serverVersionC), account->_serverVersion);
|
||||
settings.setValue(QLatin1String(serverColorC), account->_serverColor);
|
||||
settings.setValue(QLatin1String(serverTextColorC), account->_serverTextColor);
|
||||
settings.setValue(QLatin1String(serverHasValidSubscriptionC), account->serverHasValidSubscription());
|
||||
|
||||
if (!acc->_skipE2eeMetadataChecksumValidation) {
|
||||
if (!account->_skipE2eeMetadataChecksumValidation) {
|
||||
settings.remove(QLatin1String(skipE2eeMetadataChecksumValidationC));
|
||||
} else {
|
||||
settings.setValue(QLatin1String(skipE2eeMetadataChecksumValidationC), acc->_skipE2eeMetadataChecksumValidation);
|
||||
settings.setValue(QLatin1String(skipE2eeMetadataChecksumValidationC), account->_skipE2eeMetadataChecksumValidation);
|
||||
}
|
||||
settings.setValue(networkProxySettingC, static_cast<std::underlying_type_t<Account::AccountNetworkProxySetting>>(acc->networkProxySetting()));
|
||||
settings.setValue(networkProxyTypeC, acc->proxyType());
|
||||
settings.setValue(networkProxyHostNameC, acc->proxyHostName());
|
||||
settings.setValue(networkProxyPortC, acc->proxyPort());
|
||||
settings.setValue(networkProxyNeedsAuthC, acc->proxyNeedsAuth());
|
||||
settings.setValue(networkProxyUserC, acc->proxyUser());
|
||||
settings.setValue(networkUploadLimitSettingC, static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(acc->uploadLimitSetting()));
|
||||
settings.setValue(networkDownloadLimitSettingC, static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(acc->downloadLimitSetting()));
|
||||
settings.setValue(networkUploadLimitC, acc->uploadLimit());
|
||||
settings.setValue(networkDownloadLimitC, acc->downloadLimit());
|
||||
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());
|
||||
settings.setValue(networkProxyNeedsAuthC, account->proxyNeedsAuth());
|
||||
settings.setValue(networkProxyUserC, account->proxyUser());
|
||||
settings.setValue(networkUploadLimitSettingC, static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(account->uploadLimitSetting()));
|
||||
settings.setValue(networkDownloadLimitSettingC, static_cast<std::underlying_type_t<Account::AccountNetworkTransferLimitSetting>>(account->downloadLimitSetting()));
|
||||
settings.setValue(networkUploadLimitC, account->uploadLimit());
|
||||
settings.setValue(networkDownloadLimitC, account->downloadLimit());
|
||||
|
||||
const auto proxyPasswordKey = QString(acc->userIdAtHostWithPort() + networkProxyPasswordKeychainKeySuffixC);
|
||||
if (const auto proxyPassword = acc->proxyPassword(); proxyPassword.isEmpty()) {
|
||||
const auto proxyPasswordKey = QString(account->userIdAtHostWithPort() + networkProxyPasswordKeychainKeySuffixC);
|
||||
if (const auto proxyPassword = account->proxyPassword(); proxyPassword.isEmpty()) {
|
||||
const auto job = new QKeychain::DeletePasswordJob(Theme::instance()->appName(), this);
|
||||
job->setKey(proxyPasswordKey);
|
||||
connect(job, &QKeychain::Job::finished, this, [](const QKeychain::Job *const incomingJob) {
|
||||
|
@ -384,27 +384,27 @@ void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool s
|
|||
job->start();
|
||||
}
|
||||
|
||||
if (acc->_credentials) {
|
||||
if (account->_credentials) {
|
||||
if (saveCredentials) {
|
||||
// Only persist the credentials if the parameter is set, on migration from 1.8.x
|
||||
// we want to save the accounts but not overwrite the credentials
|
||||
// (This is easier than asynchronously fetching the credentials from keychain and then
|
||||
// re-persisting them)
|
||||
acc->_credentials->persist();
|
||||
account->_credentials->persist();
|
||||
}
|
||||
|
||||
const auto settingsMapKeys = acc->_settingsMap.keys();
|
||||
const auto settingsMapKeys = account->_settingsMap.keys();
|
||||
for (const auto &key : settingsMapKeys) {
|
||||
if (!acc->_settingsMap.value(key).isValid()) {
|
||||
if (!account->_settingsMap.value(key).isValid()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
settings.setValue(key, acc->_settingsMap.value(key));
|
||||
settings.setValue(key, account->_settingsMap.value(key));
|
||||
}
|
||||
settings.setValue(QLatin1String(authTypeC), acc->_credentials->authType());
|
||||
settings.setValue(QLatin1String(authTypeC), account->_credentials->authType());
|
||||
|
||||
// HACK: Save http_user also as user
|
||||
const auto settingsMap = acc->_settingsMap;
|
||||
const auto settingsMap = account->_settingsMap;
|
||||
if (settingsMap.contains(httpUserC) && settingsMap.value(httpUserC).isValid()) {
|
||||
settings.setValue(userC, settingsMap.value(httpUserC));
|
||||
}
|
||||
|
@ -412,9 +412,9 @@ void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool s
|
|||
|
||||
// Save accepted certificates.
|
||||
settings.beginGroup(QLatin1String(generalC));
|
||||
qCInfo(lcAccountManager) << "Saving " << acc->approvedCerts().count() << " unknown certs.";
|
||||
qCInfo(lcAccountManager) << "Saving " << account->approvedCerts().count() << " unknown certs.";
|
||||
QByteArray certs;
|
||||
const auto approvedCerts = acc->approvedCerts();
|
||||
const auto approvedCerts = account->approvedCerts();
|
||||
for (const auto &cert : approvedCerts) {
|
||||
certs += cert.toPem() + '\n';
|
||||
}
|
||||
|
@ -424,13 +424,13 @@ void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool s
|
|||
settings.endGroup();
|
||||
|
||||
// Save cookies.
|
||||
if (acc->_am) {
|
||||
auto *jar = qobject_cast<CookieJar *>(acc->_am->cookieJar());
|
||||
if (account->_networkAccessManager) {
|
||||
const auto jar = qobject_cast<CookieJar *>(account->_networkAccessManager->cookieJar());
|
||||
if (jar) {
|
||||
qCInfo(lcAccountManager) << "Saving cookies." << acc->cookieJarPath();
|
||||
if (!jar->save(acc->cookieJarPath()))
|
||||
qCInfo(lcAccountManager) << "Saving cookies." << account->cookieJarPath();
|
||||
if (!jar->save(account->cookieJarPath()))
|
||||
{
|
||||
qCWarning(lcAccountManager) << "Failed to save cookies to" << acc->cookieJarPath();
|
||||
qCWarning(lcAccountManager) << "Failed to save cookies to" << account->cookieJarPath();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -498,7 +498,7 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings)
|
|||
acc->_davUser = settings.value(QLatin1String(davUserC)).toString();
|
||||
|
||||
acc->_settingsMap.insert(QLatin1String(userC), settings.value(userC));
|
||||
acc->_displayName = settings.value(QLatin1String(displayNameC), "").toString();
|
||||
acc->setDavDisplayName(settings.value(QLatin1String(displayNameC), "").toString());
|
||||
const QString authTypePrefix = authType + "_";
|
||||
const auto settingsChildKeys = settings.childKeys();
|
||||
for (const auto &key : settingsChildKeys) {
|
||||
|
|
|
@ -91,8 +91,8 @@ public:
|
|||
static void backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys);
|
||||
|
||||
public slots:
|
||||
/// Saves account data, not including the credentials
|
||||
void saveAccount(OCC::Account *a);
|
||||
/// Saves account data when adding user, when updating e.g. dav user, not including the credentials
|
||||
void saveAccount(OCC::Account *newAccountData);
|
||||
|
||||
/// Saves account state data, not including the account
|
||||
void saveAccountState(OCC::AccountState *a);
|
||||
|
|
|
@ -202,8 +202,10 @@ void AccountState::signOutByUi()
|
|||
|
||||
void AccountState::freshConnectionAttempt()
|
||||
{
|
||||
if (isConnected())
|
||||
if (isConnected()) {
|
||||
setState(Disconnected);
|
||||
}
|
||||
|
||||
checkConnectivity();
|
||||
}
|
||||
|
||||
|
|
|
@ -365,7 +365,7 @@ Application::Application(int &argc, char **argv)
|
|||
}
|
||||
|
||||
_theme->setSystrayUseMonoIcons(ConfigFile().monoIcons());
|
||||
connect(_theme, &Theme::systrayUseMonoIconsChanged, this, &Application::slotUseMonoIconsChanged);
|
||||
connect(_theme, &Theme::systrayUseMonoIconsChanged, _gui, &ownCloudGui::slotComputeOverallSyncStatus);
|
||||
connect(this, &Application::systemPaletteChanged,
|
||||
_theme, &Theme::systemPaletteHasChanged);
|
||||
|
||||
|
@ -589,7 +589,7 @@ void Application::slotAccountStateRemoved(AccountState *accountState)
|
|||
{
|
||||
if (_gui) {
|
||||
disconnect(accountState, &AccountState::stateChanged,
|
||||
_gui.data(), &ownCloudGui::slotAccountStateChanged);
|
||||
_gui.data(), &ownCloudGui::slotComputeOverallSyncStatus);
|
||||
disconnect(accountState->account().data(), &Account::serverVersionChanged,
|
||||
_gui.data(), &ownCloudGui::slotTrayMessageIfServerUnsupported);
|
||||
}
|
||||
|
@ -611,7 +611,7 @@ void Application::slotAccountStateRemoved(AccountState *accountState)
|
|||
void Application::slotAccountStateAdded(AccountState *accountState)
|
||||
{
|
||||
connect(accountState, &AccountState::stateChanged,
|
||||
_gui.data(), &ownCloudGui::slotAccountStateChanged);
|
||||
_gui.data(), &ownCloudGui::slotComputeOverallSyncStatus);
|
||||
connect(accountState->account().data(), &Account::serverVersionChanged,
|
||||
_gui.data(), &ownCloudGui::slotTrayMessageIfServerUnsupported);
|
||||
connect(accountState, &AccountState::termsOfServiceChanged,
|
||||
|
@ -716,11 +716,6 @@ void Application::setupLogging()
|
|||
qCInfo(lcApplication) << "Arguments:" << qApp->arguments();
|
||||
}
|
||||
|
||||
void Application::slotUseMonoIconsChanged(bool)
|
||||
{
|
||||
_gui->slotComputeOverallSyncStatus();
|
||||
}
|
||||
|
||||
void Application::slotParseMessage(const QString &msg, QObject *)
|
||||
{
|
||||
if (msg.startsWith(QLatin1String("MSG_PARSEOPTIONS:"))) {
|
||||
|
|
|
@ -101,7 +101,6 @@ signals:
|
|||
protected slots:
|
||||
void slotParseMessage(const QString &, QObject *);
|
||||
void slotCheckConnection();
|
||||
void slotUseMonoIconsChanged(bool);
|
||||
void slotCleanup();
|
||||
void slotAccountStateAdded(OCC::AccountState *accountState);
|
||||
void slotAccountStateRemoved(OCC::AccountState *accountState);
|
||||
|
|
|
@ -118,6 +118,8 @@ ownCloudGui::ownCloudGui(Application *parent)
|
|||
|
||||
FolderMan *folderMan = FolderMan::instance();
|
||||
connect(folderMan, &FolderMan::folderSyncStateChange, this, &ownCloudGui::slotSyncStateChange);
|
||||
connect(folderMan, &FolderMan::folderSyncStateChange, this, &ownCloudGui::slotComputeOverallSyncStatus);
|
||||
|
||||
|
||||
#ifdef BUILD_FILE_PROVIDER_MODULE
|
||||
connect(Mac::FileProvider::instance()->socketServer(), &Mac::FileProviderSocketServer::syncStateChanged, this, &ownCloudGui::slotComputeOverallSyncStatus);
|
||||
|
@ -240,8 +242,6 @@ void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
|
|||
|
||||
void ownCloudGui::slotSyncStateChange(Folder *folder)
|
||||
{
|
||||
slotComputeOverallSyncStatus();
|
||||
|
||||
if (!folder) {
|
||||
return; // Valid, just a general GUI redraw was needed.
|
||||
}
|
||||
|
@ -258,21 +258,11 @@ void ownCloudGui::slotSyncStateChange(Folder *folder)
|
|||
}
|
||||
}
|
||||
|
||||
void ownCloudGui::slotFoldersChanged()
|
||||
{
|
||||
slotComputeOverallSyncStatus();
|
||||
}
|
||||
|
||||
void ownCloudGui::slotOpenPath(const QString &path)
|
||||
{
|
||||
showInFileManager(path);
|
||||
}
|
||||
|
||||
void ownCloudGui::slotAccountStateChanged()
|
||||
{
|
||||
slotComputeOverallSyncStatus();
|
||||
}
|
||||
|
||||
void ownCloudGui::slotTrayMessageIfServerUnsupported(Account *account)
|
||||
{
|
||||
if (account->serverVersionUnsupported()) {
|
||||
|
@ -371,7 +361,7 @@ void ownCloudGui::slotComputeOverallSyncStatus()
|
|||
#else
|
||||
QStringList messages;
|
||||
messages.append(tr("Disconnected from accounts:"));
|
||||
for (const auto &accountState : problemAccounts) {
|
||||
for (const auto &accountState : qAsConst(problemAccounts)) {
|
||||
QString message = tr("Account %1: %2").arg(accountState->account()->displayName(), accountState->stateString(accountState->state()));
|
||||
if (!accountState->connectionErrors().empty()) {
|
||||
message += QLatin1String("\n");
|
||||
|
|
|
@ -79,7 +79,6 @@ public slots:
|
|||
void slotFolderOpenAction(const QString &alias);
|
||||
void slotUpdateProgress(const QString &folder, const OCC::ProgressInfo &progress);
|
||||
void slotShowGuiMessage(const QString &title, const QString &message);
|
||||
void slotFoldersChanged();
|
||||
void slotShowSettings();
|
||||
void slotShowSyncProtocol();
|
||||
void slotShutdown();
|
||||
|
@ -92,7 +91,6 @@ public slots:
|
|||
void slotSettingsDialogActivated();
|
||||
void slotHelp();
|
||||
void slotOpenPath(const QString &path);
|
||||
void slotAccountStateChanged();
|
||||
void slotTrayMessageIfServerUnsupported(OCC::Account *account);
|
||||
void slotNeedToAcceptTermsOfService(OCC::AccountPtr account,
|
||||
OCC::AccountState::State state);
|
||||
|
|
|
@ -66,7 +66,7 @@ OwncloudSetupWizard::~OwncloudSetupWizard()
|
|||
_ocWizard->deleteLater();
|
||||
}
|
||||
|
||||
static QPointer<OwncloudSetupWizard> wiz = nullptr;
|
||||
static QPointer<OwncloudSetupWizard> owncloudSetupWizard = nullptr;
|
||||
|
||||
void OwncloudSetupWizard::runWizard(QObject *obj, const char *amember, QWidget *parent)
|
||||
{
|
||||
|
@ -78,25 +78,26 @@ void OwncloudSetupWizard::runWizard(QObject *obj, const char *amember, QWidget *
|
|||
|
||||
Theme::instance()->setStartLoginFlowAutomatically(true);
|
||||
}
|
||||
if (!wiz.isNull()) {
|
||||
if (!owncloudSetupWizard.isNull()) {
|
||||
bringWizardToFrontIfVisible();
|
||||
return;
|
||||
}
|
||||
|
||||
wiz = new OwncloudSetupWizard(parent);
|
||||
connect(wiz, SIGNAL(ownCloudWizardDone(int)), obj, amember);
|
||||
connect(wiz->_ocWizard, &OwncloudWizard::wizardClosed, obj, [] { wiz.clear(); });
|
||||
owncloudSetupWizard = new OwncloudSetupWizard(parent);
|
||||
connect(owncloudSetupWizard, SIGNAL(ownCloudWizardDone(int)), obj, amember);
|
||||
connect(owncloudSetupWizard->_ocWizard, &OwncloudWizard::wizardClosed, obj, [] { owncloudSetupWizard.clear(); });
|
||||
|
||||
FolderMan::instance()->setSyncEnabled(false);
|
||||
wiz->startWizard();
|
||||
owncloudSetupWizard->startWizard();
|
||||
}
|
||||
|
||||
bool OwncloudSetupWizard::bringWizardToFrontIfVisible()
|
||||
{
|
||||
if (wiz.isNull()) {
|
||||
if (owncloudSetupWizard.isNull()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ownCloudGui::raiseDialog(wiz->_ocWizard);
|
||||
ownCloudGui::raiseDialog(owncloudSetupWizard->_ocWizard);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -700,7 +701,7 @@ void OwncloudSetupWizard::slotAssistantFinished(int result)
|
|||
}
|
||||
|
||||
// notify others.
|
||||
_ocWizard->done(QWizard::Accepted);
|
||||
_ocWizard->done(result);
|
||||
emit ownCloudWizardDone(result);
|
||||
}
|
||||
|
||||
|
@ -710,7 +711,10 @@ void OwncloudSetupWizard::slotSkipFolderConfiguration()
|
|||
|
||||
disconnect(_ocWizard, &OwncloudWizard::basicSetupFinished,
|
||||
this, &OwncloudSetupWizard::slotAssistantFinished);
|
||||
_ocWizard->close();
|
||||
|
||||
_ocWizard->done(QDialog::Rejected);
|
||||
|
||||
// Accept to check connectivity, only skip folder setup
|
||||
emit ownCloudWizardDone(QDialog::Accepted);
|
||||
}
|
||||
|
||||
|
@ -727,7 +731,7 @@ AccountState *OwncloudSetupWizard::applyAccountChanges()
|
|||
auto manager = AccountManager::instance();
|
||||
|
||||
auto newState = manager->addAccount(newAccount);
|
||||
manager->save();
|
||||
manager->saveAccount(newAccount.data());
|
||||
return newState;
|
||||
}
|
||||
|
||||
|
|
|
@ -261,7 +261,7 @@ void SettingsDialog::accountAdded(AccountState *s)
|
|||
_actionForAccount.insert(s->account().data(), accountAction);
|
||||
accountAction->trigger();
|
||||
|
||||
connect(accountSettings, &AccountSettings::folderChanged, _gui, &ownCloudGui::slotFoldersChanged);
|
||||
connect(accountSettings, &AccountSettings::folderChanged, _gui, &ownCloudGui::slotComputeOverallSyncStatus);
|
||||
connect(accountSettings, &AccountSettings::openFolderAlias,
|
||||
_gui, &ownCloudGui::slotFolderOpenAction);
|
||||
connect(accountSettings, &AccountSettings::showIssuesList, this, &SettingsDialog::showIssuesList);
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
pragma NativeMethodBehavior: AcceptThisObject
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
|
|
@ -135,9 +135,12 @@ QString Account::davUser() const
|
|||
|
||||
void Account::setDavUser(const QString &newDavUser)
|
||||
{
|
||||
if (_davUser == newDavUser)
|
||||
if (_davUser == newDavUser) {
|
||||
return;
|
||||
}
|
||||
|
||||
_davUser = newDavUser;
|
||||
|
||||
emit wantsAccountSaved(this);
|
||||
emit prettyNameChanged();
|
||||
}
|
||||
|
@ -156,13 +159,19 @@ void Account::setAvatar(const QImage &img)
|
|||
|
||||
QString Account::displayName() const
|
||||
{
|
||||
QString dn = QString("%1@%2").arg(credentials()->user(), _url.host());
|
||||
int port = url().port();
|
||||
if (port > 0 && port != 80 && port != 443) {
|
||||
dn.append(QLatin1Char(':'));
|
||||
dn.append(QString::number(port));
|
||||
auto credentialsUser = _davUser;
|
||||
if (_credentials && !_credentials->user().isEmpty()) {
|
||||
credentialsUser = _credentials->user();
|
||||
}
|
||||
return dn;
|
||||
|
||||
auto displayName = QString("%1@%2").arg(credentialsUser, _url.host());
|
||||
const auto port = url().port();
|
||||
if (port > 0 && port != 80 && port != 443) {
|
||||
displayName.append(QLatin1Char(':'));
|
||||
displayName.append(QString::number(port));
|
||||
}
|
||||
|
||||
return displayName;
|
||||
}
|
||||
|
||||
QString Account::userIdAtHostWithPort() const
|
||||
|
@ -178,12 +187,12 @@ QString Account::userIdAtHostWithPort() const
|
|||
|
||||
QString Account::davDisplayName() const
|
||||
{
|
||||
return _displayName;
|
||||
return _davDisplayName;
|
||||
}
|
||||
|
||||
void Account::setDavDisplayName(const QString &newDisplayName)
|
||||
{
|
||||
_displayName = newDisplayName;
|
||||
_davDisplayName = newDisplayName;
|
||||
emit accountChangedDisplayName();
|
||||
emit prettyNameChanged();
|
||||
}
|
||||
|
@ -243,14 +252,14 @@ void Account::setCredentials(AbstractCredentials *cred)
|
|||
QNetworkCookieJar *jar = nullptr;
|
||||
QNetworkProxy proxy;
|
||||
|
||||
if (_am) {
|
||||
jar = _am->cookieJar();
|
||||
if (_networkAccessManager) {
|
||||
jar = _networkAccessManager->cookieJar();
|
||||
jar->setParent(nullptr);
|
||||
|
||||
// Remember proxy (issue #2108)
|
||||
proxy = _am->proxy();
|
||||
proxy = _networkAccessManager->proxy();
|
||||
|
||||
_am = QSharedPointer<QNetworkAccessManager>();
|
||||
_networkAccessManager = QSharedPointer<QNetworkAccessManager>();
|
||||
}
|
||||
|
||||
// The order for these two is important! Reading the credential's
|
||||
|
@ -261,17 +270,17 @@ void Account::setCredentials(AbstractCredentials *cred)
|
|||
// Note: This way the QNAM can outlive the Account and Credentials.
|
||||
// This is necessary to avoid issues with the QNAM being deleted while
|
||||
// processing slotHandleSslErrors().
|
||||
_am = QSharedPointer<QNetworkAccessManager>(_credentials->createQNAM(), &QObject::deleteLater);
|
||||
_networkAccessManager = QSharedPointer<QNetworkAccessManager>(_credentials->createQNAM(), &QObject::deleteLater);
|
||||
|
||||
if (jar) {
|
||||
_am->setCookieJar(jar);
|
||||
_networkAccessManager->setCookieJar(jar);
|
||||
}
|
||||
if (proxy.type() != QNetworkProxy::DefaultProxy) {
|
||||
_am->setProxy(proxy);
|
||||
_networkAccessManager->setProxy(proxy);
|
||||
}
|
||||
connect(_am.data(), &QNetworkAccessManager::sslErrors,
|
||||
connect(_networkAccessManager.data(), &QNetworkAccessManager::sslErrors,
|
||||
this, &Account::slotHandleSslErrors);
|
||||
connect(_am.data(), &QNetworkAccessManager::proxyAuthenticationRequired,
|
||||
connect(_networkAccessManager.data(), &QNetworkAccessManager::proxyAuthenticationRequired,
|
||||
this, &Account::proxyAuthenticationRequired);
|
||||
connect(_credentials.data(), &AbstractCredentials::fetched,
|
||||
this, &Account::slotCredentialsFetched);
|
||||
|
@ -358,7 +367,7 @@ QUrl Account::deprecatedPrivateLinkUrl(const QByteArray &numericFileId) const
|
|||
*/
|
||||
void Account::clearCookieJar()
|
||||
{
|
||||
const auto jar = qobject_cast<CookieJar *>(_am->cookieJar());
|
||||
const auto jar = qobject_cast<CookieJar *>(_networkAccessManager->cookieJar());
|
||||
ASSERT(jar);
|
||||
jar->setAllCookies(QList<QNetworkCookie>());
|
||||
}
|
||||
|
@ -368,7 +377,7 @@ void Account::clearCookieJar()
|
|||
of not losing its ownership. */
|
||||
void Account::lendCookieJarTo(QNetworkAccessManager *guest)
|
||||
{
|
||||
auto jar = _am->cookieJar();
|
||||
auto jar = _networkAccessManager->cookieJar();
|
||||
auto oldParent = jar->parent();
|
||||
guest->setCookieJar(jar); // takes ownership of our precious cookie jar
|
||||
jar->setParent(oldParent); // takes it back
|
||||
|
@ -381,35 +390,35 @@ QString Account::cookieJarPath()
|
|||
|
||||
void Account::resetNetworkAccessManager()
|
||||
{
|
||||
if (!_credentials || !_am) {
|
||||
if (!_credentials || !_networkAccessManager) {
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(lcAccount) << "Resetting QNAM";
|
||||
QNetworkCookieJar *jar = _am->cookieJar();
|
||||
QNetworkProxy proxy = _am->proxy();
|
||||
QNetworkCookieJar *jar = _networkAccessManager->cookieJar();
|
||||
QNetworkProxy proxy = _networkAccessManager->proxy();
|
||||
|
||||
// Use a QSharedPointer to allow locking the life of the QNAM on the stack.
|
||||
// Make it call deleteLater to make sure that we can return to any QNAM stack frames safely.
|
||||
_am = QSharedPointer<QNetworkAccessManager>(_credentials->createQNAM(), &QObject::deleteLater);
|
||||
_networkAccessManager = QSharedPointer<QNetworkAccessManager>(_credentials->createQNAM(), &QObject::deleteLater);
|
||||
|
||||
_am->setCookieJar(jar); // takes ownership of the old cookie jar
|
||||
_am->setProxy(proxy); // Remember proxy (issue #2108)
|
||||
_networkAccessManager->setCookieJar(jar); // takes ownership of the old cookie jar
|
||||
_networkAccessManager->setProxy(proxy); // Remember proxy (issue #2108)
|
||||
|
||||
connect(_am.data(), &QNetworkAccessManager::sslErrors,
|
||||
connect(_networkAccessManager.data(), &QNetworkAccessManager::sslErrors,
|
||||
this, &Account::slotHandleSslErrors);
|
||||
connect(_am.data(), &QNetworkAccessManager::proxyAuthenticationRequired,
|
||||
connect(_networkAccessManager.data(), &QNetworkAccessManager::proxyAuthenticationRequired,
|
||||
this, &Account::proxyAuthenticationRequired);
|
||||
}
|
||||
|
||||
QNetworkAccessManager *Account::networkAccessManager()
|
||||
{
|
||||
return _am.data();
|
||||
return _networkAccessManager.data();
|
||||
}
|
||||
|
||||
QSharedPointer<QNetworkAccessManager> Account::sharedNetworkAccessManager()
|
||||
{
|
||||
return _am;
|
||||
return _networkAccessManager;
|
||||
}
|
||||
|
||||
QNetworkReply *Account::sendRawRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data)
|
||||
|
@ -417,17 +426,17 @@ QNetworkReply *Account::sendRawRequest(const QByteArray &verb, const QUrl &url,
|
|||
req.setUrl(url);
|
||||
req.setSslConfiguration(this->getOrCreateSslConfig());
|
||||
if (verb == "HEAD" && !data) {
|
||||
return _am->head(req);
|
||||
return _networkAccessManager->head(req);
|
||||
} else if (verb == "GET" && !data) {
|
||||
return _am->get(req);
|
||||
return _networkAccessManager->get(req);
|
||||
} else if (verb == "POST") {
|
||||
return _am->post(req, data);
|
||||
return _networkAccessManager->post(req, data);
|
||||
} else if (verb == "PUT") {
|
||||
return _am->put(req, data);
|
||||
return _networkAccessManager->put(req, data);
|
||||
} else if (verb == "DELETE" && !data) {
|
||||
return _am->deleteResource(req);
|
||||
return _networkAccessManager->deleteResource(req);
|
||||
}
|
||||
return _am->sendCustomRequest(req, verb, data);
|
||||
return _networkAccessManager->sendCustomRequest(req, verb, data);
|
||||
}
|
||||
|
||||
QNetworkReply *Account::sendRawRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, const QByteArray &data)
|
||||
|
@ -435,17 +444,17 @@ QNetworkReply *Account::sendRawRequest(const QByteArray &verb, const QUrl &url,
|
|||
req.setUrl(url);
|
||||
req.setSslConfiguration(this->getOrCreateSslConfig());
|
||||
if (verb == "HEAD" && data.isEmpty()) {
|
||||
return _am->head(req);
|
||||
return _networkAccessManager->head(req);
|
||||
} else if (verb == "GET" && data.isEmpty()) {
|
||||
return _am->get(req);
|
||||
return _networkAccessManager->get(req);
|
||||
} else if (verb == "POST") {
|
||||
return _am->post(req, data);
|
||||
return _networkAccessManager->post(req, data);
|
||||
} else if (verb == "PUT") {
|
||||
return _am->put(req, data);
|
||||
return _networkAccessManager->put(req, data);
|
||||
} else if (verb == "DELETE" && data.isEmpty()) {
|
||||
return _am->deleteResource(req);
|
||||
return _networkAccessManager->deleteResource(req);
|
||||
}
|
||||
return _am->sendCustomRequest(req, verb, data);
|
||||
return _networkAccessManager->sendCustomRequest(req, verb, data);
|
||||
}
|
||||
|
||||
QNetworkReply *Account::sendRawRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QHttpMultiPart *data)
|
||||
|
@ -453,11 +462,11 @@ QNetworkReply *Account::sendRawRequest(const QByteArray &verb, const QUrl &url,
|
|||
req.setUrl(url);
|
||||
req.setSslConfiguration(this->getOrCreateSslConfig());
|
||||
if (verb == "PUT") {
|
||||
return _am->put(req, data);
|
||||
return _networkAccessManager->put(req, data);
|
||||
} else if (verb == "POST") {
|
||||
return _am->post(req, data);
|
||||
return _networkAccessManager->post(req, data);
|
||||
}
|
||||
return _am->sendCustomRequest(req, verb, data);
|
||||
return _networkAccessManager->sendCustomRequest(req, verb, data);
|
||||
}
|
||||
|
||||
SimpleNetworkJob *Account::sendRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data)
|
||||
|
@ -585,7 +594,7 @@ void Account::slotHandleSslErrors(QNetworkReply *reply, QList<QSslError> errors)
|
|||
// the deleteLater() of the QNAM before we have the chance of unwinding our stack.
|
||||
// Keep a ref here on our stackframe to make sure that it doesn't get deleted before
|
||||
// handleErrors returns.
|
||||
QSharedPointer<QNetworkAccessManager> qnamLock = _am;
|
||||
QSharedPointer<QNetworkAccessManager> qnamLock = _networkAccessManager;
|
||||
QPointer<QObject> guard = reply;
|
||||
|
||||
if (_sslErrorHandler->handleErrors(errors, reply->sslConfiguration(), &approvedCerts, sharedFromThis())) {
|
||||
|
@ -661,7 +670,7 @@ void Account::handleInvalidCredentials()
|
|||
|
||||
void Account::clearQNAMCache()
|
||||
{
|
||||
_am->clearAccessCache();
|
||||
_networkAccessManager->clearAccessCache();
|
||||
}
|
||||
|
||||
const Capabilities &Account::capabilities() const
|
||||
|
@ -1120,16 +1129,16 @@ void Account::setNetworkProxySetting(const AccountNetworkProxySetting setting)
|
|||
|
||||
_networkProxySetting = setting;
|
||||
if (setting == AccountNetworkProxySetting::AccountSpecificProxy) {
|
||||
auto proxy = _am->proxy();
|
||||
auto proxy = _networkAccessManager->proxy();
|
||||
proxy.setType(proxyType());
|
||||
proxy.setHostName(proxyHostName());
|
||||
proxy.setPort(proxyPort());
|
||||
proxy.setUser(proxyUser());
|
||||
proxy.setPassword(proxyPassword());
|
||||
_am->setProxy(proxy);
|
||||
_networkAccessManager->setProxy(proxy);
|
||||
} else {
|
||||
const auto proxy = QNetworkProxy::applicationProxy();
|
||||
_am->setProxy(proxy);
|
||||
_networkAccessManager->setProxy(proxy);
|
||||
setProxyType(proxy.type());
|
||||
setProxyHostName(proxy.hostName());
|
||||
setProxyPort(proxy.port());
|
||||
|
@ -1153,9 +1162,9 @@ void Account::setProxyType(QNetworkProxy::ProxyType proxyType)
|
|||
_proxyType = proxyType;
|
||||
|
||||
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
|
||||
auto proxy = _am->proxy();
|
||||
auto proxy = _networkAccessManager->proxy();
|
||||
proxy.setType(proxyType);
|
||||
_am->setProxy(proxy);
|
||||
_networkAccessManager->setProxy(proxy);
|
||||
}
|
||||
|
||||
emit proxyTypeChanged();
|
||||
|
@ -1175,9 +1184,9 @@ void Account::setProxyHostName(const QString &hostName)
|
|||
_proxyHostName = hostName;
|
||||
|
||||
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
|
||||
auto proxy = _am->proxy();
|
||||
auto proxy = _networkAccessManager->proxy();
|
||||
proxy.setHostName(hostName);
|
||||
_am->setProxy(proxy);
|
||||
_networkAccessManager->setProxy(proxy);
|
||||
}
|
||||
|
||||
emit proxyHostNameChanged();
|
||||
|
@ -1197,9 +1206,9 @@ void Account::setProxyPort(const int port)
|
|||
_proxyPort = port;
|
||||
|
||||
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
|
||||
auto proxy = _am->proxy();
|
||||
auto proxy = _networkAccessManager->proxy();
|
||||
proxy.setPort(port);
|
||||
_am->setProxy(proxy);
|
||||
_networkAccessManager->setProxy(proxy);
|
||||
}
|
||||
|
||||
emit proxyPortChanged();
|
||||
|
@ -1234,9 +1243,9 @@ void Account::setProxyUser(const QString &user)
|
|||
_proxyUser = user;
|
||||
|
||||
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
|
||||
auto proxy = _am->proxy();
|
||||
auto proxy = _networkAccessManager->proxy();
|
||||
proxy.setUser(user);
|
||||
_am->setProxy(proxy);
|
||||
_networkAccessManager->setProxy(proxy);
|
||||
}
|
||||
|
||||
emit proxyUserChanged();
|
||||
|
@ -1256,9 +1265,9 @@ void Account::setProxyPassword(const QString &password)
|
|||
_proxyPassword = password;
|
||||
|
||||
if (networkProxySetting() == AccountNetworkProxySetting::AccountSpecificProxy) {
|
||||
auto proxy = _am->proxy();
|
||||
auto proxy = _networkAccessManager->proxy();
|
||||
proxy.setPassword(password);
|
||||
_am->setProxy(proxy);
|
||||
_networkAccessManager->setProxy(proxy);
|
||||
}
|
||||
|
||||
emit proxyPasswordChanged();
|
||||
|
|
|
@ -86,7 +86,7 @@ class OWNCLOUDSYNC_EXPORT Account : public QObject
|
|||
Q_OBJECT
|
||||
Q_PROPERTY(QString id MEMBER _id)
|
||||
Q_PROPERTY(QString davUser MEMBER _davUser)
|
||||
Q_PROPERTY(QString displayName MEMBER _displayName)
|
||||
Q_PROPERTY(QString davDisplayName MEMBER _davDisplayName)
|
||||
Q_PROPERTY(QString prettyName READ prettyName NOTIFY prettyNameChanged)
|
||||
Q_PROPERTY(QUrl url MEMBER _url)
|
||||
Q_PROPERTY(bool e2eEncryptionKeysGenerationAllowed MEMBER _e2eEncryptionKeysGenerationAllowed)
|
||||
|
@ -493,6 +493,7 @@ private:
|
|||
QWeakPointer<Account> _sharedThis;
|
||||
QString _id;
|
||||
QString _davUser;
|
||||
QString _davDisplayName;
|
||||
QString _displayName;
|
||||
QTimer _pushNotificationsReconnectTimer;
|
||||
#ifndef TOKEN_AUTH_ONLY
|
||||
|
@ -517,7 +518,7 @@ private:
|
|||
QColor _serverTextColor = QColorConstants::White;
|
||||
bool _skipE2eeMetadataChecksumValidation = false;
|
||||
QScopedPointer<AbstractSslErrorHandler> _sslErrorHandler;
|
||||
QSharedPointer<QNetworkAccessManager> _am;
|
||||
QSharedPointer<QNetworkAccessManager> _networkAccessManager;
|
||||
QScopedPointer<AbstractCredentials> _credentials;
|
||||
bool _http2Supported = false;
|
||||
|
||||
|
|
Loading…
Reference in a new issue