Re: KIO and cookies
- Date: Tue, 31 Oct 2017 01:47:37 +0100
- From: Allan Sandfeld Jensen <kde@xxxxxxxxxxxx>
- Subject: Re: KIO and cookies
On Sonntag, 29. Oktober 2017 09:47:24 CET Stefano Crocco wrote:
> Hello to everyone,
> I'm working on making QWebEngine work correctly in Konqueror when
> downloading files (although I didn't have much time to spend on this in the
> last months).
> The problem is that instead of downloading the correct files, in some cases
> Konqueror download html files. This only happens from sites requiring
> authentication (I first noticed when trying to download a file from my
> bank's web page); besides, it only happens if I try to use KIO for the
> download, for example calling KIO::copy from a slot connected with
> QWebEngineProfile::downloadRequested. The file downloads correctly if
> Konqueror downloads it using the mechanism provided by QWebEngine, that is
> calling QWebEngineDownloaditem::accept.
> I believe that the issue is caused by cookies, and in particular by the fact
> that QWebEngine doesn't share its cookies with KIO so that, when KIO
> attempts to download the file, it doesn't have the cookie(s) associated
> with the session opened in the browser and the web page refuses to let it
> download the file (indeed, one of the sites where this happens returned a
> login page instead of the PDF I wanted to download).
> Looking at the documentation both for QWebEngine and for KIO
> regarding cookies. I found out two classes:
> * on QWebEngine's side, there's QWebEngineCookieStore, which provides
> signals emitted whenever a cookie is added or removed and which, according
> to documentation , "can be used to synchronize cookies of Chromium and
> the QNetworkAccessManager"
> * on KIO's side, there's KIO::Integration::AccessManager, which derives from
> QNetworkAccessManager and which should work along QWebEngineCookieStore.
> The example in the documentation for KIO::Integration::AccessManager refers
> to QWebView and says to call QWebPage::setNetworkAccessManager to have the
> QWebView and KIO to use the same access manager. Unfortunately, QWebEngine
> can't be integrated with a QNetworkAccessManager: not only QWebEnginePage
> doesn't have a setNetworkAccessManager method, but the documentation for
> QWebEngine explicitly says that it doesn't use QNetworkAccess. Because of
> this, I thought to do things the other way round: I created a
> KIO::Integration::AccessManager and, used slots connected with
> QWebEngineCookieStore signals, to add cookies to it.
> Unfortunately, this doesn't fix the issue. I believe this is because I
> haven't told KIO to use the new access manager. The problem is that I can
> see any way to do it. Does anyone have suggestions on how to do this?
KIO has its own cookie-store separate from QNAMs cookie store. So there
are three cookie stores. QtNetwork's, KIOs, and QtWebEngine's. Of course the
easiest solution would be to let QtWebEngine handle the downloading, but that
wouldn't integrate into normal KDE download mechanisms. So you need to bridge
QtWebEngine's cookies into KIOs cookie store and ignore QtNetwork's.