Browse Source

Set a maximum on the maximum length of a foldername

Closes #1597
pull/1603/head
Safihre 5 years ago
parent
commit
0108730004
  1. 2
      sabnzbd/cfg.py
  2. 4
      sabnzbd/constants.py
  3. 3
      sabnzbd/filesystem.py
  4. 1
      sabnzbd/interface.py
  5. 6
      tests/test_filesystem.py

2
sabnzbd/cfg.py

@ -45,6 +45,7 @@ from sabnzbd.constants import (
DEF_NZBBACK_DIR,
DEF_SCANRATE,
DEF_COMPLETE_DIR,
DEF_FOLDER_MAX,
)
##############################################################################
@ -289,6 +290,7 @@ size_limit = OptionStr("misc", "size_limit", "0")
show_sysload = OptionNumber("misc", "show_sysload", 2, 0, 2)
history_limit = OptionNumber("misc", "history_limit", 10, 0)
wait_ext_drive = OptionNumber("misc", "wait_ext_drive", 5, 1, 60)
max_foldername_length = OptionNumber("misc", "max_foldername_length", DEF_FOLDER_MAX, 20, 65000)
marker_file = OptionStr("misc", "nomedia_marker", "")
ipv6_servers = OptionNumber("misc", "ipv6_servers", 1, 0, 2)
url_base = OptionStr("misc", "url_base", "/sabnzbd", validation=validate_strip_right_slash)

4
sabnzbd/constants.py

@ -37,6 +37,10 @@ QNFO = namedtuple("QNFO", "bytes bytes_left bytes_left_previous_page list q_size
ANFO = namedtuple("ANFO", "article_sum cache_size cache_limit")
# Leave some space for "_UNPACK_" which we append during post-proc
# Or, when extra ".1", ".2" etc. are added for identically named jobs
DEF_FOLDER_MAX = 256 - 10
GIGI = float(2 ** 30)
MEBI = float(2 ** 20)
KIBI = float(2 ** 10)

3
sabnzbd/filesystem.py

@ -197,6 +197,9 @@ def sanitize_foldername(name):
if sabnzbd.WIN32 or sabnzbd.cfg.sanitize_safe():
name = replace_win_devices(name)
if len(name) >= sabnzbd.cfg.max_foldername_length():
name = name[: sabnzbd.cfg.max_foldername_length()]
# And finally, make sure it doesn't end in a dot
if name != "." and name != "..":
name = name.rstrip(".")

1
sabnzbd/interface.py

@ -1368,6 +1368,7 @@ SPECIAL_VALUE_LIST = (
"max_url_retries",
"req_completion_rate",
"wait_ext_drive",
"max_foldername_length",
"show_sysload",
"url_base",
"direct_unpack_threads",

6
tests/test_filesystem.py

@ -25,6 +25,7 @@ import pyfakefs.fake_filesystem_unittest as ffs
import sabnzbd.cfg
import sabnzbd.filesystem as filesystem
from sabnzbd.constants import DEF_FOLDER_MAX
from tests.testhelper import *
# Set the global uid for fake filesystems to a non-root user;
@ -164,6 +165,11 @@ class TestFileFolderNameSanitizer:
assert filesystem.sanitize_foldername("/test/this.") == "+test+this"
assert filesystem.sanitize_foldername("/test./this.") == "+test.+this"
def test_long_foldername(self):
assert len(filesystem.sanitize_foldername("test" * 100)) == DEF_FOLDER_MAX
assert len(filesystem.sanitize_foldername("a" * DEF_FOLDER_MAX)) == DEF_FOLDER_MAX
assert len(filesystem.sanitize_foldername("a" * (DEF_FOLDER_MAX + 1))) == DEF_FOLDER_MAX
def test_filename_empty_result(self):
# Nothing remains after sanitizing the filename
assert filesystem.sanitize_filename("\n") == "unknown"

Loading…
Cancel
Save