Skip to content

Commit

Permalink
GUI/LIBSYNC: force login flow V2 with config setting
Browse files Browse the repository at this point in the history
This patch allows a user to set the config variable:

forceLoginV2=true

This will make the client use the browser login flow instead of the
webview. This is useful for making the user experience equal on
Windows, Linux and Mac. Currently only Macs use the v2 flow and it
was only possible to get this behaviour in the Windows and Linux
clients at build time using a CMAKE flag.

The default behaviour is kept the same, and nothing changes for the
user unless the flag is manually set in the config file. A setter is
included in this patch, although it is not yet used in the GUI.

Signed-off-by: Micke Nordin <[email protected]>
  • Loading branch information
mickenordin committed Dec 6, 2023
1 parent 14c03bf commit d98faf5
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 5 deletions.
2 changes: 2 additions & 0 deletions doc/conffile.rst
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ Some interesting values that can be set on the configuration file are:
| ``chunkSize`` | ``10000000`` (10 MB) | Specifies the chunk size of uploaded files in bytes. |
| | | The client will dynamically adjust this size within the maximum and minimum bounds (see below). |
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
| ``forceLoginV2`` | ``false`` | If the client should force the new login flow, eventhough some circumstances might need the old flow. |
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
| ``minChunkSize`` | ``1000000`` (1 MB) | Specifies the minimum chunk size of uploaded files in bytes. |
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
| ``maxChunkSize`` | ``1000000000`` (1000 MB) | Specifies the maximum chunk size of uploaded files in bytes. |
Expand Down
2 changes: 2 additions & 0 deletions src/gui/wizard/owncloudsetuppage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@ int OwncloudSetupPage::nextId() const
return WizardCommon::Page_Flow2AuthCreds;
#ifdef WITH_WEBENGINE
case DetermineAuthTypeJob::WebViewFlow:
if (this->useFlow2)
return WizardCommon::Page_Flow2AuthCreds;
return WizardCommon::Page_WebView;
#endif // WITH_WEBENGINE
case DetermineAuthTypeJob::NoAuthType:
Expand Down
3 changes: 3 additions & 0 deletions src/gui/wizard/owncloudsetuppage.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ protected slots:
QProgressIndicator *_progressIndi;
OwncloudWizard *_ocWizard;
AddCertificateDialog *addCertDial = nullptr;

// Grab the forceLoginV2-setting from the wizard
bool useFlow2 = _ocWizard->useFlow2();
};

} // namespace OCC
Expand Down
15 changes: 11 additions & 4 deletions src/gui/wizard/owncloudwizard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ OwncloudWizard::OwncloudWizard(QWidget *parent)
setPage(WizardCommon::Page_Flow2AuthCreds, _flow2CredsPage);
setPage(WizardCommon::Page_AdvancedSetup, _advancedSetupPage);
#ifdef WITH_WEBENGINE
setPage(WizardCommon::Page_WebView, _webViewPage);
if(!useFlow2())
setPage(WizardCommon::Page_WebView, _webViewPage);
#endif // WITH_WEBENGINE

