Browse Source

added arg --umask / $UMASK

Fabian Peter Hammerle 5 years ago
parent
commit
1b8e76f0e7
2 changed files with 40 additions and 3 deletions
  1. 14 3
      pyftpd_sink.py
  2. 26 0
      pyftpd_sink_test.py

+ 14 - 3
pyftpd_sink.py

@@ -2,6 +2,7 @@ import argparse
 import hashlib
 import logging
 import os
+
 import pyftpdlib.authorizers
 import pyftpdlib.handlers
 import pyftpdlib.servers
@@ -26,8 +27,12 @@ class SHA256Authorizer(pyftpdlib.authorizers.DummyAuthorizer):
             raise pyftpdlib.authorizers.AuthenticationFailed()
 
 
-def serve(root_dir_path, username, password_sha256_hexdigest, control_port, passive_port, passive_address, log_level):
+def serve(root_dir_path, username, password_sha256_hexdigest,
+          control_port, passive_port, passive_address, umask, log_level):
     logging.basicConfig(level=log_level)
+    if umask:
+        os.umask(umask)
+        logging.info('umask=0o%o', umask)
     assert os.path.isdir(root_dir_path), root_dir_path
     authorizer = SHA256Authorizer()
     authorizer.add_user(
@@ -115,8 +120,14 @@ def _init_argparser():
         envvar='FTP_PASSIVE_ADDRESS',
         default=None,
         help='address returned to client (227)'
-            + ' after opening port for passive mode (PASV)'
-            + ' default: socket\'s own address',
+        + ' after opening port for passive mode (PASV)'
+        + ' default: socket\'s own address',
+    )
+    argparser.add_argument(
+        '--umask',
+        type=int,
+        envvar='UMASK',
+        default=' default: env var $UMASK',
     )
     argparser.add_argument(
         '--log-level',

+ 26 - 0
pyftpd_sink_test.py

@@ -0,0 +1,26 @@
+# pylint: disable=missing-docstring
+
+import unittest.mock
+
+import pytest
+
+import pyftpd_sink
+
+
+@pytest.mark.parametrize(('env', 'argv', 'expected_umask'), [
+    ({}, [], None),
+    ({}, ['--umask', str(0o0027)], 0o0027),
+    ({}, ['--umask', str(0o0177)], 0o0177),
+    ({}, ['--umask', '23'], 0o0027),
+    ({}, ['--umask', '127'], 0o0177),
+    ({'UMASK': str(0o0022)}, [], 0o0022),
+    ({'UMASK': str(0o0022)}, ['--umask', str(0o0027)], 0o0027),
+])
+def test_main_umask(env, argv, expected_umask):
+    with unittest.mock.patch('pyftpd_sink.serve') as serve_mock:
+        with unittest.mock.patch('sys.argv', ['', '--user', 'u', '--pwd-hash', 'p'] + argv):
+            with unittest.mock.patch('os.environ', env):
+                pyftpd_sink.main()
+    serve_mock.assert_called_once()
+    serve_kwargs = serve_mock.call_args[1]
+    assert expected_umask == serve_kwargs['umask']