diff --git a/diceware/__init__.py b/diceware/__init__.py index 91b633eb3f81223a57b3e6634cf5cca3d971fba4..03b7534a25df298dfeaffd6a7dee5f63924f7180 100644 --- a/diceware/__init__.py +++ b/diceware/__init__.py @@ -18,6 +18,8 @@ import argparse import pkg_resources import sys +import logging +from errno import ENOENT from random import SystemRandom from diceware.config import get_config_dict from diceware.logger import configure @@ -208,4 +210,12 @@ def main(args=None): if options.version: print_version() raise SystemExit(0) - print(get_passphrase(options)) + try: + print(get_passphrase(options)) + except (OSError, IOError) as infile_error: + if getattr(infile_error, 'errno', 0) == ENOENT: + logging.getLogger('ulif.diceware').error( + "The file '%s' does not exist." % infile_error.filename) + raise SystemExit(1) + else: + raise diff --git a/diceware/wordlist.py b/diceware/wordlist.py index 32d80fdf69aafa84dd77902dd4023879de7cf319..96185d1865667dc8f97d3cd2fd190af0dfafffb7 100644 --- a/diceware/wordlist.py +++ b/diceware/wordlist.py @@ -111,6 +111,7 @@ class WordList(object): """ def __init__(self, path): self.path = path + self.fd = None if self.path == "-": self.fd = tempfile.SpooledTemporaryFile( max_size=MAX_IN_MEM_SIZE, mode="w+") @@ -121,7 +122,7 @@ class WordList(object): self.signed = self.is_signed() def __del__(self): - if self.path != "-": + if self.path != "-" and self.fd is not None: self.fd.close() def __iter__(self): diff --git a/tests/test_diceware.py b/tests/test_diceware.py index d6255bb32bdbae0c6d19b92eb37fb636839c4cdf..956877860e5154483cf11c9a2fef1691a283fcab 100644 --- a/tests/test_diceware.py +++ b/tests/test_diceware.py @@ -5,6 +5,7 @@ import pytest import re import sys from io import StringIO +from errno import EISDIR from diceware import ( get_wordlists_dir, SPECIAL_CHARS, insert_special_char, get_passphrase, handle_options, main, __version__, print_version, get_random_sources, @@ -317,6 +318,25 @@ class TestDicewareModule(object): out, err = capsys.readouterr() assert out == 'Word1Word1\n' + def test_main_infile_nonexisting(self, argv_handler, capsys): + # main() prints error if file does not exist + # raises the exception if it's other that file not exist + sys.argv = ['diceware', 'nonexisting'] + with pytest.raises(SystemExit) as exc_info: + main() + assert exc_info.value.code == 1 + out, err = capsys.readouterr() + assert "The file 'nonexisting' does not exist." in err + + def test_main_infile_not_a_file(self, argv_handler, tmpdir): + # give directory as input + tmpdir.mkdir("wordlist") + tmpdir.chdir() + sys.argv = ['diceware', 'wordlist'] + with pytest.raises(IOError) as infile_error: + main() + assert infile_error.value.errno == EISDIR + def test_main_delimiters(self, argv_handler, capsys): # delimiters are respected on calls to main sys.stdin = StringIO("word1\n")