diff options
author | Christian Breunig <christian@breunig.cc> | 2023-12-29 20:54:29 +0100 |
---|---|---|
committer | Mergify <37929162+mergify[bot]@users.noreply.github.com> | 2023-12-30 09:57:14 +0000 |
commit | 92ca844d7a0492ecc1464a9bf18eecd72ac6e907 (patch) | |
tree | dfa08a7917249c20e0295990bddb5c12fcdb4f43 /python | |
parent | 93427954f3abbce755847e61d0dd6471dce1bdd9 (diff) | |
download | vyos-1x-92ca844d7a0492ecc1464a9bf18eecd72ac6e907.tar.gz vyos-1x-92ca844d7a0492ecc1464a9bf18eecd72ac6e907.zip |
login: T5875: restore home directory permissions when re-adding user account
After deleting a user account and working with a newly added account, we see
that after rebooting in the previously saved configuration, the user is
re-added but it's home directory might have an old UID set on the filesystem.
This is due to the fact that vyos config does not store UIDs. When adding a
user account to the system we now check if the home directory already exists
and adjust the ownership to the new UID.
(cherry picked from commit 3c990f49e2bf9347bd2cc478995baa995ee822fd)
Diffstat (limited to 'python')
-rw-r--r-- | python/vyos/utils/file.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/python/vyos/utils/file.py b/python/vyos/utils/file.py index 9f27a7fb9..0818f1b81 100644 --- a/python/vyos/utils/file.py +++ b/python/vyos/utils/file.py @@ -83,21 +83,34 @@ def read_json(fname, defaultonfailure=None): return defaultonfailure raise e -def chown(path, user, group): +def chown(path, user=None, group=None, recursive=False): """ change file/directory owner """ from pwd import getpwnam from grp import getgrnam - if user is None or group is None: + if user is None and group is None: return False # path may also be an open file descriptor if not isinstance(path, int) and not os.path.exists(path): return False - uid = getpwnam(user).pw_uid - gid = getgrnam(group).gr_gid - os.chown(path, uid, gid) + # keep current value if not specified otherwise + uid = -1 + gid = -1 + + if user: + uid = getpwnam(user).pw_uid + if group: + gid = getgrnam(group).gr_gid + + if recursive: + for dirpath, dirnames, filenames in os.walk(path): + os.chown(dirpath, uid, gid) + for filename in filenames: + os.chown(os.path.join(dirpath, filename), uid, gid) + else: + os.chown(path, uid, gid) return True |