From 9df5a8903776168ece79dc39597f572e32d82cd3 Mon Sep 17 00:00:00 2001 From: Martin Tournoij Date: Mon, 8 Jun 2015 22:40:55 +0200 Subject: [PATCH 1/5] Don't crash when trying to save to a FIFO or other special file When giving the path to a FIFO or other special file qutebrowser would completely hang, and has to be killed. Tested: - Asks for overwrite: file, symlink to file - Saves in dir: dir, symlink to dir - Aborts: block dev, char dev, fifo, socket, and a symlink to all of these --- qutebrowser/browser/downloads.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index aa29fce9c..acb8edb35 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -446,6 +446,13 @@ class DownloadItem(QObject): # The file already exists, so ask the user if it should be # overwritten. self._ask_overwrite_question() + # FIFO, device node, etc. Don't even try. + elif (os.path.exists(self._filename) and not + os.path.isdir(self._filename)): + self.cancel(False) + message.error(self._win_id, "The file {} already exists, and is a " + "special file. Aborting.".format( + self._filename)) else: self._create_fileobj() From d114e64b05f27a8b8fb9732a361c9659838bcefa Mon Sep 17 00:00:00 2001 From: Martin Tournoij Date: Sat, 27 Jun 2015 22:28:06 +0200 Subject: [PATCH 2/5] Ask question instead of aborting --- qutebrowser/browser/downloads.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 0efff4e9c..ce50a0f78 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -296,10 +296,10 @@ class DownloadItem(QObject): else: self.set_fileobj(fileobj) - def _ask_overwrite_question(self): + def _ask_confirm_question(self, message): """Create a Question object to be asked.""" q = usertypes.Question(self) - q.text = self._filename + " already exists. Overwrite? (y/n)" + q.text = message + ' (N/y)' q.mode = usertypes.PromptMode.yesno q.answered_yes.connect(self._create_fileobj) q.answered_no.connect(functools.partial(self.cancel, False)) @@ -452,14 +452,11 @@ class DownloadItem(QObject): if os.path.isfile(self._filename): # The file already exists, so ask the user if it should be # overwritten. - self._ask_overwrite_question() - # FIFO, device node, etc. Don't even try. + self._ask_confirm_question(self._filename + " already exists. Overwrite?") + # FIFO, device node, etc. Make sure we want to do this elif (os.path.exists(self._filename) and not os.path.isdir(self._filename)): - self.cancel(False) - message.error(self._win_id, "The file {} already exists, and is a " - "special file. Aborting.".format( - self._filename)) + self._ask_confirm_question(self._filename + " already exists and is a special file. Write to this?") else: self._create_fileobj() From c7cd51a7d5d75fe81fc37703f9c1224051b31111 Mon Sep 17 00:00:00 2001 From: Martin Tournoij Date: Tue, 30 Jun 2015 12:01:05 +0200 Subject: [PATCH 3/5] "Fix" silly pep8 warnings --- qutebrowser/browser/downloads.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index ce50a0f78..e3fd7f4f4 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -452,11 +452,14 @@ class DownloadItem(QObject): if os.path.isfile(self._filename): # The file already exists, so ask the user if it should be # overwritten. - self._ask_confirm_question(self._filename + " already exists. Overwrite?") + self._ask_confirm_question(self._filename + + " already exists. Overwrite?") # FIFO, device node, etc. Make sure we want to do this elif (os.path.exists(self._filename) and not os.path.isdir(self._filename)): - self._ask_confirm_question(self._filename + " already exists and is a special file. Write to this?") + self._ask_confirm_question(self._filename + + " already exists and is a special file." + " Write to this?") else: self._create_fileobj() From 2c5898b9f7174da57aa771b159c1547e8132aded Mon Sep 17 00:00:00 2001 From: Martin Tournoij Date: Tue, 30 Jun 2015 13:22:20 +0200 Subject: [PATCH 4/5] Rename variable to fix pylint warning: https://travis-ci.org/The-Compiler/qutebrowser/jobs/68949925 ************* Module qutebrowser.browser.downloads W:299,36: Redefining name 'message' from outer scope (line 39) (redefined-outer-name) --- qutebrowser/browser/downloads.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index e3fd7f4f4..5a95e4a00 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -296,10 +296,10 @@ class DownloadItem(QObject): else: self.set_fileobj(fileobj) - def _ask_confirm_question(self, message): + def _ask_confirm_question(self, msg): """Create a Question object to be asked.""" q = usertypes.Question(self) - q.text = message + ' (N/y)' + q.text = msg + ' (N/y)' q.mode = usertypes.PromptMode.yesno q.answered_yes.connect(self._create_fileobj) q.answered_no.connect(functools.partial(self.cancel, False)) From dc29ad430ead2e370e4957aa9cf0e734e7936a72 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 2 Jul 2015 20:51:51 +0200 Subject: [PATCH 5/5] Change how lines are split. --- qutebrowser/browser/downloads.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 5a95e4a00..80b5bff0d 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -452,14 +452,14 @@ class DownloadItem(QObject): if os.path.isfile(self._filename): # The file already exists, so ask the user if it should be # overwritten. - self._ask_confirm_question(self._filename + - " already exists. Overwrite?") + txt = self._filename + " already exists. Overwrite?" + self._ask_confirm_question(txt) # FIFO, device node, etc. Make sure we want to do this elif (os.path.exists(self._filename) and not os.path.isdir(self._filename)): - self._ask_confirm_question(self._filename + - " already exists and is a special file." - " Write to this?") + txt = (self._filename + " already exists and is a special file. " + "Write to this?") + self._ask_confirm_question(txt) else: self._create_fileobj()