From 15a1bee0af09600096fdb015318a503154cb8627 Mon Sep 17 00:00:00 2001 From: William Grzybowski Date: Thu, 28 Feb 2019 15:13:07 -0300 Subject: [PATCH] fix(middlewared/account): do not leave a new homedir behind on error Ticket: #77719 --- .../middlewared/plugins/account.py | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/middlewared/middlewared/plugins/account.py b/src/middlewared/middlewared/plugins/account.py index 2abbf62ceb16..0d45eb82df27 100644 --- a/src/middlewared/middlewared/plugins/account.py +++ b/src/middlewared/middlewared/plugins/account.py @@ -171,30 +171,34 @@ async def do_create(self, data): home_mode = data.pop('home_mode') if data['home'] and data['home'] != '/nonexistent': try: - os.makedirs(data['home'], mode=int(home_mode, 8)) - os.chown(data['home'], data['uid'], group['gid']) - except FileExistsError: - if not os.path.isdir(data['home']): + try: + os.makedirs(data['home'], mode=int(home_mode, 8)) + new_homedir = True + os.chown(data['home'], data['uid'], group['gid']) + except FileExistsError: + if not os.path.isdir(data['home']): + raise CallError( + 'Path for home directory already ' + 'exists and is not a directory', + errno.EEXIST + ) + + # If it exists, ensure the user is owner + os.chown(data['home'], data['uid'], group['gid']) + except OSError as oe: raise CallError( - 'Path for home directory already ' - 'exists and is not a directory', - errno.EEXIST + 'Failed to create the home directory ' + f'({data["home"]}) for user: {oe}' ) - - # If it exists, ensure the user is owner - os.chown(data['home'], data['uid'], group['gid']) - except OSError as oe: - raise CallError( - 'Failed to create the home directory ' - f'({data["home"]}) for user: {oe}' - ) - else: - new_homedir = True - if os.stat(data['home']).st_dev == os.stat('/mnt').st_dev: - raise CallError( - f'The path for the home directory "({data["home"]})" ' - 'must include a volume or dataset.' - ) + if os.stat(data['home']).st_dev == os.stat('/mnt').st_dev: + raise CallError( + f'The path for the home directory "({data["home"]})" ' + 'must include a volume or dataset.' + ) + except Exception: + if new_homedir: + shutil.rmtree(data['home']) + raise if not data.get('uid'): data['uid'] = await self.get_next_uid()