Preserve filename in temporary downloads
When downloading a file into a temporary location for external open or pdfjs, it used to prepend a random string to the filename. This means that downloading a file opened with pdfjs would have an unwanted mangled filename. Instead of adding a prefix to the filename, this puts the file with its filename intact in a unique temporary directory.
This commit is contained in:
parent
b0e05ee160
commit
8ece2c92ba
|
|
@ -7,6 +7,7 @@
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import html
|
import html
|
||||||
|
import io as _io
|
||||||
import os.path
|
import os.path
|
||||||
import collections
|
import collections
|
||||||
import functools
|
import functools
|
||||||
|
|
@ -813,7 +814,8 @@ class AbstractDownloadItem(QObject):
|
||||||
if filename is None: # pragma: no cover
|
if filename is None: # pragma: no cover
|
||||||
log.downloads.error("No filename to open the download!")
|
log.downloads.error("No filename to open the download!")
|
||||||
return
|
return
|
||||||
self.pdfjs_requested.emit(os.path.basename(filename),
|
dirname = os.path.basename(os.path.dirname(filename))
|
||||||
|
self.pdfjs_requested.emit(os.path.join(dirname, os.path.basename(filename)),
|
||||||
self.url())
|
self.url())
|
||||||
|
|
||||||
def cancel_for_origin(self) -> bool:
|
def cancel_for_origin(self) -> bool:
|
||||||
|
|
@ -1373,8 +1375,8 @@ class TempDownloadManager:
|
||||||
# Make sure that the filename is not too long
|
# Make sure that the filename is not too long
|
||||||
suggested_name = utils.elide_filename(suggested_name, 50)
|
suggested_name = utils.elide_filename(suggested_name, 50)
|
||||||
# pylint: disable=consider-using-with
|
# pylint: disable=consider-using-with
|
||||||
fobj = tempfile.NamedTemporaryFile(dir=tmpdir.name, delete=False,
|
tmpfiledir = tempfile.mkdtemp(dir=tmpdir.name)
|
||||||
suffix='_' + suggested_name)
|
fobj = _io.open(os.path.join(tmpfiledir, suggested_name), 'w+b')
|
||||||
self.files.append(fobj)
|
self.files.append(fobj)
|
||||||
return fobj
|
return fobj
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -518,8 +518,6 @@ def qute_pdfjs(url: QUrl) -> _HandlerRet:
|
||||||
filename = QUrlQuery(url).queryItemValue('filename')
|
filename = QUrlQuery(url).queryItemValue('filename')
|
||||||
if not filename:
|
if not filename:
|
||||||
raise UrlInvalidError("Missing filename")
|
raise UrlInvalidError("Missing filename")
|
||||||
if '/' in filename or os.sep in filename:
|
|
||||||
raise RequestDeniedError("Path separator in filename.")
|
|
||||||
|
|
||||||
path = _pdf_path(filename)
|
path = _pdf_path(filename)
|
||||||
with open(path, 'rb') as f:
|
with open(path, 'rb') as f:
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import time
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import py.path
|
import py.path
|
||||||
from qutebrowser.qt.core import QUrl, QUrlQuery
|
from qutebrowser.qt.core import QUrl
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from qutebrowser.browser import qutescheme, pdfjs, downloads
|
from qutebrowser.browser import qutescheme, pdfjs, downloads
|
||||||
|
|
@ -268,15 +268,6 @@ class TestPDFJSHandler:
|
||||||
with pytest.raises(qutescheme.UrlInvalidError):
|
with pytest.raises(qutescheme.UrlInvalidError):
|
||||||
qutescheme.data_for_url(QUrl('qute://pdfjs/file'))
|
qutescheme.data_for_url(QUrl('qute://pdfjs/file'))
|
||||||
|
|
||||||
@pytest.mark.parametrize('sep', ['/', os.sep])
|
|
||||||
def test_file_pathsep(self, sep):
|
|
||||||
url = QUrl('qute://pdfjs/file')
|
|
||||||
query = QUrlQuery()
|
|
||||||
query.addQueryItem('filename', 'foo{}bar'.format(sep))
|
|
||||||
url.setQuery(query)
|
|
||||||
with pytest.raises(qutescheme.RequestDeniedError):
|
|
||||||
qutescheme.data_for_url(url)
|
|
||||||
|
|
||||||
|
|
||||||
class TestQuteConfigdiff:
|
class TestQuteConfigdiff:
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue