also add path transformations to :download
This commit is contained in:
parent
07b3a7db7c
commit
df83f7aa99
@ -1334,6 +1334,9 @@ class CommandDispatcher:
|
||||
scope='window', window=self._win_id)
|
||||
target = None
|
||||
if dest is not None:
|
||||
dest = downloads.transform_path(dest)
|
||||
if dest is None:
|
||||
raise cmdexc.CommandError("Invalid target filename")
|
||||
target = downloads.FileDownloadTarget(dest)
|
||||
|
||||
tab = self._current_widget()
|
||||
|
@ -19,11 +19,13 @@
|
||||
|
||||
"""Shared QtWebKit/QtWebEngine code for downloads."""
|
||||
|
||||
import re
|
||||
import sys
|
||||
import html
|
||||
import os.path
|
||||
import collections
|
||||
import functools
|
||||
import pathlib
|
||||
import tempfile
|
||||
|
||||
import sip
|
||||
@ -161,6 +163,25 @@ def get_filename_question(*, suggested_filename, url, parent=None):
|
||||
return q
|
||||
|
||||
|
||||
def transform_path(path):
|
||||
r"""Do platform-specific transformations, like changing E: to E:\.
|
||||
|
||||
Returns None if the path is invalid on the current platform.
|
||||
"""
|
||||
if sys.platform != "win32":
|
||||
return path
|
||||
path = utils.expand_windows_drive(path)
|
||||
# Drive dependent working directories are not supported, e.g.
|
||||
# E:filename is invalid
|
||||
if re.match(r'[A-Z]:[^\\]', path, re.IGNORECASE):
|
||||
return None
|
||||
# Paths like COM1, ...
|
||||
# See https://github.com/qutebrowser/qutebrowser/issues/82
|
||||
if pathlib.Path(path).is_reserved():
|
||||
return None
|
||||
return path
|
||||
|
||||
|
||||
class NoFilenameError(Exception):
|
||||
|
||||
"""Raised when we can't find out a filename in DownloadTarget."""
|
||||
|
@ -19,11 +19,9 @@
|
||||
|
||||
"""Showing prompts above the statusbar."""
|
||||
|
||||
import re
|
||||
import sys
|
||||
import os.path
|
||||
import html
|
||||
import pathlib
|
||||
import collections
|
||||
|
||||
import sip
|
||||
@ -646,31 +644,13 @@ class FilenamePrompt(_BasePrompt):
|
||||
self._file_model.directoryLoaded.connect(
|
||||
lambda: self._file_model.sort(0))
|
||||
|
||||
def _transform_path(self, path):
|
||||
r"""Do platform-specific transformations, like changing E: to E:\.
|
||||
|
||||
Returns None if the path is invalid on the current platform.
|
||||
"""
|
||||
if sys.platform != "win32":
|
||||
return path
|
||||
path = utils.expand_windows_drive(path)
|
||||
# Drive dependent working directories are not supported, e.g.
|
||||
# E:filename is invalid
|
||||
if re.match(r'[A-Z]:[^\\]', path, re.IGNORECASE):
|
||||
return None
|
||||
# Paths like COM1, ...
|
||||
# See https://github.com/qutebrowser/qutebrowser/issues/82
|
||||
if pathlib.Path(path).is_reserved():
|
||||
return None
|
||||
return path
|
||||
|
||||
def _show_error(self, msg):
|
||||
log.prompt.error(msg)
|
||||
QToolTip.showText(self._lineedit.mapToGlobal(QPoint(0, 0)), msg)
|
||||
|
||||
def accept(self, value=None):
|
||||
text = value if value is not None else self._lineedit.text()
|
||||
text = self._transform_path(text)
|
||||
text = downloads.transform_path(text)
|
||||
if text is None:
|
||||
self._show_error("Invalid filename")
|
||||
return False
|
||||
@ -725,7 +705,7 @@ class DownloadFilenamePrompt(FilenamePrompt):
|
||||
|
||||
def accept(self, value=None):
|
||||
text = value if value is not None else self._lineedit.text()
|
||||
text = self._transform_path(text)
|
||||
text = downloads.transform_path(text)
|
||||
if text is None:
|
||||
self._show_error("Invalid filename")
|
||||
return False
|
||||
|
@ -140,6 +140,16 @@ Feature: Downloading things from a website.
|
||||
And I run :prompt-cancel
|
||||
Then "Invalid filename" should be logged
|
||||
|
||||
@windows
|
||||
Scenario: Downloading a file to a reserved path with :download
|
||||
When I run :download data/downloads/download.bin --dest=COM1
|
||||
Then the error "Invalid target filename" should be shown
|
||||
|
||||
@windows
|
||||
Scenario: Download a file to a drive-relative working directory with :download
|
||||
When I run :download data/downloads/download.bin --dest=C:foobar
|
||||
Then the error "Invalid target filename" should be shown
|
||||
|
||||
## :download-retry
|
||||
|
||||
Scenario: Retrying a failed download
|
||||
|
Loading…
Reference in New Issue
Block a user