summaryrefslogtreecommitdiff
path: root/user/nextcloud-client
diff options
context:
space:
mode:
authorMax Rees <maxcrees@me.com>2018-08-16 03:53:53 -0400
committerMax Rees <maxcrees@me.com>2018-10-03 02:29:08 -0400
commit977c5d8e38ca9ed712c172a58dd0d893a6442d5e (patch)
tree4063f8573e9092e90522cb1f9656eff5d50a4ffd /user/nextcloud-client
parent75ad34513e7be0eb1877e304e52e9f7ee9229425 (diff)
downloadpackages-977c5d8e38ca9ed712c172a58dd0d893a6442d5e.tar.gz
packages-977c5d8e38ca9ed712c172a58dd0d893a6442d5e.tar.bz2
packages-977c5d8e38ca9ed712c172a58dd0d893a6442d5e.tar.xz
packages-977c5d8e38ca9ed712c172a58dd0d893a6442d5e.zip
user/nextcloud-client: new package
Diffstat (limited to 'user/nextcloud-client')
-rw-r--r--user/nextcloud-client/APKBUILD45
-rw-r--r--user/nextcloud-client/no-webengine.patch1017
-rw-r--r--user/nextcloud-client/openssl.patch11
3 files changed, 1073 insertions, 0 deletions
diff --git a/user/nextcloud-client/APKBUILD b/user/nextcloud-client/APKBUILD
new file mode 100644
index 000000000..c842eaa18
--- /dev/null
+++ b/user/nextcloud-client/APKBUILD
@@ -0,0 +1,45 @@
+# Contributor: Leonardo Arena <rnalrd@alpinelinux.org>
+# Maintainer: Max Rees <maxcrees@me.com>
+pkgname=nextcloud-client
+pkgver=2.5.0_beta2
+_ver="${pkgver%_beta2}-beta2"
+pkgrel=0
+pkgdesc="Nextcloud desktop client"
+url="https://github.com/nextcloud/desktop"
+arch="all"
+license="GPL-2.0+ AND LGPL-2.1+ AND Public-Domain AND MIT AND (Custom:Digia-Qt OR LGPL-2.1-only WITH Qt-LGPL-exception-1.1) AND (Custom:Digia-Qt OR LGPL-2.1-only WITH Qt-LGPL-exception-1.1 OR GPL-3.0-only)"
+depends=""
+makedepends="cmake qt5-qttools-dev qtkeychain-dev zlib-dev
+ openssl-dev sqlite-dev qt5-qtsvg-dev"
+subpackages="$pkgname-dev"
+source="$pkgname-$pkgver.tar.gz::https://github.com/nextcloud/desktop/archive/v$_ver.tar.gz
+ no-webengine.patch
+ openssl.patch"
+builddir="$srcdir/desktop-$_ver"
+
+build() {
+ cd "$builddir"
+ cmake \
+ -DCMAKE_BUILD_TYPE=RelWithDebInfo \
+ -DCMAKE_INSTALL_LIBDIR=lib \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_SYSCONFDIR="/etc/$pkgname" \
+ -DNO_SHIBBOLETH=1 \
+ -DWITH_CRASHREPORTER=bool:OFF \
+ -DUNIT_TESTING=bool:ON
+ make
+}
+
+check() {
+ cd "$builddir"
+ make test
+}
+
+package() {
+ cd "$builddir"
+ make DESTDIR="$pkgdir" install
+}
+
+sha512sums="ed5ec8c0fd79d3f7f843ef1aefb9b94088b85dacca442388bc9a42e1ddbf1ee90482595135ffaffc85e40d223406964c903949ca1c2161fa0f6a2d6770a77cea nextcloud-client-2.5.0_beta2.tar.gz
+6bd83fdee02eabe7ae29fb1a677f62d4a416ec553a0f8c66b7544cafb9201dd7d8b04dc6fb21f447f6c1ece13b06f5d3cba57ac71b211e166607ef15350b3e57 no-webengine.patch
+e323a1074f8ac96667a420f076fdfc988e2fd97cdacd05d83ac54b467b567f5adbf635e7c4fb0414af0012b4016cc4c13441cb35ed3976bc970e514e81b65fd4 openssl.patch"
diff --git a/user/nextcloud-client/no-webengine.patch b/user/nextcloud-client/no-webengine.patch
new file mode 100644
index 000000000..d5beed35c
--- /dev/null
+++ b/user/nextcloud-client/no-webengine.patch
@@ -0,0 +1,1017 @@
+--- desktop-2.5.0-beta1/src/libsync/networkjobs.cpp 2018-08-02 16:32:56.000000000 -0400
++++ desktop-2.5.0-beta1/src/libsync/networkjobs.cpp 2018-08-15 19:10:43.340595365 -0400
+@@ -922,7 +922,7 @@
+
+ // WebViewFlow > OAuth > Shib > Basic
+ if (_account->serverVersionInt() >= Account::makeServerVersion(12, 0, 0)) {
+- result = WebViewFlow;
++ result = Basic;
+ }
+
+ qCInfo(lcDetermineAuthTypeJob) << "Auth type for" << _account->davUrl() << "is" << result;
+--- desktop-2.5.0-beta1/src/gui/creds/webflowcredentialsdialog.cpp 2018-08-02 16:32:56.000000000 -0400
++++ /dev/null 2018-08-15 19:12:03.420596798 -0400
+@@ -1,49 +0,0 @@
+-#include "webflowcredentialsdialog.h"
+-
+-#include <QVBoxLayout>
+-#include <QLabel>
+-
+-#include "wizard/webview.h"
+-
+-namespace OCC {
+-
+-WebFlowCredentialsDialog::WebFlowCredentialsDialog(QWidget *parent)
+- : QDialog(parent)
+-{
+- _layout = new QVBoxLayout(this);
+-
+- //QString msg = tr("You have been logged out of %1 as user %2, please login again")
+- // .arg(_account->displayName(), _user);
+- _infoLabel = new QLabel();
+- _layout->addWidget(_infoLabel);
+-
+- _webView = new WebView();
+- _layout->addWidget(_webView);
+-
+- _errorLabel = new QLabel();
+- _errorLabel->hide();
+- _layout->addWidget(_errorLabel);
+-
+- setLayout(_layout);
+-
+- connect(_webView, &WebView::urlCatched, this, &WebFlowCredentialsDialog::urlCatched);
+-}
+-
+-void WebFlowCredentialsDialog::setUrl(const QUrl &url) {
+- _webView->setUrl(url);
+-}
+-
+-void WebFlowCredentialsDialog::setInfo(const QString &msg) {
+- _infoLabel->setText(msg);
+-}
+-
+-void WebFlowCredentialsDialog::setError(const QString &error) {
+- if (error.isEmpty()) {
+- _errorLabel->hide();
+- } else {
+- _errorLabel->setText(error);
+- _errorLabel->show();
+- }
+-}
+-
+-}
+--- desktop-2.5.0-beta1/src/gui/creds/webflowcredentials.cpp 2018-08-02 16:32:56.000000000 -0400
++++ /dev/null 2018-08-15 19:12:03.420596798 -0400
+@@ -1,258 +0,0 @@
+-#include "webflowcredentials.h"
+-
+-#include "creds/httpcredentials.h"
+-
+-#include <QAuthenticator>
+-#include <QNetworkAccessManager>
+-#include <QNetworkReply>
+-#include <QPointer>
+-#include <QTimer>
+-#include <keychain.h>
+-#include <QDialog>
+-#include <QVBoxLayout>
+-#include <QLabel>
+-
+-#include "accessmanager.h"
+-#include "account.h"
+-#include "theme.h"
+-#include "wizard/webview.h"
+-#include "webflowcredentialsdialog.h"
+-
+-using namespace QKeychain;
+-
+-namespace OCC {
+-
+-Q_LOGGING_CATEGORY(lcWebFlowCredentials, "sync.credentials.webflow", QtInfoMsg)
+-
+-WebFlowCredentials::WebFlowCredentials()
+- : _ready(false),
+- _credentialsValid(false)
+-{
+-
+-}
+-
+-WebFlowCredentials::WebFlowCredentials(const QString &user, const QString &password, const QSslCertificate &certificate, const QSslKey &key)
+- : _user(user)
+- , _password(password)
+- , _clientSslKey(key)
+- , _clientSslCertificate(certificate)
+- , _ready(true)
+- , _credentialsValid(true)
+-{
+-
+-}
+-
+-QString WebFlowCredentials::authType() const {
+- return QString::fromLatin1("webflow");
+-}
+-
+-QString WebFlowCredentials::user() const {
+- return _user;
+-}
+-
+-QString WebFlowCredentials::password() const {
+- return _password;
+-}
+-
+-QNetworkAccessManager *WebFlowCredentials::createQNAM() const {
+- qCInfo(lcWebFlowCredentials()) << "Get QNAM";
+- AccessManager *qnam = new AccessManager();
+-
+- connect(qnam, &AccessManager::authenticationRequired, this, &WebFlowCredentials::slotAuthentication);
+- connect(qnam, &AccessManager::finished, this, &WebFlowCredentials::slotFinished);
+-
+- return qnam;
+-}
+-
+-bool WebFlowCredentials::ready() const {
+- return _ready;
+-}
+-
+-void WebFlowCredentials::fetchFromKeychain() {
+- _wasFetched = true;
+-
+- // Make sure we get the user fromt he config file
+- fetchUser();
+-
+- if (ready()) {
+- emit fetched();
+- } else {
+- qCInfo(lcWebFlowCredentials()) << "Fetch from keyhchain!";
+- fetchFromKeychainHelper();
+- }
+-}
+-
+-void WebFlowCredentials::askFromUser() {
+- _askDialog = new WebFlowCredentialsDialog();
+-
+- QUrl url = _account->url();
+- QString path = url.path() + "/index.php/login/flow";
+- url.setPath(path);
+- _askDialog->setUrl(url);
+-
+- QString msg = tr("You have been logged out of %1 as user %2. Please login again")
+- .arg(_account->displayName(), _user);
+- _askDialog->setInfo(msg);
+-
+- _askDialog->show();
+-
+- connect(_askDialog, &WebFlowCredentialsDialog::urlCatched, this, &WebFlowCredentials::slotAskFromUserCredentialsProvided);
+-
+- qCWarning(lcWebFlowCredentials()) << "User needs to reauth!";
+-}
+-
+-void WebFlowCredentials::slotAskFromUserCredentialsProvided(const QString &user, const QString &pass, const QString &host) {
+- Q_UNUSED(host);
+-
+- if (_user != user) {
+- qCInfo(lcWebFlowCredentials()) << "Authed with the wrong user!";
+-
+- QString msg = tr("Please login with the user: %1")
+- .arg(_user);
+- _askDialog->setError(msg);
+-
+- QUrl url = _account->url();
+- QString path = url.path() + "/index.php/login/flow";
+- url.setPath(path);
+- _askDialog->setUrl(url);
+-
+- return;
+- }
+-
+- qCInfo(lcWebFlowCredentials()) << "Obtained a new password";
+-
+- _password = pass;
+- _ready = true;
+- _credentialsValid = true;
+- persist();
+- emit asked();
+-
+- _askDialog->close();
+- delete _askDialog;
+- _askDialog = NULL;
+-}
+-
+-
+-bool WebFlowCredentials::stillValid(QNetworkReply *reply) {
+- qCWarning(lcWebFlowCredentials()) << "Still valid?";
+- qCWarning(lcWebFlowCredentials()) << reply->error();
+- qCWarning(lcWebFlowCredentials()) << reply->errorString();
+- return (reply->error() != QNetworkReply::AuthenticationRequiredError);
+-}
+-
+-void WebFlowCredentials::persist() {
+- if (_user.isEmpty()) {
+- // We don't even have a user nothing to see here move along
+- return;
+- }
+-
+- _account->setCredentialSetting("user", _user);
+- _account->wantsAccountSaved(_account);
+-
+- //TODO: Add ssl cert and key storing
+- WritePasswordJob *job = new WritePasswordJob(Theme::instance()->appName());
+- job->setInsecureFallback(false);
+- job->setKey(keychainKey(_account->url().toString(), _user, _account->id()));
+- job->setTextData(_password);
+- job->start();
+-}
+-
+-void WebFlowCredentials::invalidateToken() {
+- // clear the session cookie.
+- _account->clearCookieJar();
+-
+- // let QNAM forget about the password
+- // This needs to be done later in the event loop because we might be called (directly or
+- // indirectly) from QNetworkAccessManagerPrivate::authenticationRequired, which itself
+- // is a called from a BlockingQueuedConnection from the Qt HTTP thread. And clearing the
+- // cache needs to synchronize again with the HTTP thread.
+- QTimer::singleShot(0, _account, &Account::clearQNAMCache);
+-}
+-
+-void WebFlowCredentials::forgetSensitiveData(){
+- _password = QString();
+- _ready = false;
+-
+- fetchUser();
+-
+- const QString kck = keychainKey(_account->url().toString(), _user, _account->id());
+- if (kck.isEmpty()) {
+- qCWarning(lcWebFlowCredentials()) << "InvalidateToken: User is empty, bailing out!";
+- return;
+- }
+-
+- DeletePasswordJob *job = new DeletePasswordJob(Theme::instance()->appName());
+- job->setInsecureFallback(false);
+- job->setKey(kck);
+- job->start();
+-
+- invalidateToken();
+-}
+-
+-void WebFlowCredentials::setAccount(Account *account) {
+- AbstractCredentials::setAccount(account);
+- if (_user.isEmpty()) {
+- fetchUser();
+- }
+-}
+-
+-QString WebFlowCredentials::fetchUser() {
+- _user = _account->credentialSetting("user").toString();
+- return _user;
+-}
+-
+-void WebFlowCredentials::slotAuthentication(QNetworkReply *reply, QAuthenticator *authenticator) {
+- Q_UNUSED(reply);
+-
+- if (!_ready) {
+- return;
+- }
+-
+- if (_credentialsValid == false) {
+- return;
+- }
+-
+- qCWarning(lcWebFlowCredentials()) << "Requires authentication";
+-
+- authenticator->setUser(_user);
+- authenticator->setPassword(_password);
+- _credentialsValid = false;
+-}
+-
+-void WebFlowCredentials::slotFinished(QNetworkReply *reply) {
+- qCInfo(lcWebFlowCredentials()) << "request finished";
+-
+- if (reply->error() == QNetworkReply::NoError) {
+- _credentialsValid = true;
+- }
+-}
+-
+-void WebFlowCredentials::fetchFromKeychainHelper() {
+- const QString kck = keychainKey(
+- _account->url().toString(),
+- _user,
+- _account->id());
+-
+- ReadPasswordJob *job = new ReadPasswordJob(Theme::instance()->appName());
+- job->setInsecureFallback(false);
+- job->setKey(kck);
+- connect(job, &Job::finished, this, &WebFlowCredentials::slotReadPasswordJobDone);
+- job->start();
+-}
+-
+-void WebFlowCredentials::slotReadPasswordJobDone(Job *incomingJob) {
+- QKeychain::ReadPasswordJob *job = static_cast<ReadPasswordJob *>(incomingJob);
+- QKeychain::Error error = job->error();
+-
+- if (error == QKeychain::NoError) {
+- _password = job->textData();
+- _ready = true;
+- _credentialsValid = true;
+- } else {
+- _ready = false;
+- }
+-
+- emit fetched();
+-}
+-
+-}
+--- desktop-2.5.0-beta1/src/gui/creds/webflowcredentialsdialog.h 2018-08-02 16:32:56.000000000 -0400
++++ /dev/null 2018-08-15 19:12:03.420596798 -0400
+@@ -1,36 +0,0 @@
+-#ifndef WEBFLOWCREDENTIALSDIALOG_H
+-#define WEBFLOWCREDENTIALSDIALOG_H
+-
+-#include <QDialog>
+-#include <QUrl>
+-
+-class QLabel;
+-class QVBoxLayout;
+-
+-namespace OCC {
+-
+-class WebView;
+-
+-class WebFlowCredentialsDialog : public QDialog
+-{
+- Q_OBJECT
+-public:
+- WebFlowCredentialsDialog(QWidget *parent = 0);
+-
+- void setUrl(const QUrl &url);
+- void setInfo(const QString &msg);
+- void setError(const QString &error);
+-
+-signals:
+- void urlCatched(const QString user, const QString pass, const QString host);
+-
+-private:
+- WebView *_webView;
+- QLabel *_errorLabel;
+- QLabel *_infoLabel;
+- QVBoxLayout *_layout;
+-};
+-
+-}
+-
+-#endif // WEBFLOWCREDENTIALSDIALOG_H
+--- desktop-2.5.0-beta1/src/gui/creds/credentialsfactory.cpp 2018-08-02 16:32:56.000000000 -0400
++++ desktop-2.5.0-beta1/src/gui/creds/credentialsfactory.cpp 2018-08-15 19:29:27.240615471 -0400
+@@ -21,7 +21,6 @@
+ #ifndef NO_SHIBBOLETH
+ #include "creds/shibbolethcredentials.h"
+ #endif
+-#include "creds/webflowcredentials.h"
+
+ namespace OCC {
+
+@@ -40,8 +39,6 @@
+ } else if (type == "shibboleth") {
+ return new ShibbolethCredentials;
+ #endif
+- } else if (type == "webflow") {
+- return new WebFlowCredentials;
+ } else {
+ qCWarning(lcGuiCredentials, "Unknown credentials type: %s", qPrintable(type));
+ return new DummyCredentials;
+--- desktop-2.5.0-beta1/src/gui/creds/webflowcredentials.h 2018-08-02 16:32:56.000000000 -0400
++++ /dev/null 2018-08-15 19:12:03.420596798 -0400
+@@ -1,79 +0,0 @@
+-#ifndef WEBFLOWCREDENTIALS_H
+-#define WEBFLOWCREDENTIALS_H
+-
+-#include <QSslCertificate>
+-#include <QSslKey>
+-
+-#include "creds/abstractcredentials.h"
+-
+-class QDialog;
+-class QLabel;
+-class QNetworkReply;
+-class QAuthenticator;
+-
+-namespace QKeychain {
+- class Job;
+-}
+-
+-namespace OCC {
+-
+-class WebFlowCredentialsDialog;
+-
+-class WebFlowCredentials : public AbstractCredentials
+-{
+- Q_OBJECT
+-public:
+- explicit WebFlowCredentials();
+- WebFlowCredentials(const QString &user, const QString &password, const QSslCertificate &certificate = QSslCertificate(), const QSslKey &key = QSslKey());
+-
+- QString authType() const override;
+- QString user() const override;
+- QString password() const;
+- QNetworkAccessManager *createQNAM() const override;
+-
+- bool ready() const override;
+-
+- void fetchFromKeychain() override;
+- void askFromUser() override;
+-
+- bool stillValid(QNetworkReply *reply) override;
+- void persist() override;
+- void invalidateToken() override;
+- void forgetSensitiveData() override;
+-
+- // To fetch the user name as early as possible
+- void setAccount(Account *account) override;
+-
+-private slots:
+- void slotAuthentication(QNetworkReply *reply, QAuthenticator *authenticator);
+- void slotFinished(QNetworkReply *reply);
+-
+- void slotReadPasswordJobDone(QKeychain::Job *incomingJob);
+- void slotAskFromUserCredentialsProvided(const QString &user, const QString &pass, const QString &host);
+-
+-private:
+- /** Reads data from keychain locations
+- *
+- * Goes through
+- * slotReadClientCertPEMJobDone to
+- * slotReadClientCertPEMJobDone to
+- * slotReadJobDone
+- */
+- void fetchFromKeychainHelper();
+-
+- QString fetchUser();
+-
+- QString _user;
+- QString _password;
+- QSslKey _clientSslKey;
+- QSslCertificate _clientSslCertificate;
+-
+- bool _ready;
+- bool _credentialsValid;
+-
+- WebFlowCredentialsDialog *_askDialog;
+-};
+-
+-}
+-
+-#endif // WEBFLOWCREDENTIALS_H
+--- desktop-2.5.0-beta1/src/gui/CMakeLists.txt 2018-08-02 16:32:56.000000000 -0400
++++ desktop-2.5.0-beta1/src/gui/CMakeLists.txt 2018-08-15 19:28:53.640614870 -0400
+@@ -41,7 +41,6 @@
+ wizard/owncloudoauthcredspage.ui
+ wizard/owncloudsetupnocredspage.ui
+ wizard/owncloudwizardresultpage.ui
+- wizard/webview.ui
+ )
+
+ set(client_SRCS
+@@ -104,8 +103,6 @@
+ creds/credentialsfactory.cpp
+ creds/httpcredentialsgui.cpp
+ creds/oauth.cpp
+- creds/webflowcredentials.cpp
+- creds/webflowcredentialsdialog.cpp
+ wizard/postfixlineedit.cpp
+ wizard/abstractcredswizardpage.cpp
+ wizard/owncloudadvancedsetuppage.cpp
+@@ -116,8 +113,6 @@
+ wizard/owncloudwizardcommon.cpp
+ wizard/owncloudwizard.cpp
+ wizard/owncloudwizardresultpage.cpp
+- wizard/webviewpage.cpp
+- wizard/webview.cpp
+ )
+
+ IF(NOT NO_SHIBBOLETH)
+@@ -290,7 +290,7 @@
+ endif()
+
+ add_library(updater STATIC ${updater_SRCS})
+-target_link_libraries(updater ${synclib_NAME} Qt5::Widgets Qt5::Network Qt5::Xml Qt5::WebEngineWidgets)
++target_link_libraries(updater ${synclib_NAME} Qt5::Widgets Qt5::Network Qt5::Xml)
+ target_include_directories(updater PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+
+ set_target_properties( ${APPLICATION_EXECUTABLE} PROPERTIES
+--- desktop-2.5.0-beta2/src/gui/wizard/webview.cpp 2018-08-24 12:54:42.000000000 +0000
++++ /dev/null 2018-10-03 06:10:44.230254545 +0000
+@@ -1,162 +0,0 @@
+-#include "webview.h"
+-
+-#include <QWebEnginePage>
+-#include <QWebEngineProfile>
+-#include <QWebEngineUrlRequestInterceptor>
+-#include <QWebEngineUrlRequestJob>
+-#include <QWebEngineUrlSchemeHandler>
+-#include <QWebEngineView>
+-#include <QDesktopServices>
+-#include <QProgressBar>
+-#include <QLoggingCategory>
+-#include <QLocale>
+-
+-#include "common/utility.h"
+-
+-namespace OCC {
+-
+-Q_LOGGING_CATEGORY(lcWizardWebiew, "gui.wizard.webview", QtInfoMsg)
+-
+-
+-class WebViewPageUrlRequestInterceptor : public QWebEngineUrlRequestInterceptor
+-{
+- Q_OBJECT
+-public:
+- WebViewPageUrlRequestInterceptor(QObject *parent = 0);
+- void interceptRequest(QWebEngineUrlRequestInfo &info);
+-};
+-
+-class WebViewPageUrlSchemeHandler : public QWebEngineUrlSchemeHandler
+-{
+- Q_OBJECT
+-public:
+- WebViewPageUrlSchemeHandler(QObject *parent = 0);
+- void requestStarted(QWebEngineUrlRequestJob *request);
+-
+-Q_SIGNALS:
+- void urlCatched(QString user, QString pass, QString host);
+-};
+-
+-class WebEnginePage : public QWebEnginePage {
+-public:
+- WebEnginePage(QWebEngineProfile *profile, QObject* parent = nullptr);
+- QWebEnginePage * createWindow(QWebEnginePage::WebWindowType type) override;
+-};
+-
+-// We need a separate class here, since we cannot simply return the same WebEnginePage object
+-// this leads to a strage segfault somewhere deep inside of the QWebEngine code
+-class ExternalWebEnginePage : public QWebEnginePage {
+-public:
+- ExternalWebEnginePage(QWebEngineProfile *profile, QObject* parent = nullptr);
+- bool acceptNavigationRequest(const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) override;
+-};
+-
+-WebView::WebView(QWidget *parent)
+- : QWidget(parent),
+- _ui()
+-{
+- _ui.setupUi(this);
+-
+- _webview = new QWebEngineView(this);
+- _profile = new QWebEngineProfile(this);
+- _page = new WebEnginePage(_profile);
+- _interceptor = new WebViewPageUrlRequestInterceptor(this);
+- _schemeHandler = new WebViewPageUrlSchemeHandler(this);
+-
+- const QString userAgent(Utility::userAgentString());
+- _profile->setHttpUserAgent(userAgent);
+- QWebEngineProfile::defaultProfile()->setHttpUserAgent(userAgent);
+- _profile->setRequestInterceptor(_interceptor);
+- _profile->installUrlSchemeHandler("nc", _schemeHandler);
+-
+- /*
+- * Set a proper accept langauge to the language of the client
+- * code from: http://code.qt.io/cgit/qt/qtbase.git/tree/src/network/access/qhttpnetworkconnection.cpp
+- */
+- {
+- QString systemLocale = QLocale::system().name().replace(QChar::fromLatin1('_'),QChar::fromLatin1('-'));
+- QString acceptLanguage;
+- if (systemLocale == QLatin1String("C")) {
+- acceptLanguage = QString::fromLatin1("en,*");
+- } else if (systemLocale.startsWith(QLatin1String("en-"))) {
+- acceptLanguage = systemLocale + QLatin1String(",*");
+- } else {
+- acceptLanguage = systemLocale + QLatin1String(",en,*");
+- }
+- _profile->setHttpAcceptLanguage(acceptLanguage);
+- }
+-
+- _webview->setPage(_page);
+- _ui.verticalLayout->addWidget(_webview);
+-
+- connect(_webview, &QWebEngineView::loadProgress, _ui.progressBar, &QProgressBar::setValue);
+- connect(_schemeHandler, &WebViewPageUrlSchemeHandler::urlCatched, this, &WebView::urlCatched);
+-}
+-
+-void WebView::setUrl(const QUrl &url) {
+- _page->setUrl(url);
+-}
+-
+-WebViewPageUrlRequestInterceptor::WebViewPageUrlRequestInterceptor(QObject *parent)
+- : QWebEngineUrlRequestInterceptor(parent) {
+-
+-}
+-
+-void WebViewPageUrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) {
+- info.setHttpHeader("OCS-APIREQUEST", "true");
+-}
+-
+-WebViewPageUrlSchemeHandler::WebViewPageUrlSchemeHandler(QObject *parent)
+- : QWebEngineUrlSchemeHandler(parent) {
+-
+-}
+-
+-void WebViewPageUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob *request) {
+- QUrl url = request->requestUrl();
+-
+- QString path = url.path().mid(1);
+- QStringList parts = path.split("&");
+-
+- QString server;
+- QString user;
+- QString password;
+-
+- for (QString part : parts) {
+- if (part.startsWith("server:")) {
+- server = part.mid(7);
+- } else if (part.startsWith("user:")) {
+- user = part.mid(5);
+- } else if (part.startsWith("password:")) {
+- password = part.mid(9);
+- }
+- }
+-
+- qCInfo(lcWizardWebiew()) << "Got user: " << user << ", server: " << server;
+-
+- emit urlCatched(user, password, server);
+-}
+-
+-
+-WebEnginePage::WebEnginePage(QWebEngineProfile *profile, QObject* parent) : QWebEnginePage(profile, parent) {
+-
+-}
+-
+-QWebEnginePage * WebEnginePage::createWindow(QWebEnginePage::WebWindowType type) {
+- ExternalWebEnginePage *view = new ExternalWebEnginePage(this->profile());
+- return view;
+-}
+-
+-ExternalWebEnginePage::ExternalWebEnginePage(QWebEngineProfile *profile, QObject* parent) : QWebEnginePage(profile, parent) {
+-
+-}
+-
+-
+-bool ExternalWebEnginePage::acceptNavigationRequest(const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame)
+-{
+- QDesktopServices::openUrl(url);
+- return false;
+-}
+-
+-}
+-
+-#include "webview.moc"
+--- desktop-2.5.0-beta1/src/gui/wizard/webviewpage.cpp 2018-08-02 16:32:56.000000000 -0400
++++ /dev/null 2018-08-15 19:06:30.250590838 -0400
+@@ -1,73 +0,0 @@
+-#include "webviewpage.h"
+-
+-#include <QWebEngineUrlRequestJob>
+-#include <QProgressBar>
+-#include <QVBoxLayout>
+-
+-#include "owncloudwizard.h"
+-#include "creds/webflowcredentials.h"
+-#include "webview.h"
+-#include "account.h"
+-
+-namespace OCC {
+-
+-Q_LOGGING_CATEGORY(lcWizardWebiewPage, "gui.wizard.webviewpage", QtInfoMsg)
+-
+-
+-WebViewPage::WebViewPage(QWidget *parent)
+- : AbstractCredentialsWizardPage()
+-{
+- _ocWizard = qobject_cast<OwncloudWizard *>(parent);
+-
+- qCInfo(lcWizardWebiewPage()) << "Time for a webview!";
+- _webView = new WebView(this);
+-
+- QVBoxLayout *layout = new QVBoxLayout(this);
+- layout->addWidget(_webView);
+- setLayout(layout);
+-
+- connect(_webView, &WebView::urlCatched, this, &WebViewPage::urlCatched);
+-}
+-
+-void WebViewPage::initializePage() {
+- QString url;
+- if (_ocWizard->registration()) {
+- url = "https://nextcloud.com/register";
+- } else {
+- url = _ocWizard->ocUrl();
+- url += "/index.php/login/flow";
+- }
+- qCInfo(lcWizardWebiewPage()) << "Url to auth at: " << url;
+- _webView->setUrl(QUrl(url));
+-}
+-
+-int WebViewPage::nextId() const {
+- return WizardCommon::Page_AdvancedSetup;
+-}
+-
+-bool WebViewPage::isComplete() const {
+- return false;
+-}
+-
+-AbstractCredentials* WebViewPage::getCredentials() const {
+- return new WebFlowCredentials(_user, _pass, _ocWizard->_clientSslCertificate, _ocWizard->_clientSslKey);
+-}
+-
+-void WebViewPage::setConnected() {
+- qCInfo(lcWizardWebiewPage()) << "YAY! we are connected!";
+-}
+-
+-void WebViewPage::urlCatched(QString user, QString pass, QString host) {
+- qCInfo(lcWizardWebiewPage()) << "Got user: " << user << ", server: " << host;
+-
+- _user = user;
+- _pass = pass;
+-
+- AccountPtr account = _ocWizard->account();
+- account->setUrl(host);
+-
+- qCInfo(lcWizardWebiewPage()) << "URL: " << field("OCUrl").toString();
+- emit connectToOCUrl(host);
+-}
+-
+-}
+--- desktop-2.5.0-beta2/src/gui/wizard/webview.h 2018-08-24 12:54:42.000000000 +0000
++++ /dev/null 2018-10-03 06:11:27.640255322 +0000
+@@ -1,42 +0,0 @@
+-#ifndef WEBVIEW_H
+-#define WEBVIEW_H
+-
+-#include <QUrl>
+-#include <QWidget>
+-
+-#include "ui_webview.h"
+-
+-class QWebEngineView;
+-class QWebEngineProfile;
+-class QWebEnginePage;
+-
+-namespace OCC {
+-
+-class WebViewPageUrlRequestInterceptor;
+-class WebViewPageUrlSchemeHandler;
+-class WebEnginePage;
+-
+-class WebView : public QWidget
+-{
+- Q_OBJECT
+-public:
+- WebView(QWidget *parent = 0);
+- void setUrl(const QUrl &url);
+-
+-signals:
+- void urlCatched(const QString user, const QString pass, const QString host);
+-
+-private:
+- Ui_WebView _ui;
+-
+- QWebEngineView *_webview;
+- QWebEngineProfile *_profile;
+- WebEnginePage *_page;
+-
+- WebViewPageUrlRequestInterceptor *_interceptor;
+- WebViewPageUrlSchemeHandler *_schemeHandler;
+-};
+-
+-}
+-
+-#endif // WEBVIEW_H
+--- desktop-2.5.0-beta1/src/gui/wizard/webviewpage.h 2018-08-02 16:32:56.000000000 -0400
++++ /dev/null 2018-08-15 19:25:56.010611692 -0400
+@@ -1,41 +0,0 @@
+-#ifndef WEBVIEWPAGE_H
+-#define WEBVIEWPAGE_H
+-
+-#include "wizard/abstractcredswizardpage.h"
+-
+-namespace OCC {
+-
+-class AbstractCredentials;
+-class OwncloudWizard;
+-class WebView;
+-
+-class WebViewPage : public AbstractCredentialsWizardPage
+-{
+- Q_OBJECT
+-public:
+- WebViewPage(QWidget *parent = 0);
+-
+- void initializePage() Q_DECL_OVERRIDE;
+- int nextId() const Q_DECL_OVERRIDE;
+- bool isComplete() const;
+-
+- AbstractCredentials* getCredentials() const;
+- void setConnected();
+-
+-signals:
+- void connectToOCUrl(const QString&);
+-
+-private slots:
+- void urlCatched(QString user, QString pass, QString host);
+-
+-private:
+- OwncloudWizard *_ocWizard;
+- WebView *_webView;
+-
+- QString _user;
+- QString _pass;
+-};
+-
+-}
+-
+-#endif // WEBVIEWPAGE_H
+--- desktop-2.5.0-beta1/src/gui/wizard/owncloudsetuppage.cpp 2018-08-02 16:32:56.000000000 -0400
++++ desktop-2.5.0-beta1/src/gui/wizard/owncloudsetuppage.cpp 2018-08-15 19:23:33.100609136 -0400
+@@ -161,7 +161,7 @@
+ void OwncloudSetupPage::slotGotoProviderList()
+ {
+ _ocWizard->setRegistration(true);
+- _ocWizard->setAuthType(DetermineAuthTypeJob::AuthType::WebViewFlow);
++ _ocWizard->setAuthType(DetermineAuthTypeJob::AuthType::Basic);
+ _authTypeKnown = true;
+ _checking = false;
+ emit completeChanged();
+@@ -278,8 +278,6 @@
+ return WizardCommon::Page_OAuthCreds;
+ case DetermineAuthTypeJob::Shibboleth:
+ return WizardCommon::Page_ShibbolethCreds;
+- case DetermineAuthTypeJob::WebViewFlow:
+- return WizardCommon::Page_WebView;
+ }
+ return WizardCommon::Page_HttpCreds;
+ }
+--- desktop-2.5.0-beta1/src/gui/wizard/webview.ui 2018-08-02 16:32:56.000000000 -0400
++++ /dev/null 2018-08-15 19:24:43.320610392 -0400
+@@ -1,80 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<ui version="4.0">
+- <class>WebView</class>
+- <widget class="QWidget" name="WebView">
+- <property name="geometry">
+- <rect>
+- <x>0</x>
+- <y>0</y>
+- <width>800</width>
+- <height>700</height>
+- </rect>
+- </property>
+- <property name="sizePolicy">
+- <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
+- <horstretch>0</horstretch>
+- <verstretch>0</verstretch>
+- </sizepolicy>
+- </property>
+- <property name="minimumSize">
+- <size>
+- <width>800</width>
+- <height>650</height>
+- </size>
+- </property>
+- <property name="windowTitle">
+- <string>Form</string>
+- </property>
+- <layout class="QGridLayout" name="gridLayout">
+- <property name="leftMargin">
+- <number>0</number>
+- </property>
+- <property name="topMargin">
+- <number>0</number>
+- </property>
+- <property name="rightMargin">
+- <number>0</number>
+- </property>
+- <property name="bottomMargin">
+- <number>0</number>
+- </property>
+- <item row="1" column="0">
+- <layout class="QVBoxLayout" name="verticalLayout">
+- <property name="spacing">
+- <number>0</number>
+- </property>
+- <item>
+- <widget class="QProgressBar" name="progressBar">
+- <property name="maximumSize">
+- <size>
+- <width>16777215</width>
+- <height>5</height>
+- </size>
+- </property>
+- <property name="styleSheet">
+- <string notr="true">QProgressBar::chunk {
+- background-color: rgba(0, 130, 201, 255);
+-}</string>
+- </property>
+- <property name="value">
+- <number>0</number>
+- </property>
+- <property name="textVisible">
+- <bool>false</bool>
+- </property>
+- </widget>
+- </item>
+- <item>
+- <layout class="QHBoxLayout" name="resultLayout">
+- <property name="spacing">
+- <number>0</number>
+- </property>
+- </layout>
+- </item>
+- </layout>
+- </item>
+- </layout>
+- </widget>
+- <resources/>
+- <connections/>
+-</ui>
+--- desktop-2.5.0-beta1/src/gui/wizard/owncloudwizard.h 2018-08-02 16:32:56.000000000 -0400
++++ desktop-2.5.0-beta1/src/gui/wizard/owncloudwizard.h 2018-08-15 19:22:00.430607478 -0400
+@@ -39,7 +39,6 @@
+ class OwncloudWizardResultPage;
+ class AbstractCredentials;
+ class AbstractCredentialsWizardPage;
+-class WebViewPage;
+
+ /**
+ * @brief The OwncloudWizard class
+@@ -106,7 +105,6 @@
+ OwncloudAdvancedSetupPage *_advancedSetupPage;
+ OwncloudWizardResultPage *_resultPage;
+ AbstractCredentialsWizardPage *_credentialsPage;
+- WebViewPage *_webViewPage;
+
+ QStringList _setupLog;
+
+--- desktop-2.5.0-beta1/src/gui/wizard/owncloudwizard.cpp 2018-08-02 16:32:56.000000000 -0400
++++ desktop-2.5.0-beta1/src/gui/wizard/owncloudwizard.cpp 2018-08-15 19:04:35.670588788 -0400
+@@ -26,7 +26,6 @@
+ #endif
+ #include "wizard/owncloudadvancedsetuppage.h"
+ #include "wizard/owncloudwizardresultpage.h"
+-#include "wizard/webviewpage.h"
+
+ #include "QProgressIndicator.h"
+
+@@ -51,7 +50,6 @@
+ , _advancedSetupPage(new OwncloudAdvancedSetupPage)
+ , _resultPage(new OwncloudWizardResultPage)
+ , _credentialsPage(0)
+- , _webViewPage(new WebViewPage(this))
+ , _setupLog()
+ , _registration(false)
+ {
+@@ -64,7 +62,6 @@
+ #endif
+ setPage(WizardCommon::Page_AdvancedSetup, _advancedSetupPage);
+ setPage(WizardCommon::Page_Result, _resultPage);
+- setPage(WizardCommon::Page_WebView, _webViewPage);
+
+ connect(this, &QDialog::finished, this, &OwncloudWizard::basicSetupFinished);
+
+@@ -79,7 +76,6 @@
+ #ifndef NO_SHIBBOLETH
+ connect(_shibbolethCredsPage, &OwncloudShibbolethCredsPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
+ #endif
+- connect(_webViewPage, &WebViewPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
+ connect(_advancedSetupPage, &OwncloudAdvancedSetupPage::createLocalAndRemoteFolders,
+ this, &OwncloudWizard::createLocalAndRemoteFolders);
+ connect(this, &QWizard::customButtonClicked, this, &OwncloudWizard::skipFolderConfiguration);
+@@ -168,10 +164,6 @@
+ break;
+ #endif
+
+- case WizardCommon::Page_WebView:
+- _webViewPage->setConnected();
+- break;
+-
+ case WizardCommon::Page_AdvancedSetup:
+ _advancedSetupPage->directoriesCreated();
+ break;
+@@ -195,8 +187,6 @@
+ #endif
+ if (type == DetermineAuthTypeJob::OAuth) {
+ _credentialsPage = _browserCredsPage;
+- } else if (type == DetermineAuthTypeJob::WebViewFlow) {
+- _credentialsPage = _webViewPage;
+ } else { // try Basic auth even for "Unknown"
+ _credentialsPage = _httpCredsPage;
+ }
+--- desktop-2.5.0-beta1/src/CMakeLists.txt 2018-08-02 16:32:56.000000000 -0400
++++ desktop-2.5.0-beta1/src/CMakeLists.txt 2018-08-15 20:59:59.390712646 -0400
+@@ -4,7 +4,7 @@
+
+ set(synclib_NAME ${APPLICATION_EXECUTABLE}sync)
+
+-find_package(Qt5 5.6 COMPONENTS Core Network Xml Concurrent WebEngineWidgets WebEngine REQUIRED)
++find_package(Qt5 5.6 COMPONENTS Core Network Xml Concurrent REQUIRED)
+ if (Qt5Core_VERSION VERSION_LESS 5.9.0)
+ message(STATUS "For HTTP/2 support, compile with Qt 5.9 or higher.")
+ endif()
diff --git a/user/nextcloud-client/openssl.patch b/user/nextcloud-client/openssl.patch
new file mode 100644
index 000000000..426fa0cfb
--- /dev/null
+++ b/user/nextcloud-client/openssl.patch
@@ -0,0 +1,11 @@
+--- desktop-2.5.0-beta2/CMakeLists.txt 2018-08-24 12:54:42.000000000 +0000
++++ desktop-2.5.0-beta2/CMakeLists.txt 2018-10-03 06:19:15.840263697 +0000
+@@ -183,7 +183,7 @@ if(BUILD_CLIENT)
+ endif()
+ find_package(Sphinx)
+ find_package(PdfLatex)
+- find_package(OpenSSL 1.1 REQUIRED )
++ find_package(OpenSSL 1.0 REQUIRED )
+
+ find_package(ZLIB REQUIRED)
+ find_package(GLib2)