Web lists-archives.com

Re: KIO and cookies




On martedì 31 ottobre 2017 22:33:24 CET Allan Sandfeld Jensen wrote:
> On Dienstag, 31. Oktober 2017 21:17:35 CET Stefano Crocco wrote:
> > On martedì 31 ottobre 2017 01:47:37 CET Allan Sandfeld Jensen wrote:
> > > 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 [1], "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.
> > > 
> > > 'Allan
> > 
> > The problem is that I can't find any documentation on how to interact with
> > KIO's cookie store. On KIO::AccessManager, it is stated: "IMPORTANT This
> > class is not a replacement for the standard KDE API. It should ONLY be
> > used
> > to provide KDE integration in applications that cannot use the standard
> > KDE
> > API directly". Unfortunately, it doesn't mention which is the standard KDE
> > API. Looking at accessmanager.cpp, I see (in the code for
> > KIO::Integration::CookieJar) DBUS calls to the "org.kde.cookiejar5"
> > interface. Is this the "standard KDE API"? If so, is there a place where
> > it's documented? I think I already tried to use it to solve this problem,
> > but without success. However, tomorrow I'll give it another try.
> 
> I am not sure how well it is documented, but yes, it is essentially a DBUS
> api in background, because the cookie-jar runs in a separate process.
> Perhaps you can find some help by looking into the kdewebkit code that
> bridged KIO with QNAM (since QtWebKit used QNAM).
> 
> See for instance https://api.kde.org/frameworks/kio/html/
> classKIO_1_1CookieJar.html
> It seems to be a QtNetwork compatible inferface for the KIO cookie jar.
> Though the native API here might work too:
> https://api.kde.org/4.x-api/kdelibs-apidocs/kio/html/
> classKIO_1_1Integration_1_1CookieJar.html
> 
> I just noticed Google is still picking up the KDE 4 documentation. We had
> similar problems with Qt4 vs Qt5. Where are the kf documenation hosted?
> 
> 'Allan
> 
> 'Allan

I'll give it a try later today.

Thanks

Stefano