fliu 85c6b91fbc
email: Code cleanup
- Move render_tabs into plinth.views
- Move admin_tabs and user_tabs into the class
- New interproc module contains inter-process functions
- New helper methods in TabMixin
2021-08-17 19:43:55 -07:00

72 lines
1.9 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
import logging
import os
import pwd
import subprocess
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
from plinth.actions import superuser_run
from plinth.errors import ActionError
from plinth.modules.email_server import interproc
logger = logging.getLogger(__name__)
def exists_nam(username):
"""Returns True if the user's home directory exists"""
try:
passwd = pwd.getpwnam(username)
except KeyError as e:
raise ValidationError(_('User does not exist')) from e
return _exists(passwd)
def exists_uid(uid_number):
"""Returns True if the user's home directory exists"""
try:
passwd = pwd.getpwuid(uid_number)
except KeyError as e:
raise ValidationError(_('User does not exist')) from e
return _exists(passwd)
def _exists(passwd):
return os.path.exists(passwd.pw_dir)
def put_nam(username):
"""Create a home directory for the user (identified by username)"""
_put('nam', username)
def put_uid(uid_number):
"""Create a home directory for the user (identified by UID)"""
_put('uid', str(uid_number))
def _put(arg_type, user_info):
try:
args = ['-i', 'home', 'mk', arg_type, user_info]
superuser_run('email_server', args)
except ActionError as e:
raise RuntimeError('Action script failure') from e
def action_mk(arg_type, user_info):
if arg_type == 'nam':
passwd = pwd.getpwnam(user_info)
elif arg_type == 'uid':
passwd = pwd.getpwuid(int(user_info))
else:
raise ValueError('Unknown arg_type')
args = ['sudo', '-n', '--user=#' + str(passwd.pw_uid)]
args.extend(['/bin/sh', '-c', 'mkdir -p ~'])
completed = subprocess.run(args, capture_output=True)
if completed.returncode != 0:
interproc.log_subprocess(completed)
raise OSError('Could not create home directory')