connect(this, &QDialog::finished, this, &OwncloudWizard::basicSetupFinished);
Expand All @@ -78,7 +79,8 @@ OwncloudWizard::OwncloudWizard(QWidget *parent)
connect(_httpCredsPage, &OwncloudHttpCredsPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
connect(_flow2CredsPage, &Flow2AuthCredsPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
#ifdef WITH_WEBENGINE
connect(_webViewPage, &WebViewPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
if(!useFlow2())
connect(_webViewPage, &WebViewPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
#endif // WITH_WEBENGINE
connect(_advancedSetupPage, &OwncloudAdvancedSetupPage::createLocalAndRemoteFolders,
this, &OwncloudWizard::createLocalAndRemoteFolders);
Expand Down Expand Up @@ -235,7 +237,8 @@ void OwncloudWizard::successfulStep()

#ifdef WITH_WEBENGINE
case WizardCommon::Page_WebView:
_webViewPage->setConnected();
if(!this->useFlow2())
_webViewPage->setConnected();
break;
#endif // WITH_WEBENGINE

Expand Down Expand Up @@ -276,7 +279,11 @@ void OwncloudWizard::setAuthType(DetermineAuthTypeJob::AuthType type)
_credentialsPage = _flow2CredsPage;
#ifdef WITH_WEBENGINE
} else if (type == DetermineAuthTypeJob::WebViewFlow) {
_credentialsPage = _webViewPage;
if(this->useFlow2()) {
_credentialsPage = _flow2CredsPage;
} else {
_credentialsPage = _webViewPage;
}
#endif // WITH_WEBENGINE
} else { // try Basic auth even for "Unknown"
_credentialsPage = _httpCredsPage;
Expand Down
4 changes: 4 additions & 0 deletions src/gui/wizard/owncloudwizard.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <QSslKey>
#include <QSslCertificate>

#include "libsync/configfile.h"
#include "networkjobs.h"
#include "wizard/owncloudwizardcommon.h"
#include "accountfwd.h"
Expand Down Expand Up @@ -87,6 +88,7 @@ class OwncloudWizard : public QWizard
QSslKey _clientSslKey; // key extracted from pkcs12
QSslCertificate _clientSslCertificate; // cert extracted from pkcs12
QList<QSslCertificate> _clientSslCaCertificates;
bool useFlow2() { return _useFlow2; };

public slots:
void setAuthType(OCC::DetermineAuthTypeJob::AuthType type);
Expand Down Expand Up @@ -131,6 +133,8 @@ public slots:

bool _registration = false;

bool _useFlow2 = ConfigFile().forceLoginV2();

friend class OwncloudSetupWizard;
};

Expand Down
9 changes: 9 additions & 0 deletions src/libsync/configfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ static constexpr char stopSyncingExistingFoldersOverLimitC[] = "stopSyncingExist
static constexpr char confirmExternalStorageC[] = "confirmExternalStorage";
static constexpr char moveToTrashC[] = "moveToTrash";

static constexpr char forceLoginV2C[] = "forceLoginV2";

Check warning on line 107 in src/libsync/configfile.cpp

View workflow job for this annotation

GitHub Actions / build

/src/libsync/configfile.cpp:107:23 [readability-static-definition-in-anonymous-namespace]

'forceLoginV2C' is a static definition in anonymous namespace; static is redundant here

static constexpr char certPath[] = "http_certificatePath";
static constexpr char certPasswd[] = "http_certificatePasswd";

Expand Down Expand Up @@ -991,6 +993,13 @@ void ConfigFile::setMoveToTrash(bool isChecked)
setValue(moveToTrashC, isChecked);
}

bool ConfigFile::forceLoginV2() const {
return getValue(forceLoginV2C, QString(), false).toBool();
}
void ConfigFile::setForceLoginV2(bool isChecked) {
setValue(forceLoginV2C, isChecked);
}

bool ConfigFile::showMainDialogAsNormalWindow() const {
return getValue(showMainDialogAsNormalWindowC, {}, false).toBool();
}
Expand Down
4 changes: 4 additions & 0 deletions src/libsync/configfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ class OWNCLOUDSYNC_EXPORT ConfigFile
[[nodiscard]] bool moveToTrash() const;
void setMoveToTrash(bool);

/** If we should force loginflow v2 */
[[nodiscard]] bool forceLoginV2() const;
void setForceLoginV2(bool);

[[nodiscard]] bool showMainDialogAsNormalWindow() const;

static bool setConfDir(const QString &value);
Expand Down
13 changes: 12 additions & 1 deletion src/libsync/networkjobs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@

#include "creds/abstractcredentials.h"
#include "creds/httpcredentials.h"
#include "configfile.h"

namespace OCC {

Expand Down Expand Up @@ -1011,7 +1012,9 @@ bool JsonApiJob::finished()
DetermineAuthTypeJob::DetermineAuthTypeJob(AccountPtr account, QObject *parent)
: QObject(parent)
, _account(account)

{
useFlow2 = ConfigFile().forceLoginV2();
}

void DetermineAuthTypeJob::start()
Expand Down Expand Up @@ -1077,7 +1080,11 @@ void DetermineAuthTypeJob::start()
if (flow != QJsonValue::Undefined) {
if (flow.toInt() == 1) {
#ifdef WITH_WEBENGINE
_resultOldFlow = WebViewFlow;
if(!this->useFlow2) {
_resultOldFlow = WebViewFlow;
} else {
qCWarning(lcDetermineAuthTypeJob) << "Server only supports flow1, but this client was configured to only use flow2";
}
#else // WITH_WEBENGINE
qCWarning(lcDetermineAuthTypeJob) << "Server does only support flow1, but this client was compiled without support for flow1";
#endif // WITH_WEBENGINE
Expand Down Expand Up @@ -1111,6 +1118,8 @@ void DetermineAuthTypeJob::checkAllDone()
// WebViewFlow > Basic
if (_account->serverVersionInt() >= Account::makeServerVersion(12, 0, 0)) {
result = WebViewFlow;
if(useFlow2)
result = LoginFlowV2;
}
#endif // WITH_WEBENGINE

Expand All @@ -1123,6 +1132,8 @@ void DetermineAuthTypeJob::checkAllDone()
// If we determined that we need the webview flow (GS for example) then we switch to that
if (_resultOldFlow == WebViewFlow) {
result = WebViewFlow;
if(useFlow2)
result = LoginFlowV2;
}
#endif // WITH_WEBENGINE

Expand Down
1 change: 1 addition & 0 deletions src/libsync/networkjobs.h
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,7 @@ class OWNCLOUDSYNC_EXPORT DetermineAuthTypeJob : public QObject
bool _getDone = false;
bool _propfindDone = false;
bool _oldFlowDone = false;
bool useFlow2 = false;
};

/**
Expand Down

0 comments on commit d98faf5

Please sign in to comment.