[Pkg-owncloud-commits] [owncloud-client] 41/70: CookieJar refactoring required to overcome issues in Shibboleth support
Sandro Knauß
hefee-guest at moszumanska.debian.org
Sat May 17 20:01:29 UTC 2014
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit ba959f7cf92542618b884ac6be49651d083c675c
Author: Daniel Molkentin <danimo at owncloud.com>
Date: Wed May 14 11:11:45 2014 +0200
CookieJar refactoring required to overcome issues in Shibboleth support
The shibboleth implementation no longer maintains its own QNAM.
Instead, MirallAccessManager now holds a custom QNAM implementation
which saves cookies to a file on disk.
This patch also reduces some complexity wrt the browser window,
which used to be deleted via a roundtrip to its callee, which
is not longer required.
Fixes #1764 and Enterprise bug #165
Going forward, AbstractCredentials::getQNAM() could maybe removed entirely.
---
src/CMakeLists.txt | 4 +-
src/creds/shibboleth/shibbolethaccessmanager.cpp | 55 --------
src/creds/shibboleth/shibbolethaccessmanager.h | 43 -------
src/creds/shibboleth/shibbolethconfigfile.cpp | 104 ---------------
src/creds/shibboleth/shibbolethconfigfile.h | 38 ------
src/creds/shibboleth/shibbolethcookiejar.cpp | 34 -----
src/creds/shibboleth/shibbolethcookiejar.h | 41 ------
src/creds/shibboleth/shibbolethwebview.cpp | 74 ++++-------
src/creds/shibboleth/shibbolethwebview.h | 6 +-
src/creds/shibbolethcredentials.cpp | 153 +++++++++++------------
src/creds/shibbolethcredentials.h | 19 +--
src/mirall/account.cpp | 17 ++-
src/mirall/account.h | 3 +
src/mirall/application.cpp | 1 +
src/mirall/cookiejar.cpp | 148 ++++++++++++++++++++++
src/mirall/cookiejar.h | 44 +++++++
src/mirall/mirallaccessmanager.cpp | 3 +
src/wizard/owncloudshibbolethcredspage.cpp | 58 +--------
src/wizard/owncloudshibbolethcredspage.h | 9 +-
19 files changed, 336 insertions(+), 518 deletions(-)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3085c10..669854f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -104,6 +104,7 @@ set(libsync_SRCS
mirall/quotainfo.cpp
mirall/clientproxy.cpp
mirall/syncrunfilelog.cpp
+ mirall/cookiejar.cpp
creds/dummycredentials.cpp
creds/abstractcredentials.cpp
creds/credentialsfactory.cpp
@@ -121,11 +122,8 @@ else()
${libsync_SRCS}
creds/httpcredentials.cpp
creds/shibbolethcredentials.cpp
- creds/shibboleth/shibbolethaccessmanager.cpp
- creds/shibboleth/shibbolethcookiejar.cpp
creds/shibboleth/shibbolethwebview.cpp
creds/shibboleth/shibbolethrefresher.cpp
- creds/shibboleth/shibbolethconfigfile.cpp
creds/shibboleth/authenticationdialog.cpp
creds/shibboleth/shibbolethuserjob.cpp
)
diff --git a/src/creds/shibboleth/shibbolethaccessmanager.cpp b/src/creds/shibboleth/shibbolethaccessmanager.cpp
deleted file mode 100644
index 451115c..0000000
--- a/src/creds/shibboleth/shibbolethaccessmanager.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) by Krzesimir Nowak <krzesimir at endocode.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-
-#include <QDebug>
-#include <QNetworkRequest>
-#include <QNetworkCookieJar>
-
-#include "creds/shibboleth/shibbolethaccessmanager.h"
-
-namespace Mirall
-{
-
-ShibbolethAccessManager::ShibbolethAccessManager(const QNetworkCookie& cookie, QObject* parent)
- : MirallAccessManager (parent),
- _cookie(cookie)
-{}
-
-QNetworkReply* ShibbolethAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest& request, QIODevice* outgoingData)
-{
- if (!_cookie.name().isEmpty()) {
- QNetworkCookieJar* jar(cookieJar());
- QUrl url(request.url());
- QList<QNetworkCookie> cookies;
- Q_FOREACH(const QNetworkCookie& cookie, jar->cookiesForUrl(url)) {
- if (!cookie.name().startsWith("_shibsession_")) {
- cookies << cookie;
- }
- }
-
- cookies << _cookie; // this line and the line above replace all cookies with self and then add the shibboleth cookie (filtering the current shib cookie)
- jar->setCookiesFromUrl(cookies, url);
- }
-
- qDebug() << "Creating a request to " << request.url().toString() << " with shibboleth cookie:" << _cookie.name();
-
- return MirallAccessManager::createRequest (op, request, outgoingData);
-}
-
-void ShibbolethAccessManager::setCookie(const QNetworkCookie& cookie)
-{
- qDebug() << "Got new shibboleth cookie:" << cookie.name();
- _cookie = cookie;
-}
-
-} // ns Mirall
diff --git a/src/creds/shibboleth/shibbolethaccessmanager.h b/src/creds/shibboleth/shibbolethaccessmanager.h
deleted file mode 100644
index e6ee4d2..0000000
--- a/src/creds/shibboleth/shibbolethaccessmanager.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) by Krzesimir Nowak <krzesimir at endocode.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-
-#ifndef MIRALL_WIZARD_SHIBBOLETH_ACCESS_MANAGER_H
-#define MIRALL_WIZARD_SHIBBOLETH_ACCESS_MANAGER_H
-
-#include <QNetworkCookie>
-
-#include "mirall/mirallaccessmanager.h"
-
-namespace Mirall
-{
-
-class ShibbolethAccessManager : public MirallAccessManager
-{
- Q_OBJECT
-
-public:
- ShibbolethAccessManager(const QNetworkCookie& cookie, QObject* parent = 0);
-
-public Q_SLOTS:
- void setCookie(const QNetworkCookie& cookie);
-
-protected:
- QNetworkReply* createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest& request, QIODevice* outgoingData = 0);
-
-private:
- QNetworkCookie _cookie;
-};
-
-} // ns Mirall
-
-#endif
diff --git a/src/creds/shibboleth/shibbolethconfigfile.cpp b/src/creds/shibboleth/shibbolethconfigfile.cpp
deleted file mode 100644
index fa24bef..0000000
--- a/src/creds/shibboleth/shibbolethconfigfile.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) by Krzesimir Nowak <krzesimir at endocode.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-
-#include <QDebug>
-#include <QTextStream>
-
-#include "creds/shibboleth/shibbolethconfigfile.h"
-#include "creds/shibboleth/shibbolethcookiejar.h"
-
-namespace Mirall
-{
-
-namespace
-{
-
-const char otherCookiesC[] = "otherCookies";
-
-} // ns
-
-void ShibbolethConfigFile::storeCookies(const QMap<QUrl, QList<QNetworkCookie> >& cookiesForUrl)
-{
- if (cookiesForUrl.isEmpty()) {
- removeData(QString(), QString::fromLatin1(otherCookiesC));
- } else {
- QByteArray data;
- QTextStream stream(&data);
-
- Q_FOREACH (const QUrl& url, cookiesForUrl.keys()) {
- const QList<QNetworkCookie>& cookies(cookiesForUrl[url]);
-
- if (cookies.isEmpty()) {
- continue;
- }
- stream << "URL: " << url.toString().toUtf8() << "\n";
- qDebug() << "URL: " << url.toString().toUtf8();
-
- Q_FOREACH (const QNetworkCookie& cookie, cookies) {
- stream << cookie.toRawForm(QNetworkCookie::NameAndValueOnly) << "\n";
- qDebug() << cookie.toRawForm(QNetworkCookie::NameAndValueOnly);
- }
- }
-
- stream.flush();
-
- const QByteArray encodedCookies(data.toBase64());
-
- qDebug() << "Raw cookies:\n" << data;
- qDebug() << "Encoded cookies: " << encodedCookies;
-
- storeData(QString(), QString::fromLatin1(otherCookiesC), QVariant(encodedCookies));
- }
-}
-
-ShibbolethCookieJar* ShibbolethConfigFile::createCookieJar() const
-{
- ShibbolethCookieJar* jar = new ShibbolethCookieJar();
- const QVariant variant(retrieveData(QString(), QString::fromLatin1(otherCookiesC)));
-
- if (variant.isValid()) {
- QByteArray data(QByteArray::fromBase64(variant.toByteArray()));
- QTextStream stream (&data);
- const QString urlHeader(QString::fromLatin1("URL: "));
- QUrl currentUrl;
- QList<QNetworkCookie> currentCookies;
-
- qDebug() << "Got valid cookies variant: " << data;
-
- while (!stream.atEnd()) {
- const QString line(stream.readLine());
-
- qDebug() << line;
-
- if (line.startsWith(urlHeader)) {
- if (!currentUrl.isEmpty() && !currentCookies.isEmpty()) {
- jar->setCookiesFromUrl(currentCookies, currentUrl);
- currentCookies.clear();
- currentUrl.clear();
- }
- currentUrl = QUrl(line.mid(5));
- } else if (!currentUrl.isEmpty()) {
- const int equalPos(line.indexOf('='));
-
- currentCookies << QNetworkCookie(line.left(equalPos).toUtf8(), line.mid(equalPos + 1).toUtf8());
- }
- }
- if (!currentUrl.isEmpty() && !currentCookies.isEmpty()) {
- jar->setCookiesFromUrl(currentCookies, currentUrl);
- }
- }
-
- return jar;
-}
-
-} // ns Mirall
diff --git a/src/creds/shibboleth/shibbolethconfigfile.h b/src/creds/shibboleth/shibbolethconfigfile.h
deleted file mode 100644
index 2efc0f7..0000000
--- a/src/creds/shibboleth/shibbolethconfigfile.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) by Krzesimir Nowak <krzesimir at endocode.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-
-#ifndef MIRALL_CREDS_SHIBBOLETH_CONFIG_FILE_H
-#define MIRALL_CREDS_SHIBBOLETH_CONFIG_FILE_H
-
-#include <QList>
-#include <QMap>
-#include <QNetworkCookie>
-#include <QUrl>
-
-#include "mirall/mirallconfigfile.h"
-
-namespace Mirall
-{
-
-class ShibbolethCookieJar;
-
-class ShibbolethConfigFile : public MirallConfigFile
-{
-public:
- void storeCookies(const QMap<QUrl, QList<QNetworkCookie> >& cookies);
- ShibbolethCookieJar* createCookieJar() const;
-};
-
-} // ns Mirall
-
-#endif
diff --git a/src/creds/shibboleth/shibbolethcookiejar.cpp b/src/creds/shibboleth/shibbolethcookiejar.cpp
deleted file mode 100644
index ad86d6c..0000000
--- a/src/creds/shibboleth/shibbolethcookiejar.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) by Krzesimir Nowak <krzesimir at endocode.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-
-#include "creds/shibboleth/shibbolethcookiejar.h"
-
-namespace Mirall
-{
-
-ShibbolethCookieJar::ShibbolethCookieJar (QObject* parent)
- : QNetworkCookieJar (parent)
-{}
-
-bool ShibbolethCookieJar::setCookiesFromUrl (const QList<QNetworkCookie>& cookieList, const QUrl& url)
-{
- if (QNetworkCookieJar::setCookiesFromUrl (cookieList, url)) {
- Q_EMIT newCookiesForUrl (cookieList, url);
-
- return true;
- }
-
- return false;
-}
-
-} // ns Mirall
diff --git a/src/creds/shibboleth/shibbolethcookiejar.h b/src/creds/shibboleth/shibbolethcookiejar.h
deleted file mode 100644
index 4e4459b..0000000
--- a/src/creds/shibboleth/shibbolethcookiejar.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) by Krzesimir Nowak <krzesimir at endocode.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-
-#ifndef MIRALL_WIZARD_SHIBBOLETH_COOKIE_JAR_H
-#define MIRALL_WIZARD_SHIBBOLETH_COOKIE_JAR_H
-
-#include <QNetworkCookieJar>
-#include <QList>
-
-class QUrl;
-class QNetworkCookie;
-
-namespace Mirall
-{
-
-class ShibbolethCookieJar : public QNetworkCookieJar
-{
- Q_OBJECT
-
-public:
- ShibbolethCookieJar (QObject* parent = 0);
-
- virtual bool setCookiesFromUrl (const QList<QNetworkCookie>& cookieList, const QUrl& url);
-
-Q_SIGNALS:
- void newCookiesForUrl (const QList<QNetworkCookie>& cookieList, const QUrl& url);
-};
-
-} // ns Mirall
-
-#endif
diff --git a/src/creds/shibboleth/shibbolethwebview.cpp b/src/creds/shibboleth/shibbolethwebview.cpp
index b8e8e7e..d33bed4 100644
--- a/src/creds/shibboleth/shibbolethwebview.cpp
+++ b/src/creds/shibboleth/shibbolethwebview.cpp
@@ -20,9 +20,9 @@
#include <QAuthenticator>
#include <QNetworkReply>
-#include "creds/shibboleth/shibbolethcookiejar.h"
-#include "creds/shibboleth/shibbolethwebview.h"
#include "creds/shibboleth/authenticationdialog.h"
+#include "creds/shibboleth/shibbolethwebview.h"
+#include "creds/shibbolethcredentials.h"
#include "mirall/account.h"
#include "mirall/mirallaccessmanager.h"
#include "mirall/theme.h"
@@ -30,80 +30,50 @@
namespace Mirall
{
-void ShibbolethWebView::setup(Account *account, ShibbolethCookieJar* jar)
+ShibbolethWebView::ShibbolethWebView(Account* account, QWidget* parent)
+ : QWebView(parent)
+ , _account(account)
{
- _account = account;
- MirallAccessManager* nm = new MirallAccessManager(this);
- // we need our own QNAM, but the we offload the SSL error handling to
- // the account object, which already can do this
- connect(nm, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
- account, SLOT(slotHandleErrors(QNetworkReply*,QList<QSslError>)));
- connect(nm, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
- SLOT(slotHandleAuthentication(QNetworkReply*,QAuthenticator*)));
-
+ // no minimize
+ setWindowFlags(Qt::Dialog);
+ setAttribute(Qt::WA_DeleteOnClose);
QWebPage* page = new QWebPage(this);
-
- jar->setParent(this);
- connect(jar, SIGNAL (newCookiesForUrl (QList<QNetworkCookie>, QUrl)),
- this, SLOT (onNewCookiesForUrl (QList<QNetworkCookie>, QUrl)));
+ page->setNetworkAccessManager(account->networkAccessManager());
connect(page, SIGNAL(loadStarted()),
this, SLOT(slotLoadStarted()));
connect(page, SIGNAL(loadFinished(bool)),
this, SLOT(slotLoadFinished(bool)));
- nm->setCookieJar(jar);
- page->setNetworkAccessManager(nm);
+
+ connect(page->networkAccessManager()->cookieJar(),
+ SIGNAL(newCookiesForUrl (QList<QNetworkCookie>, QUrl)),
+ this, SLOT(onNewCookiesForUrl (QList<QNetworkCookie>, QUrl)));
page->mainFrame()->load(account->url());
this->setPage(page);
setWindowTitle(tr("%1 - Authenticate").arg(Theme::instance()->appNameGUI()));
}
-ShibbolethWebView::ShibbolethWebView(Account* account, QWidget* parent)
- : QWebView(parent)
-{
- setup(account, new ShibbolethCookieJar(this));
-}
-
ShibbolethWebView::~ShibbolethWebView()
{
slotLoadFinished();
}
-ShibbolethWebView::ShibbolethWebView(Account* account, ShibbolethCookieJar* jar, QWidget* parent)
- : QWebView(parent)
-{
- setup(account, jar);
-}
-
void ShibbolethWebView::onNewCookiesForUrl (const QList<QNetworkCookie>& cookieList, const QUrl& url)
{
- QList<QNetworkCookie> otherCookies;
- QNetworkCookie shibCookie;
-
- Q_FOREACH (const QNetworkCookie& cookie, cookieList) {
- if (cookie.name().startsWith ("_shibsession_")) {
- if (shibCookie.name().isEmpty()) {
- shibCookie = cookie;
- } else {
- qWarning() << "Too many Shibboleth session cookies at once!";
- }
- } else {
- otherCookies << cookie;
+ qDebug() << "Received cookies for URL" << url << ":" << cookieList << ". Account object has URL" << _account->url();
+ if (url.host() == _account->url().host()) {
+ QNetworkCookie shibCookie = ShibbolethCredentials::findShibCookie(_account, cookieList);
+ if (shibCookie != QNetworkCookie()) {
+ Q_EMIT shibbolethCookieReceived(shibCookie, _account);
+ close();
+ }
}
- }
-
- if (!otherCookies.isEmpty()) {
- Q_EMIT otherCookiesReceived(otherCookies, url);
- }
- if (!shibCookie.name().isEmpty()) {
- Q_EMIT shibbolethCookieReceived(shibCookie, _account);
- }
}
-void ShibbolethWebView::hideEvent(QHideEvent* event)
+void ShibbolethWebView::closeEvent(QCloseEvent *event)
{
Q_EMIT viewHidden();
- QWebView::hideEvent(event);
+ QWebView::closeEvent(event);
}
void ShibbolethWebView::slotLoadStarted()
diff --git a/src/creds/shibboleth/shibbolethwebview.h b/src/creds/shibboleth/shibbolethwebview.h
index 5a988fe..eb0db63 100644
--- a/src/creds/shibboleth/shibbolethwebview.h
+++ b/src/creds/shibboleth/shibbolethwebview.h
@@ -37,13 +37,11 @@ public:
ShibbolethWebView(Account *account, ShibbolethCookieJar* jar, QWidget* parent = 0);
~ShibbolethWebView();
-protected:
- void hideEvent(QHideEvent* event);
+ void closeEvent(QCloseEvent *event);
Q_SIGNALS:
- void shibbolethCookieReceived(const QNetworkCookie& cookie, Account* account);
+ void shibbolethCookieReceived(const QNetworkCookie &cookie, Account *account);
void viewHidden();
- void otherCookiesReceived(const QList<QNetworkCookie>& cookieList, const QUrl& url);
private Q_SLOTS:
void onNewCookiesForUrl(const QList<QNetworkCookie>& cookieList, const QUrl& url);
diff --git a/src/creds/shibbolethcredentials.cpp b/src/creds/shibbolethcredentials.cpp
index fda7ab4..b074cd7 100644
--- a/src/creds/shibbolethcredentials.cpp
+++ b/src/creds/shibbolethcredentials.cpp
@@ -16,18 +16,19 @@
#include <QSettings>
#include <QNetworkReply>
#include <QMessageBox>
-#include <qdebug.h>
+#include <QDebug>
#include "creds/shibbolethcredentials.h"
-#include "creds/shibboleth/shibbolethaccessmanager.h"
#include "creds/shibboleth/shibbolethwebview.h"
#include "creds/shibboleth/shibbolethrefresher.h"
-#include "creds/shibboleth/shibbolethconfigfile.h"
+#include "creds/shibbolethcredentials.h"
#include "shibboleth/shibbolethuserjob.h"
#include "creds/credentialscommon.h"
+#include "mirall/mirallaccessmanager.h"
#include "mirall/account.h"
#include "mirall/theme.h"
+#include "mirall/cookiejar.h"
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#include <qt5keychain/keychain.h>
@@ -45,6 +46,7 @@ namespace
// Not "user" because it has a special meaning for http
const char userC[] = "shib_user";
+const char shibCookieNameC[] = "_shibsession_";
int shibboleth_redirect_callback(CSYNC* csync_ctx,
const char* uri)
@@ -66,7 +68,6 @@ int shibboleth_redirect_callback(CSYNC* csync_ctx,
Account *account = AccountManager::instance()->account();
ShibbolethCredentials* creds = qobject_cast<ShibbolethCredentials*>(account->credentials());
-
if (!creds) {
qDebug() << "Not a Shibboleth creds instance!";
return 1;
@@ -85,18 +86,9 @@ int shibboleth_redirect_callback(CSYNC* csync_ctx,
ShibbolethCredentials::ShibbolethCredentials()
: AbstractCredentials(),
_url(),
- _shibCookie(),
_ready(false),
_stillValid(false),
- _browser(0),
- _otherCookies()
-{}
-
-ShibbolethCredentials::ShibbolethCredentials(const QNetworkCookie& cookie, const QMap<QUrl, QList<QNetworkCookie> >& otherCookies)
- : _shibCookie(cookie),
- _ready(true),
- _browser(0),
- _otherCookies(otherCookies)
+ _browser(0)
{}
void ShibbolethCredentials::syncContextPreInit(CSYNC* ctx)
@@ -111,29 +103,11 @@ QByteArray ShibbolethCredentials::prepareCookieData() const
// have any way to get "session_key" module property from
// csync. Had we have it, then we could just append shibboleth
// cookies to the "session_key" value and set it in csync module.
- QList<QNetworkCookie> cookies(AccountManager::instance()->account()->lastAuthCookies());
- QMap<QString, QString> uniqueCookies;
-
- cookies << _shibCookie;
- // Stuff cookies inside csync, then we can avoid the intermediate HTTP 401 reply
- // when https://github.com/owncloud/core/pull/4042 is merged.
- foreach(QNetworkCookie c, cookies) {
- const QString cookieName(c.name());
-
- if (cookieName.startsWith("_shibsession_")) {
- continue;
- }
- uniqueCookies.insert(cookieName, c.value());
- }
+ Account *account = AccountManager::instance()->account();
+ QList<QNetworkCookie> cookies = accountCookies(account);
- if (!_shibCookie.name().isEmpty()) {
- uniqueCookies.insert(_shibCookie.name(), _shibCookie.value());
- }
- foreach(const QString& cookieName, uniqueCookies.keys()) {
- cookiesAsString += cookieName;
- cookiesAsString += '=';
- cookiesAsString += uniqueCookies[cookieName];
- cookiesAsString += "; ";
+ foreach(const QNetworkCookie &cookie, cookies) {
+ cookiesAsString += cookie.toRawForm(QNetworkCookie::NameAndValueOnly) + QLatin1String("; ");
}
return cookiesAsString.toLatin1();
@@ -153,7 +127,7 @@ bool ShibbolethCredentials::changed(AbstractCredentials* credentials) const
{
ShibbolethCredentials* other(dynamic_cast< ShibbolethCredentials* >(credentials));
- if (!other || other->cookie() != this->cookie()) {
+ if (_shibCookie != other->_shibCookie || _user != other->_user) {
return true;
}
@@ -170,17 +144,9 @@ QString ShibbolethCredentials::user() const
return _user;
}
-QNetworkCookie ShibbolethCredentials::cookie() const
-{
- return _shibCookie;
-}
-
QNetworkAccessManager* ShibbolethCredentials::getQNAM() const
{
- ShibbolethAccessManager* qnam(new ShibbolethAccessManager(_shibCookie));
-
- connect(this, SIGNAL(newCookie(QNetworkCookie)),
- qnam, SLOT(setCookie(QNetworkCookie)));
+ QNetworkAccessManager* qnam(new MirallAccessManager);
connect(qnam, SIGNAL(finished(QNetworkReply*)),
this, SLOT(slotReplyFinished(QNetworkReply*)));
return qnam;
@@ -231,44 +197,30 @@ bool ShibbolethCredentials::stillValid(QNetworkReply *reply)
void ShibbolethCredentials::persist(Account* account)
{
- ShibbolethConfigFile cfg;
-
- cfg.storeCookies(_otherCookies);
-
storeShibCookie(_shibCookie, account);
- if (!_user.isEmpty())
+ if (!_user.isEmpty()) {
account->setCredentialSetting(QLatin1String(userC), _user);
+ }
}
// only used by Application::slotLogout(). Use invalidateAndFetch for normal usage
void ShibbolethCredentials::invalidateToken(Account *account)
{
Q_UNUSED(account)
+ if (!removeFromCookieJar(_shibCookie)) {
+ qDebug() << "invalidateToken() called but no shibCookie in in cookie jar!";
+ }
+ removeShibCookie(account);
_shibCookie = QNetworkCookie();
- storeShibCookie(_shibCookie, account); // store/erase cookie
-
// ### access to ctx missing, but might not be required at all
//csync_set_module_property(ctx, "session_key", "");
}
-void ShibbolethCredentials::disposeBrowser()
+void ShibbolethCredentials::onShibbolethCookieReceived(const QNetworkCookie& shibCookie, Account *account)
{
- qDebug() << Q_FUNC_INFO;
- disconnect(_browser, SIGNAL(viewHidden()),
- this, SLOT(slotBrowserHidden()));
- disconnect(_browser, SIGNAL(shibbolethCookieReceived(QNetworkCookie, Account*)),
- this, SLOT(onShibbolethCookieReceived(QNetworkCookie, Account*)));
- _browser->hide();
- _browser->deleteLater();
- _browser = 0;
-}
-
-void ShibbolethCredentials::onShibbolethCookieReceived(const QNetworkCookie& cookie, Account* account)
-{
- disposeBrowser();
- _shibCookie = cookie;
- storeShibCookie(_shibCookie, account);
- Q_EMIT newCookie(_shibCookie);
+ storeShibCookie(shibCookie, account);
+ _shibCookie = shibCookie;
+ addToCookieJar(shibCookie);
// Now fetch the user...
// But we must first do a request to webdav so the session is enabled.
@@ -311,9 +263,7 @@ void ShibbolethCredentials::slotUserFetched(const QString &user)
void ShibbolethCredentials::slotBrowserHidden()
{
- disposeBrowser();
_ready = false;
- _shibCookie = QNetworkCookie();
Q_EMIT fetched();
}
@@ -356,16 +306,16 @@ void ShibbolethCredentials::slotReadJobDone(QKeychain::Job *job)
if (job->error() == QKeychain::NoError) {
ReadPasswordJob *readJob = static_cast<ReadPasswordJob*>(job);
delete readJob->settings();
- qDebug() << Q_FUNC_INFO;
QList<QNetworkCookie> cookies = QNetworkCookie::parseCookies(readJob->textData().toUtf8());
if (cookies.count() > 0) {
_shibCookie = cookies.first();
+ addToCookieJar(_shibCookie);
}
+ // access
job->setSettings(account->settingsWithGroup(Theme::instance()->appName(), job));
_ready = true;
_stillValid = true;
- Q_EMIT newCookie(_shibCookie);
Q_EMIT fetched();
} else {
showLoginWindow(account);
@@ -374,14 +324,13 @@ void ShibbolethCredentials::slotReadJobDone(QKeychain::Job *job)
void ShibbolethCredentials::showLoginWindow(Account* account)
{
- if (_browser) {
+ if (!_browser.isNull()) {
_browser->activateWindow();
_browser->raise();
// FIXME On OS X this does not raise properly
return;
}
- ShibbolethConfigFile cfg;
- _browser = new ShibbolethWebView(account, cfg.createCookieJar());
+ _browser = new ShibbolethWebView(account);
connect(_browser, SIGNAL(shibbolethCookieReceived(QNetworkCookie, Account*)),
this, SLOT(onShibbolethCookieReceived(QNetworkCookie, Account*)));
connect(_browser, SIGNAL(viewHidden()),
@@ -392,6 +341,30 @@ void ShibbolethCredentials::showLoginWindow(Account* account)
_browser->show();
}
+QList<QNetworkCookie> ShibbolethCredentials::accountCookies(Account *account)
+{
+ return account->networkAccessManager()->cookieJar()->cookiesForUrl(account->url());
+}
+
+QNetworkCookie ShibbolethCredentials::findShibCookie(Account *account, QList<QNetworkCookie> cookies)
+{
+ if(cookies.isEmpty()) {
+ cookies = accountCookies(account);
+ }
+
+ Q_FOREACH(QNetworkCookie cookie, cookies) {
+ if (cookie.name().startsWith(shibCookieNameC)) {
+ return cookie;
+ }
+ }
+ return QNetworkCookie();
+}
+
+QByteArray ShibbolethCredentials::shibCookieName()
+{
+ return QByteArray(shibCookieNameC);
+}
+
void ShibbolethCredentials::storeShibCookie(const QNetworkCookie &cookie, Account *account)
{
WritePasswordJob *job = new WritePasswordJob(Theme::instance()->appName());
@@ -403,5 +376,31 @@ void ShibbolethCredentials::storeShibCookie(const QNetworkCookie &cookie, Accoun
job->start();
}
+void ShibbolethCredentials::removeShibCookie(Account *account)
+{
+ DeletePasswordJob *job = new DeletePasswordJob(Theme::instance()->appName());
+ job->setSettings(account->settingsWithGroup(Theme::instance()->appName(), job));
+ job->setKey(keychainKey(account->url().toString(), "shibAssertion"));
+ job->start();
+}
+
+void ShibbolethCredentials::addToCookieJar(const QNetworkCookie &cookie)
+{
+ QList<QNetworkCookie> cookies;
+ cookies << cookie;
+ Account *account = AccountManager::instance()->account();
+ QNetworkCookieJar *jar = account->networkAccessManager()->cookieJar();
+ jar->blockSignals(true); // otherwise we'd call ourselves
+ jar->setCookiesFromUrl(cookies, account->url());
+ jar->blockSignals(false);
+}
+
+bool ShibbolethCredentials::removeFromCookieJar(const QNetworkCookie &cookie)
+{
+ Account *account = AccountManager::instance()->account();
+ CookieJar *jar = qobject_cast<CookieJar*>(account->networkAccessManager()->cookieJar());
+ return jar->deleteCookie(cookie);
+}
+
} // ns Mirall
diff --git a/src/creds/shibbolethcredentials.h b/src/creds/shibbolethcredentials.h
index 217f852..a8d5d72 100644
--- a/src/creds/shibbolethcredentials.h
+++ b/src/creds/shibbolethcredentials.h
@@ -18,6 +18,7 @@
#include <QMap>
#include <QNetworkCookie>
#include <QUrl>
+#include <QPointer>
#include "creds/abstractcredentials.h"
@@ -36,7 +37,6 @@ Q_OBJECT
public:
ShibbolethCredentials();
- ShibbolethCredentials(const QNetworkCookie& cookie, const QMap<QUrl, QList<QNetworkCookie> >& otherCookies);
void syncContextPreInit(CSYNC* ctx);
void syncContextPreStart(CSYNC* ctx);
@@ -50,15 +50,17 @@ public:
void persist(Account *account);
void invalidateToken(Account *account);
- QNetworkCookie cookie() const;
-
void showLoginWindow(Account*);
+ static QList<QNetworkCookie> accountCookies(Account*);
+ static QNetworkCookie findShibCookie(Account*, QList<QNetworkCookie> cookies = QList<QNetworkCookie>());
+ static QByteArray shibCookieName();
+
public Q_SLOTS:
void invalidateAndFetch(Account *account);
private Q_SLOTS:
- void onShibbolethCookieReceived(const QNetworkCookie& cookie, Account*);
+ void onShibbolethCookieReceived(const QNetworkCookie&, Account*);
void slotBrowserHidden();
void onFetched();
void slotReadJobDone(QKeychain::Job*);
@@ -73,15 +75,16 @@ Q_SIGNALS:
private:
void storeShibCookie(const QNetworkCookie &cookie, Account *account);
+ void removeShibCookie(Account *account);
+ void addToCookieJar(const QNetworkCookie &cookie);
+ bool removeFromCookieJar(const QNetworkCookie &cookie);
QUrl _url;
QByteArray prepareCookieData() const;
- void disposeBrowser();
- QNetworkCookie _shibCookie;
bool _ready;
bool _stillValid;
- ShibbolethWebView* _browser;
- QMap<QUrl, QList<QNetworkCookie> > _otherCookies;
+ QPointer<ShibbolethWebView> _browser;
+ QNetworkCookie _shibCookie;
QString _user;
};
diff --git a/src/mirall/account.cpp b/src/mirall/account.cpp
index f04c063..4e376d0 100644
--- a/src/mirall/account.cpp
+++ b/src/mirall/account.cpp
@@ -12,9 +12,11 @@
*/
#include "mirall/account.h"
+#include "mirall/cookiejar.h"
#include "mirall/theme.h"
#include "mirall/networkjobs.h"
#include "mirall/mirallconfigfile.h"
+#include "mirall/mirallaccessmanager.h"
#include "mirall/quotainfo.h"
#include "creds/abstractcredentials.h"
#include "creds/credentialsfactory.h"
@@ -75,6 +77,7 @@ Account::Account(AbstractSslErrorHandler *sslErrorHandler, QObject *parent)
Account::~Account()
{
+ delete _am;
}
void Account::save()
@@ -161,7 +164,11 @@ AbstractCredentials *Account::credentials() const
void Account::setCredentials(AbstractCredentials *cred)
{
// set active credential manager
+ QNetworkCookieJar *jar = 0;
if (_am) {
+ jar = _am->cookieJar();
+ jar->setParent(0);
+
_am->deleteLater();
}
@@ -170,6 +177,9 @@ void Account::setCredentials(AbstractCredentials *cred)
}
_credentials = cred;
_am = _credentials->getQNAM();
+ if (jar) {
+ _am->setCookieJar(jar);
+ }
connect(_am, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
SLOT(slotHandleErrors(QNetworkReply*,QList<QSslError>)));
}
@@ -186,7 +196,12 @@ QList<QNetworkCookie> Account::lastAuthCookies() const
void Account::clearCookieJar()
{
- _am->setCookieJar(new QNetworkCookieJar);
+ _am->setCookieJar(new CookieJar);
+}
+
+QNetworkAccessManager *Account::networkAccessManager()
+{
+ return _am;
}
QNetworkReply *Account::headRequest(const QString &relPath)
diff --git a/src/mirall/account.h b/src/mirall/account.h
index 32f19e6..d782a74 100644
--- a/src/mirall/account.h
+++ b/src/mirall/account.h
@@ -34,6 +34,7 @@ namespace Mirall {
class AbstractCredentials;
class Account;
class QuotaInfo;
+class MirallAccessManager;
class OWNCLOUDSYNC_EXPORT AccountManager : public QObject {
Q_OBJECT
@@ -143,6 +144,8 @@ public:
void clearCookieJar();
+ QNetworkAccessManager* networkAccessManager();
+
QuotaInfo *quotaInfo();
signals:
void stateChanged(int state);
diff --git a/src/mirall/application.cpp b/src/mirall/application.cpp
index aa1ed30..9f16e5b 100644
--- a/src/mirall/application.cpp
+++ b/src/mirall/application.cpp
@@ -159,6 +159,7 @@ Application::Application(int &argc, char **argv) :
Application::~Application()
{
+ delete AccountManager::instance()->account();
// qDebug() << "* Mirall shutdown";
}
diff --git a/src/mirall/cookiejar.cpp b/src/mirall/cookiejar.cpp
new file mode 100644
index 0000000..49f8b64
--- /dev/null
+++ b/src/mirall/cookiejar.cpp
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) by Daniel Molkentin <danimo at owncloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include "cookiejar.h"
+
+#include "mirall/mirallconfigfile.h"
+
+#include <QDebug>
+#include <QFile>
+#include <QDateTime>
+
+namespace Mirall {
+
+namespace {
+ const unsigned int JAR_VERSION = 23;
+}
+
+QDataStream &operator<<(QDataStream &stream, const QList<QNetworkCookie> &list)
+{
+ stream << JAR_VERSION;
+ stream << quint32(list.size());
+ for (int i = 0; i < list.size(); ++i)
+ stream << list.at(i).toRawForm();
+ return stream;
+}
+
+QDataStream &operator>>(QDataStream &stream, QList<QNetworkCookie> &list)
+{
+ list.clear();
+
+ quint32 version;
+ stream >> version;
+
+ if (version != JAR_VERSION)
+ return stream;
+
+ quint32 count;
+ stream >> count;
+ for(quint32 i = 0; i < count; ++i)
+ {
+ QByteArray value;
+ stream >> value;
+ QList<QNetworkCookie> newCookies = QNetworkCookie::parseCookies(value);
+ if (newCookies.count() == 0 && value.length() != 0) {
+ qWarning() << "CookieJar: Unable to parse saved cookie:" << value;
+ }
+ for (int j = 0; j < newCookies.count(); ++j)
+ list.append(newCookies.at(j));
+ if (stream.atEnd())
+ break;
+ }
+ return stream;
+}
+
+CookieJar::CookieJar(QObject *parent) :
+ QNetworkCookieJar(parent)
+{
+ restore();
+}
+
+CookieJar::~CookieJar()
+{
+ save();
+}
+
+bool CookieJar::setCookiesFromUrl(const QList<QNetworkCookie>& cookieList, const QUrl& url)
+{
+ if (QNetworkCookieJar::setCookiesFromUrl(cookieList, url)) {
+ Q_EMIT newCookiesForUrl(cookieList, url);
+ return true;
+ }
+
+ return false;
+}
+
+QList<QNetworkCookie> CookieJar::cookiesForUrl(const QUrl &url)
+{
+ QList<QNetworkCookie> cookies = QNetworkCookieJar::cookiesForUrl(url);
+ qDebug() << url << "requests:" << cookies;
+ return cookies;
+}
+
+bool CookieJar::deleteCookie(const QNetworkCookie &delCookie)
+{
+ QList<QNetworkCookie> cookies = allCookies();
+ bool removeSucceeded = false;
+ foreach(const QNetworkCookie &cookie, cookies) {
+ // ### cookies are not identical in attriutes, why?
+ if (cookie.name() == delCookie.name()) {
+ cookies.removeOne(cookie);
+ removeSucceeded = true;
+ }
+ }
+ setAllCookies(cookies);
+ return removeSucceeded;
+}
+
+void CookieJar::save()
+{
+ QFile file;
+ file.setFileName(storagePath());
+ qDebug() << storagePath();
+ file.open(QIODevice::WriteOnly);
+ QDataStream stream(&file);
+ stream << allCookies();
+ file.close();
+}
+
+void CookieJar::restore()
+{
+ QFile file;
+ file.setFileName(storagePath());
+ file.open(QIODevice::ReadOnly);
+ QDataStream stream(&file);
+ QList<QNetworkCookie> list;
+ stream >> list;
+ setAllCookies(removeExpired(list));
+ file.close();
+}
+
+QList<QNetworkCookie> CookieJar::removeExpired(const QList<QNetworkCookie> &cookies)
+{
+ QList<QNetworkCookie> updatedList;
+ foreach(const QNetworkCookie &cookie, cookies) {
+ if (cookie.expirationDate() > QDateTime::currentDateTime()) {
+ updatedList << cookie;
+ }
+ }
+ return updatedList;
+}
+
+QString CookieJar::storagePath() const
+{
+ MirallConfigFile cfg;
+ return cfg.configPath() + "/cookies.db";
+}
+
+} // namespace Mirall
diff --git a/src/mirall/cookiejar.h b/src/mirall/cookiejar.h
new file mode 100644
index 0000000..2c7959b
--- /dev/null
+++ b/src/mirall/cookiejar.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) by Daniel Molkentin <danimo at owncloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#ifndef MIRALL_COOKIEJAR_H
+#define MIRALL_COOKIEJAR_H
+
+#include <QNetworkCookieJar>
+
+namespace Mirall {
+
+class CookieJar : public QNetworkCookieJar
+{
+ Q_OBJECT
+public:
+ explicit CookieJar(QObject *parent = 0);
+ ~CookieJar();
+ bool setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url);
+ QList<QNetworkCookie> cookiesForUrl(const QUrl &url);
+
+ virtual bool deleteCookie(const QNetworkCookie & cookie);
+
+signals:
+ void newCookiesForUrl(const QList<QNetworkCookie>& cookieList, const QUrl& url);
+private:
+ void save();
+ void restore();
+ QList<QNetworkCookie> removeExpired(const QList<QNetworkCookie> &cookies);
+ QString storagePath() const;
+
+};
+
+} // namespace Mirall
+
+#endif // MIRALL_COOKIEJAR_H
diff --git a/src/mirall/mirallaccessmanager.cpp b/src/mirall/mirallaccessmanager.cpp
index de0322b..08de692 100644
--- a/src/mirall/mirallaccessmanager.cpp
+++ b/src/mirall/mirallaccessmanager.cpp
@@ -15,6 +15,7 @@
#include <QNetworkProxy>
#include <QAuthenticator>
+#include "mirall/cookiejar.h"
#include "mirall/mirallaccessmanager.h"
#include "mirall/utility.h"
@@ -30,6 +31,8 @@ MirallAccessManager::MirallAccessManager(QObject* parent)
proxy.setHostName(" ");
setProxy(proxy);
#endif
+ setCookieJar(new CookieJar);
+ cookieJar()->setParent(0);
QObject::connect(this, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
this, SLOT(slotProxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
}
diff --git a/src/wizard/owncloudshibbolethcredspage.cpp b/src/wizard/owncloudshibbolethcredspage.cpp
index a71417c..10d8639 100644
--- a/src/wizard/owncloudshibbolethcredspage.cpp
+++ b/src/wizard/owncloudshibbolethcredspage.cpp
@@ -26,24 +26,20 @@ namespace Mirall
OwncloudShibbolethCredsPage::OwncloudShibbolethCredsPage()
: AbstractCredentialsWizardPage(),
_browser(0),
- _cookie(),
- _afterInitialSetup(false),
- _cookiesForUrl()
+ _afterInitialSetup(false)
{}
void OwncloudShibbolethCredsPage::setupBrowser()
{
- if (_browser) {
+ if (!_browser.isNull()) {
return;
}
OwncloudWizard *ocWizard = qobject_cast<OwncloudWizard*>(wizard());
_browser = new ShibbolethWebView(ocWizard->account());
- connect(_browser, SIGNAL(shibbolethCookieReceived(QNetworkCookie, Account*)),
- this, SLOT(slotShibbolethCookieReceived(QNetworkCookie, Account*)));
+ connect(_browser, SIGNAL(shibbolethCookieReceived(const QNetworkCookie&, Account*)),
+ this, SLOT(slotShibbolethCookieReceived()));
connect(_browser, SIGNAL(viewHidden()),
this, SLOT(slotViewHidden()));
- connect(_browser, SIGNAL(otherCookiesReceived(QList<QNetworkCookie>, QUrl)),
- this, SLOT(slotOtherCookiesReceived(QList<QNetworkCookie>, QUrl)));
_browser->move(ocWizard->x(), ocWizard->y());
_browser->show();
@@ -60,9 +56,6 @@ void OwncloudShibbolethCredsPage::setVisible(bool visible)
if (isVisible() == visible) {
return;
}
- if (_browser) {
- disposeBrowser();
- }
if (visible) {
setupBrowser();
wizard()->hide();
@@ -74,23 +67,6 @@ void OwncloudShibbolethCredsPage::setVisible(bool visible)
void OwncloudShibbolethCredsPage::initializePage()
{
_afterInitialSetup = true;
- _cookie = QNetworkCookie();
- _cookiesForUrl.clear();
-}
-
-void OwncloudShibbolethCredsPage::disposeBrowser()
-{
- if (_browser) {
- disconnect(_browser, SIGNAL(otherCookiesReceived(QList<QNetworkCookie>, QUrl)),
- this, SLOT(slotOtherCookiesReceived(QList<QNetworkCookie>, QUrl)));
- disconnect(_browser, SIGNAL(viewHidden()),
- this, SLOT(slotViewHidden()));
- disconnect(_browser, SIGNAL(shibbolethCookieReceived(QNetworkCookie, Account*)),
- this, SLOT(slotShibbolethCookieReceived(QNetworkCookie, Account*)));
- _browser->hide();
- _browser->deleteLater();
- _browser = 0;
- }
}
int OwncloudShibbolethCredsPage::nextId() const
@@ -105,38 +81,16 @@ void OwncloudShibbolethCredsPage::setConnected()
AbstractCredentials* OwncloudShibbolethCredsPage::getCredentials() const
{
- return new ShibbolethCredentials(_cookie, _cookiesForUrl);
+ return new ShibbolethCredentials;
}
-void OwncloudShibbolethCredsPage::slotShibbolethCookieReceived(const QNetworkCookie& cookie, Account*)
+void OwncloudShibbolethCredsPage::slotShibbolethCookieReceived()
{
- disposeBrowser();
- _cookie = cookie;
emit connectToOCUrl(field("OCUrl").toString().simplified());
}
-void OwncloudShibbolethCredsPage::slotOtherCookiesReceived(const QList<QNetworkCookie>& cookieList, const QUrl& url)
-{
- QList<QNetworkCookie>& cookies(_cookiesForUrl[url]);
- QMap<QByteArray, QByteArray> uniqueCookies;
-
- Q_FOREACH (const QNetworkCookie& c, cookieList) {
- if (!c.isSessionCookie()) {
- cookies << c;
- }
- }
- Q_FOREACH (const QNetworkCookie& c, cookies) {
- uniqueCookies[c.name()] = c.value();
- }
- cookies.clear();
- Q_FOREACH (const QByteArray& name, uniqueCookies.keys()) {
- cookies << QNetworkCookie(name, uniqueCookies[name]);
- }
-}
-
void OwncloudShibbolethCredsPage::slotViewHidden()
{
- disposeBrowser();
wizard()->back();
wizard()->show();
}
diff --git a/src/wizard/owncloudshibbolethcredspage.h b/src/wizard/owncloudshibbolethcredspage.h
index c67bfd4..7b2e8be 100644
--- a/src/wizard/owncloudshibbolethcredspage.h
+++ b/src/wizard/owncloudshibbolethcredspage.h
@@ -18,6 +18,7 @@
#include <QMap>
#include <QNetworkCookie>
#include <QUrl>
+#include <QPointer>
#include "wizard/abstractcredswizardpage.h"
@@ -45,18 +46,14 @@ public Q_SLOTS:
void setVisible(bool visible);
private Q_SLOTS:
- void slotShibbolethCookieReceived(const QNetworkCookie& cookie, Account*);
- void slotOtherCookiesReceived(const QList<QNetworkCookie>& cookieList, const QUrl& url);
+ void slotShibbolethCookieReceived();
void slotViewHidden();
private:
void setupBrowser();
- void disposeBrowser();
- ShibbolethWebView* _browser;
- QNetworkCookie _cookie;
+ QPointer<ShibbolethWebView> _browser;
bool _afterInitialSetup;
- QMap<QUrl, QList<QNetworkCookie> > _cookiesForUrl;
};
} // ns Mirall
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list