mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
Get rid of all those crazy 'auth' arguments. Instead : directly fetch the ldap interface when and where it's actually needed
This commit is contained in:
parent
c15cc788ed
commit
f010f49528
8 changed files with 186 additions and 154 deletions
|
@ -38,12 +38,12 @@ from collections import OrderedDict
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from moulinette import msignals, m18n, msettings
|
from moulinette import msignals, m18n, msettings
|
||||||
from yunohost.utils.error import YunohostError
|
|
||||||
from moulinette.utils.log import getActionLogger
|
from moulinette.utils.log import getActionLogger
|
||||||
from moulinette.utils.filesystem import read_json
|
from moulinette.utils.filesystem import read_json
|
||||||
|
|
||||||
from yunohost.service import service_log, service_status, _run_service_command
|
from yunohost.service import service_log, service_status, _run_service_command
|
||||||
from yunohost.utils import packages
|
from yunohost.utils import packages
|
||||||
|
from yunohost.utils.error import YunohostError
|
||||||
from yunohost.log import is_unit_operation, OperationLogger
|
from yunohost.log import is_unit_operation, OperationLogger
|
||||||
|
|
||||||
logger = getActionLogger('yunohost.app')
|
logger = getActionLogger('yunohost.app')
|
||||||
|
@ -437,7 +437,7 @@ def app_map(app=None, raw=False, user=None):
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation()
|
@is_unit_operation()
|
||||||
def app_change_url(operation_logger, auth, app, domain, path):
|
def app_change_url(operation_logger, app, domain, path):
|
||||||
"""
|
"""
|
||||||
Modify the URL at which an application is installed.
|
Modify the URL at which an application is installed.
|
||||||
|
|
||||||
|
@ -468,7 +468,7 @@ def app_change_url(operation_logger, auth, app, domain, path):
|
||||||
raise YunohostError("app_change_url_identical_domains", domain=domain, path=path)
|
raise YunohostError("app_change_url_identical_domains", domain=domain, path=path)
|
||||||
|
|
||||||
# Check the url is available
|
# Check the url is available
|
||||||
conflicts = _get_conflicting_apps(auth, domain, path, ignore_app=app)
|
conflicts = _get_conflicting_apps(domain, path, ignore_app=app)
|
||||||
if conflicts:
|
if conflicts:
|
||||||
apps = []
|
apps = []
|
||||||
for path, app_id, app_label in conflicts:
|
for path, app_id, app_label in conflicts:
|
||||||
|
@ -484,7 +484,7 @@ def app_change_url(operation_logger, auth, app, domain, path):
|
||||||
|
|
||||||
# Retrieve arguments list for change_url script
|
# Retrieve arguments list for change_url script
|
||||||
# TODO: Allow to specify arguments
|
# TODO: Allow to specify arguments
|
||||||
args_odict = _parse_args_from_manifest(manifest, 'change_url', auth=auth)
|
args_odict = _parse_args_from_manifest(manifest, 'change_url')
|
||||||
args_list = args_odict.values()
|
args_list = args_odict.values()
|
||||||
args_list.append(app)
|
args_list.append(app)
|
||||||
|
|
||||||
|
@ -538,7 +538,7 @@ def app_change_url(operation_logger, auth, app, domain, path):
|
||||||
app_setting(app, 'domain', value=domain)
|
app_setting(app, 'domain', value=domain)
|
||||||
app_setting(app, 'path', value=path)
|
app_setting(app, 'path', value=path)
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
# avoid common mistakes
|
# avoid common mistakes
|
||||||
if _run_service_command("reload", "nginx") == False:
|
if _run_service_command("reload", "nginx") == False:
|
||||||
|
@ -557,7 +557,7 @@ def app_change_url(operation_logger, auth, app, domain, path):
|
||||||
hook_callback('post_app_change_url', args=args_list, env=env_dict)
|
hook_callback('post_app_change_url', args=args_list, env=env_dict)
|
||||||
|
|
||||||
|
|
||||||
def app_upgrade(auth, app=[], url=None, file=None):
|
def app_upgrade(app=[], url=None, file=None):
|
||||||
"""
|
"""
|
||||||
Upgrade app
|
Upgrade app
|
||||||
|
|
||||||
|
@ -633,7 +633,7 @@ def app_upgrade(auth, app=[], url=None, file=None):
|
||||||
|
|
||||||
# Retrieve arguments list for upgrade script
|
# Retrieve arguments list for upgrade script
|
||||||
# TODO: Allow to specify arguments
|
# TODO: Allow to specify arguments
|
||||||
args_odict = _parse_args_from_manifest(manifest, 'upgrade', auth=auth)
|
args_odict = _parse_args_from_manifest(manifest, 'upgrade')
|
||||||
args_list = args_odict.values()
|
args_list = args_odict.values()
|
||||||
args_list.append(app_instance_name)
|
args_list.append(app_instance_name)
|
||||||
|
|
||||||
|
@ -693,7 +693,7 @@ def app_upgrade(auth, app=[], url=None, file=None):
|
||||||
if not_upgraded_apps:
|
if not_upgraded_apps:
|
||||||
raise YunohostError('app_not_upgraded', apps=', '.join(not_upgraded_apps))
|
raise YunohostError('app_not_upgraded', apps=', '.join(not_upgraded_apps))
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
logger.success(m18n.n('upgrade_complete'))
|
logger.success(m18n.n('upgrade_complete'))
|
||||||
|
|
||||||
|
@ -703,7 +703,7 @@ def app_upgrade(auth, app=[], url=None, file=None):
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation()
|
@is_unit_operation()
|
||||||
def app_install(operation_logger, auth, app, label=None, args=None, no_remove_on_failure=False, force=False):
|
def app_install(operation_logger, app, label=None, args=None, no_remove_on_failure=False, force=False):
|
||||||
"""
|
"""
|
||||||
Install apps
|
Install apps
|
||||||
|
|
||||||
|
@ -795,7 +795,7 @@ def app_install(operation_logger, auth, app, label=None, args=None, no_remove_on
|
||||||
# Retrieve arguments list for install script
|
# Retrieve arguments list for install script
|
||||||
args_dict = {} if not args else \
|
args_dict = {} if not args else \
|
||||||
dict(urlparse.parse_qsl(args, keep_blank_values=True))
|
dict(urlparse.parse_qsl(args, keep_blank_values=True))
|
||||||
args_odict = _parse_args_from_manifest(manifest, 'install', args=args_dict, auth=auth)
|
args_odict = _parse_args_from_manifest(manifest, 'install', args=args_dict)
|
||||||
args_list = args_odict.values()
|
args_list = args_odict.values()
|
||||||
args_list.append(app_instance_name)
|
args_list.append(app_instance_name)
|
||||||
|
|
||||||
|
@ -887,7 +887,7 @@ def app_install(operation_logger, auth, app, label=None, args=None, no_remove_on
|
||||||
shutil.rmtree(app_setting_path)
|
shutil.rmtree(app_setting_path)
|
||||||
shutil.rmtree(extracted_app_folder)
|
shutil.rmtree(extracted_app_folder)
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
if packages.dpkg_is_broken():
|
if packages.dpkg_is_broken():
|
||||||
logger.error(m18n.n("this_action_broke_dpkg"))
|
logger.error(m18n.n("this_action_broke_dpkg"))
|
||||||
|
@ -914,7 +914,7 @@ def app_install(operation_logger, auth, app, label=None, args=None, no_remove_on
|
||||||
os.system('chown -R root: %s' % app_setting_path)
|
os.system('chown -R root: %s' % app_setting_path)
|
||||||
os.system('chown -R admin: %s/scripts' % app_setting_path)
|
os.system('chown -R admin: %s/scripts' % app_setting_path)
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
logger.success(m18n.n('installation_complete'))
|
logger.success(m18n.n('installation_complete'))
|
||||||
|
|
||||||
|
@ -922,7 +922,7 @@ def app_install(operation_logger, auth, app, label=None, args=None, no_remove_on
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation()
|
@is_unit_operation()
|
||||||
def app_remove(operation_logger, auth, app):
|
def app_remove(operation_logger, app):
|
||||||
"""
|
"""
|
||||||
Remove app
|
Remove app
|
||||||
|
|
||||||
|
@ -974,13 +974,13 @@ def app_remove(operation_logger, auth, app):
|
||||||
shutil.rmtree(app_setting_path)
|
shutil.rmtree(app_setting_path)
|
||||||
shutil.rmtree('/tmp/yunohost_remove')
|
shutil.rmtree('/tmp/yunohost_remove')
|
||||||
hook_remove(app)
|
hook_remove(app)
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
if packages.dpkg_is_broken():
|
if packages.dpkg_is_broken():
|
||||||
raise YunohostError("this_action_broke_dpkg")
|
raise YunohostError("this_action_broke_dpkg")
|
||||||
|
|
||||||
|
|
||||||
def app_addaccess(auth, apps, users=[]):
|
def app_addaccess(apps, users=[]):
|
||||||
"""
|
"""
|
||||||
Grant access right to users (everyone by default)
|
Grant access right to users (everyone by default)
|
||||||
|
|
||||||
|
@ -995,7 +995,7 @@ def app_addaccess(auth, apps, users=[]):
|
||||||
result = {}
|
result = {}
|
||||||
|
|
||||||
if not users:
|
if not users:
|
||||||
users = user_list(auth)['users'].keys()
|
users = user_list()['users'].keys()
|
||||||
elif not isinstance(users, list):
|
elif not isinstance(users, list):
|
||||||
users = [users, ]
|
users = [users, ]
|
||||||
if not isinstance(apps, list):
|
if not isinstance(apps, list):
|
||||||
|
@ -1025,7 +1025,7 @@ def app_addaccess(auth, apps, users=[]):
|
||||||
for allowed_user in users:
|
for allowed_user in users:
|
||||||
if allowed_user not in allowed_users:
|
if allowed_user not in allowed_users:
|
||||||
try:
|
try:
|
||||||
user_info(auth, allowed_user)
|
user_info(allowed_user)
|
||||||
except YunohostError:
|
except YunohostError:
|
||||||
logger.warning(m18n.n('user_unknown', user=allowed_user))
|
logger.warning(m18n.n('user_unknown', user=allowed_user))
|
||||||
continue
|
continue
|
||||||
|
@ -1041,12 +1041,12 @@ def app_addaccess(auth, apps, users=[]):
|
||||||
|
|
||||||
result[app] = allowed_users
|
result[app] = allowed_users
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
return {'allowed_users': result}
|
return {'allowed_users': result}
|
||||||
|
|
||||||
|
|
||||||
def app_removeaccess(auth, apps, users=[]):
|
def app_removeaccess(apps, users=[]):
|
||||||
"""
|
"""
|
||||||
Revoke access right to users (everyone by default)
|
Revoke access right to users (everyone by default)
|
||||||
|
|
||||||
|
@ -1088,7 +1088,7 @@ def app_removeaccess(auth, apps, users=[]):
|
||||||
if allowed_user not in users:
|
if allowed_user not in users:
|
||||||
allowed_users.add(allowed_user)
|
allowed_users.add(allowed_user)
|
||||||
else:
|
else:
|
||||||
for allowed_user in user_list(auth)['users'].keys():
|
for allowed_user in user_list()['users'].keys():
|
||||||
if allowed_user not in users:
|
if allowed_user not in users:
|
||||||
allowed_users.add(allowed_user)
|
allowed_users.add(allowed_user)
|
||||||
|
|
||||||
|
@ -1102,12 +1102,12 @@ def app_removeaccess(auth, apps, users=[]):
|
||||||
|
|
||||||
operation_logger.success()
|
operation_logger.success()
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
return {'allowed_users': result}
|
return {'allowed_users': result}
|
||||||
|
|
||||||
|
|
||||||
def app_clearaccess(auth, apps):
|
def app_clearaccess(apps):
|
||||||
"""
|
"""
|
||||||
Reset access rights for the app
|
Reset access rights for the app
|
||||||
|
|
||||||
|
@ -1140,7 +1140,7 @@ def app_clearaccess(auth, apps):
|
||||||
|
|
||||||
operation_logger.success()
|
operation_logger.success()
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
|
|
||||||
def app_debug(app):
|
def app_debug(app):
|
||||||
|
@ -1167,7 +1167,7 @@ def app_debug(app):
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation()
|
@is_unit_operation()
|
||||||
def app_makedefault(operation_logger, auth, app, domain=None):
|
def app_makedefault(operation_logger, app, domain=None):
|
||||||
"""
|
"""
|
||||||
Redirect domain root to an app
|
Redirect domain root to an app
|
||||||
|
|
||||||
|
@ -1185,7 +1185,7 @@ def app_makedefault(operation_logger, auth, app, domain=None):
|
||||||
if domain is None:
|
if domain is None:
|
||||||
domain = app_domain
|
domain = app_domain
|
||||||
operation_logger.related_to.append(('domain', domain))
|
operation_logger.related_to.append(('domain', domain))
|
||||||
elif domain not in domain_list(auth)['domains']:
|
elif domain not in domain_list()['domains']:
|
||||||
raise YunohostError('domain_unknown')
|
raise YunohostError('domain_unknown')
|
||||||
|
|
||||||
operation_logger.start()
|
operation_logger.start()
|
||||||
|
@ -1264,7 +1264,7 @@ def app_checkport(port):
|
||||||
raise YunohostError('port_unavailable', port=int(port))
|
raise YunohostError('port_unavailable', port=int(port))
|
||||||
|
|
||||||
|
|
||||||
def app_register_url(auth, app, domain, path):
|
def app_register_url(app, domain, path):
|
||||||
"""
|
"""
|
||||||
Book/register a web path for a given app
|
Book/register a web path for a given app
|
||||||
|
|
||||||
|
@ -1290,7 +1290,7 @@ def app_register_url(auth, app, domain, path):
|
||||||
raise YunohostError('app_already_installed_cant_change_url')
|
raise YunohostError('app_already_installed_cant_change_url')
|
||||||
|
|
||||||
# Check the url is available
|
# Check the url is available
|
||||||
conflicts = _get_conflicting_apps(auth, domain, path)
|
conflicts = _get_conflicting_apps(domain, path)
|
||||||
if conflicts:
|
if conflicts:
|
||||||
apps = []
|
apps = []
|
||||||
for path, app_id, app_label in conflicts:
|
for path, app_id, app_label in conflicts:
|
||||||
|
@ -1307,7 +1307,7 @@ def app_register_url(auth, app, domain, path):
|
||||||
app_setting(app, 'path', value=path)
|
app_setting(app, 'path', value=path)
|
||||||
|
|
||||||
|
|
||||||
def app_checkurl(auth, url, app=None):
|
def app_checkurl(url, app=None):
|
||||||
"""
|
"""
|
||||||
Check availability of a web path
|
Check availability of a web path
|
||||||
|
|
||||||
|
@ -1337,7 +1337,7 @@ def app_checkurl(auth, url, app=None):
|
||||||
|
|
||||||
apps_map = app_map(raw=True)
|
apps_map = app_map(raw=True)
|
||||||
|
|
||||||
if domain not in domain_list(auth)['domains']:
|
if domain not in domain_list()['domains']:
|
||||||
raise YunohostError('domain_unknown')
|
raise YunohostError('domain_unknown')
|
||||||
|
|
||||||
if domain in apps_map:
|
if domain in apps_map:
|
||||||
|
@ -1394,7 +1394,7 @@ def app_initdb(user, password=None, db=None, sql=None):
|
||||||
logger.success(m18n.n('mysql_db_initialized'))
|
logger.success(m18n.n('mysql_db_initialized'))
|
||||||
|
|
||||||
|
|
||||||
def app_ssowatconf(auth):
|
def app_ssowatconf():
|
||||||
"""
|
"""
|
||||||
Regenerate SSOwat configuration file
|
Regenerate SSOwat configuration file
|
||||||
|
|
||||||
|
@ -1404,7 +1404,7 @@ def app_ssowatconf(auth):
|
||||||
from yunohost.user import user_list
|
from yunohost.user import user_list
|
||||||
|
|
||||||
main_domain = _get_maindomain()
|
main_domain = _get_maindomain()
|
||||||
domains = domain_list(auth)['domains']
|
domains = domain_list()['domains']
|
||||||
|
|
||||||
skipped_urls = []
|
skipped_urls = []
|
||||||
skipped_regex = []
|
skipped_regex = []
|
||||||
|
@ -1481,7 +1481,7 @@ def app_ssowatconf(auth):
|
||||||
'redirected_urls': redirected_urls,
|
'redirected_urls': redirected_urls,
|
||||||
'redirected_regex': redirected_regex,
|
'redirected_regex': redirected_regex,
|
||||||
'users': {username: app_map(user=username)
|
'users': {username: app_map(user=username)
|
||||||
for username in user_list(auth)['users'].keys()},
|
for username in user_list()['users'].keys()},
|
||||||
}
|
}
|
||||||
|
|
||||||
with open('/etc/ssowat/conf.json', 'w+') as f:
|
with open('/etc/ssowat/conf.json', 'w+') as f:
|
||||||
|
@ -1490,14 +1490,14 @@ def app_ssowatconf(auth):
|
||||||
logger.success(m18n.n('ssowat_conf_generated'))
|
logger.success(m18n.n('ssowat_conf_generated'))
|
||||||
|
|
||||||
|
|
||||||
def app_change_label(auth, app, new_label):
|
def app_change_label(app, new_label):
|
||||||
installed = _is_installed(app)
|
installed = _is_installed(app)
|
||||||
if not installed:
|
if not installed:
|
||||||
raise YunohostError('app_not_installed', app=app)
|
raise YunohostError('app_not_installed', app=app)
|
||||||
|
|
||||||
app_setting(app, "label", value=new_label)
|
app_setting(app, "label", value=new_label)
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
|
|
||||||
# actions todo list:
|
# actions todo list:
|
||||||
|
@ -2143,7 +2143,7 @@ def _check_manifest_requirements(manifest, app_instance_name):
|
||||||
spec=spec, app=app_instance_name)
|
spec=spec, app=app_instance_name)
|
||||||
|
|
||||||
|
|
||||||
def _parse_args_from_manifest(manifest, action, args={}, auth=None):
|
def _parse_args_from_manifest(manifest, action, args={}):
|
||||||
"""Parse arguments needed for an action from the manifest
|
"""Parse arguments needed for an action from the manifest
|
||||||
|
|
||||||
Retrieve specified arguments for the action from the manifest, and parse
|
Retrieve specified arguments for the action from the manifest, and parse
|
||||||
|
@ -2162,10 +2162,10 @@ def _parse_args_from_manifest(manifest, action, args={}, auth=None):
|
||||||
return OrderedDict()
|
return OrderedDict()
|
||||||
|
|
||||||
action_args = manifest['arguments'][action]
|
action_args = manifest['arguments'][action]
|
||||||
return _parse_action_args_in_yunohost_format(args, action_args, auth)
|
return _parse_action_args_in_yunohost_format(args, action_args)
|
||||||
|
|
||||||
|
|
||||||
def _parse_args_for_action(action, args={}, auth=None):
|
def _parse_args_for_action(action, args={}):
|
||||||
"""Parse arguments needed for an action from the actions list
|
"""Parse arguments needed for an action from the actions list
|
||||||
|
|
||||||
Retrieve specified arguments for the action from the manifest, and parse
|
Retrieve specified arguments for the action from the manifest, and parse
|
||||||
|
@ -2186,10 +2186,10 @@ def _parse_args_for_action(action, args={}, auth=None):
|
||||||
|
|
||||||
action_args = action['arguments']
|
action_args = action['arguments']
|
||||||
|
|
||||||
return _parse_action_args_in_yunohost_format(args, action_args, auth)
|
return _parse_action_args_in_yunohost_format(args, action_args)
|
||||||
|
|
||||||
|
|
||||||
def _parse_action_args_in_yunohost_format(args, action_args, auth=None):
|
def _parse_action_args_in_yunohost_format(args, action_args):
|
||||||
"""Parse arguments store in either manifest.json or actions.json
|
"""Parse arguments store in either manifest.json or actions.json
|
||||||
"""
|
"""
|
||||||
from yunohost.domain import (domain_list, _get_maindomain,
|
from yunohost.domain import (domain_list, _get_maindomain,
|
||||||
|
@ -2242,12 +2242,12 @@ def _parse_action_args_in_yunohost_format(args, action_args, auth=None):
|
||||||
arg_default = _get_maindomain()
|
arg_default = _get_maindomain()
|
||||||
ask_string += ' (default: {0})'.format(arg_default)
|
ask_string += ' (default: {0})'.format(arg_default)
|
||||||
msignals.display(m18n.n('domains_available'))
|
msignals.display(m18n.n('domains_available'))
|
||||||
for domain in domain_list(auth)['domains']:
|
for domain in domain_list()['domains']:
|
||||||
msignals.display("- {}".format(domain))
|
msignals.display("- {}".format(domain))
|
||||||
|
|
||||||
elif arg_type == 'user':
|
elif arg_type == 'user':
|
||||||
msignals.display(m18n.n('users_available'))
|
msignals.display(m18n.n('users_available'))
|
||||||
for user in user_list(auth)['users'].keys():
|
for user in user_list()['users'].keys():
|
||||||
msignals.display("- {}".format(user))
|
msignals.display("- {}".format(user))
|
||||||
|
|
||||||
elif arg_type == 'password':
|
elif arg_type == 'password':
|
||||||
|
@ -2283,11 +2283,11 @@ def _parse_action_args_in_yunohost_format(args, action_args, auth=None):
|
||||||
|
|
||||||
# Validate argument type
|
# Validate argument type
|
||||||
if arg_type == 'domain':
|
if arg_type == 'domain':
|
||||||
if arg_value not in domain_list(auth)['domains']:
|
if arg_value not in domain_list()['domains']:
|
||||||
raise YunohostError('app_argument_invalid', name=arg_name, error=m18n.n('domain_unknown'))
|
raise YunohostError('app_argument_invalid', name=arg_name, error=m18n.n('domain_unknown'))
|
||||||
elif arg_type == 'user':
|
elif arg_type == 'user':
|
||||||
try:
|
try:
|
||||||
user_info(auth, arg_value)
|
user_info(arg_value)
|
||||||
except YunohostError as e:
|
except YunohostError as e:
|
||||||
raise YunohostError('app_argument_invalid', name=arg_name, error=e)
|
raise YunohostError('app_argument_invalid', name=arg_name, error=e)
|
||||||
elif arg_type == 'app':
|
elif arg_type == 'app':
|
||||||
|
@ -2328,7 +2328,7 @@ def _parse_action_args_in_yunohost_format(args, action_args, auth=None):
|
||||||
domain, path = _normalize_domain_path(domain, path)
|
domain, path = _normalize_domain_path(domain, path)
|
||||||
|
|
||||||
# Check the url is available
|
# Check the url is available
|
||||||
conflicts = _get_conflicting_apps(auth, domain, path)
|
conflicts = _get_conflicting_apps(domain, path)
|
||||||
if conflicts:
|
if conflicts:
|
||||||
apps = []
|
apps = []
|
||||||
for path, app_id, app_label in conflicts:
|
for path, app_id, app_label in conflicts:
|
||||||
|
|
|
@ -2090,7 +2090,7 @@ def backup_create(name=None, description=None, methods=[],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def backup_restore(auth, name, system=[], apps=[], force=False):
|
def backup_restore(name, system=[], apps=[], force=False):
|
||||||
"""
|
"""
|
||||||
Restore from a local backup archive
|
Restore from a local backup archive
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ DNS_RESOLVERS = [
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
def certificate_status(auth, domain_list, full=False):
|
def certificate_status(domain_list, full=False):
|
||||||
"""
|
"""
|
||||||
Print the status of certificate for given domains (all by default)
|
Print the status of certificate for given domains (all by default)
|
||||||
|
|
||||||
|
@ -99,10 +99,10 @@ def certificate_status(auth, domain_list, full=False):
|
||||||
|
|
||||||
# If no domains given, consider all yunohost domains
|
# If no domains given, consider all yunohost domains
|
||||||
if domain_list == []:
|
if domain_list == []:
|
||||||
domain_list = yunohost.domain.domain_list(auth)['domains']
|
domain_list = yunohost.domain.domain_list()['domains']
|
||||||
# Else, validate that yunohost knows the domains given
|
# Else, validate that yunohost knows the domains given
|
||||||
else:
|
else:
|
||||||
yunohost_domains_list = yunohost.domain.domain_list(auth)['domains']
|
yunohost_domains_list = yunohost.domain.domain_list()['domains']
|
||||||
for domain in domain_list:
|
for domain in domain_list:
|
||||||
# Is it in Yunohost domain list?
|
# Is it in Yunohost domain list?
|
||||||
if domain not in yunohost_domains_list:
|
if domain not in yunohost_domains_list:
|
||||||
|
@ -126,7 +126,7 @@ def certificate_status(auth, domain_list, full=False):
|
||||||
return {"certificates": certificates}
|
return {"certificates": certificates}
|
||||||
|
|
||||||
|
|
||||||
def certificate_install(auth, domain_list, force=False, no_checks=False, self_signed=False, staging=False):
|
def certificate_install(domain_list, force=False, no_checks=False, self_signed=False, staging=False):
|
||||||
"""
|
"""
|
||||||
Install a Let's Encrypt certificate for given domains (all by default)
|
Install a Let's Encrypt certificate for given domains (all by default)
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ def certificate_install(auth, domain_list, force=False, no_checks=False, self_si
|
||||||
_certificate_install_selfsigned(domain_list, force)
|
_certificate_install_selfsigned(domain_list, force)
|
||||||
else:
|
else:
|
||||||
_certificate_install_letsencrypt(
|
_certificate_install_letsencrypt(
|
||||||
auth, domain_list, force, no_checks, staging)
|
domain_list, force, no_checks, staging)
|
||||||
|
|
||||||
|
|
||||||
def _certificate_install_selfsigned(domain_list, force=False):
|
def _certificate_install_selfsigned(domain_list, force=False):
|
||||||
|
@ -237,7 +237,7 @@ def _certificate_install_selfsigned(domain_list, force=False):
|
||||||
operation_logger.error(msg)
|
operation_logger.error(msg)
|
||||||
|
|
||||||
|
|
||||||
def _certificate_install_letsencrypt(auth, domain_list, force=False, no_checks=False, staging=False):
|
def _certificate_install_letsencrypt(domain_list, force=False, no_checks=False, staging=False):
|
||||||
import yunohost.domain
|
import yunohost.domain
|
||||||
|
|
||||||
if not os.path.exists(ACCOUNT_KEY_FILE):
|
if not os.path.exists(ACCOUNT_KEY_FILE):
|
||||||
|
@ -246,7 +246,7 @@ def _certificate_install_letsencrypt(auth, domain_list, force=False, no_checks=F
|
||||||
# If no domains given, consider all yunohost domains with self-signed
|
# If no domains given, consider all yunohost domains with self-signed
|
||||||
# certificates
|
# certificates
|
||||||
if domain_list == []:
|
if domain_list == []:
|
||||||
for domain in yunohost.domain.domain_list(auth)['domains']:
|
for domain in yunohost.domain.domain_list()['domains']:
|
||||||
|
|
||||||
status = _get_status(domain)
|
status = _get_status(domain)
|
||||||
if status["CA_type"]["code"] != "self-signed":
|
if status["CA_type"]["code"] != "self-signed":
|
||||||
|
@ -257,7 +257,7 @@ def _certificate_install_letsencrypt(auth, domain_list, force=False, no_checks=F
|
||||||
# Else, validate that yunohost knows the domains given
|
# Else, validate that yunohost knows the domains given
|
||||||
else:
|
else:
|
||||||
for domain in domain_list:
|
for domain in domain_list:
|
||||||
yunohost_domains_list = yunohost.domain.domain_list(auth)['domains']
|
yunohost_domains_list = yunohost.domain.domain_list()['domains']
|
||||||
if domain not in yunohost_domains_list:
|
if domain not in yunohost_domains_list:
|
||||||
raise YunohostError('certmanager_domain_unknown', domain=domain)
|
raise YunohostError('certmanager_domain_unknown', domain=domain)
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ def _certificate_install_letsencrypt(auth, domain_list, force=False, no_checks=F
|
||||||
|
|
||||||
operation_logger.start()
|
operation_logger.start()
|
||||||
|
|
||||||
_configure_for_acme_challenge(auth, domain)
|
_configure_for_acme_challenge(domain)
|
||||||
_fetch_and_enable_new_certificate(domain, staging, no_checks=no_checks)
|
_fetch_and_enable_new_certificate(domain, staging, no_checks=no_checks)
|
||||||
_install_cron(no_checks=no_checks)
|
_install_cron(no_checks=no_checks)
|
||||||
|
|
||||||
|
@ -300,7 +300,7 @@ def _certificate_install_letsencrypt(auth, domain_list, force=False, no_checks=F
|
||||||
operation_logger.error(msg)
|
operation_logger.error(msg)
|
||||||
|
|
||||||
|
|
||||||
def certificate_renew(auth, domain_list, force=False, no_checks=False, email=False, staging=False):
|
def certificate_renew(domain_list, force=False, no_checks=False, email=False, staging=False):
|
||||||
"""
|
"""
|
||||||
Renew Let's Encrypt certificate for given domains (all by default)
|
Renew Let's Encrypt certificate for given domains (all by default)
|
||||||
|
|
||||||
|
@ -317,7 +317,7 @@ def certificate_renew(auth, domain_list, force=False, no_checks=False, email=Fal
|
||||||
# If no domains given, consider all yunohost domains with Let's Encrypt
|
# If no domains given, consider all yunohost domains with Let's Encrypt
|
||||||
# certificates
|
# certificates
|
||||||
if domain_list == []:
|
if domain_list == []:
|
||||||
for domain in yunohost.domain.domain_list(auth)['domains']:
|
for domain in yunohost.domain.domain_list()['domains']:
|
||||||
|
|
||||||
# Does it have a Let's Encrypt cert?
|
# Does it have a Let's Encrypt cert?
|
||||||
status = _get_status(domain)
|
status = _get_status(domain)
|
||||||
|
@ -344,7 +344,7 @@ def certificate_renew(auth, domain_list, force=False, no_checks=False, email=Fal
|
||||||
for domain in domain_list:
|
for domain in domain_list:
|
||||||
|
|
||||||
# Is it in Yunohost dmomain list?
|
# Is it in Yunohost dmomain list?
|
||||||
if domain not in yunohost.domain.domain_list(auth)['domains']:
|
if domain not in yunohost.domain.domain_list()['domains']:
|
||||||
raise YunohostError('certmanager_domain_unknown', domain=domain)
|
raise YunohostError('certmanager_domain_unknown', domain=domain)
|
||||||
|
|
||||||
status = _get_status(domain)
|
status = _get_status(domain)
|
||||||
|
@ -468,7 +468,7 @@ Subject: %s
|
||||||
smtp.quit()
|
smtp.quit()
|
||||||
|
|
||||||
|
|
||||||
def _configure_for_acme_challenge(auth, domain):
|
def _configure_for_acme_challenge(domain):
|
||||||
|
|
||||||
nginx_conf_folder = "/etc/nginx/conf.d/%s.d" % domain
|
nginx_conf_folder = "/etc/nginx/conf.d/%s.d" % domain
|
||||||
nginx_conf_file = "%s/000-acmechallenge.conf" % nginx_conf_folder
|
nginx_conf_file = "%s/000-acmechallenge.conf" % nginx_conf_folder
|
||||||
|
@ -511,7 +511,7 @@ location ^~ '/.well-known/acme-challenge/'
|
||||||
# any clean function already implemented in yunohost to do this though)
|
# any clean function already implemented in yunohost to do this though)
|
||||||
_run_service_command("reload", "nginx")
|
_run_service_command("reload", "nginx")
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
|
|
||||||
def _check_acme_challenge_configuration(domain):
|
def _check_acme_challenge_configuration(domain):
|
||||||
|
|
|
@ -42,7 +42,7 @@ from yunohost.hook import hook_callback
|
||||||
logger = getActionLogger('yunohost.domain')
|
logger = getActionLogger('yunohost.domain')
|
||||||
|
|
||||||
|
|
||||||
def domain_list(auth):
|
def domain_list():
|
||||||
"""
|
"""
|
||||||
List domains
|
List domains
|
||||||
|
|
||||||
|
@ -52,10 +52,12 @@ def domain_list(auth):
|
||||||
limit -- Maximum number of domain fetched
|
limit -- Maximum number of domain fetched
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
result = ldap.search('ou=domains,dc=yunohost,dc=org', 'virtualdomain=*', ['virtualdomain'])
|
||||||
|
|
||||||
result_list = []
|
result_list = []
|
||||||
|
|
||||||
result = auth.search('ou=domains,dc=yunohost,dc=org', 'virtualdomain=*', ['virtualdomain'])
|
|
||||||
|
|
||||||
for domain in result:
|
for domain in result:
|
||||||
result_list.append(domain['virtualdomain'][0])
|
result_list.append(domain['virtualdomain'][0])
|
||||||
|
|
||||||
|
@ -63,7 +65,7 @@ def domain_list(auth):
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation()
|
@is_unit_operation()
|
||||||
def domain_add(operation_logger, auth, domain, dyndns=False):
|
def domain_add(operation_logger, domain, dyndns=False):
|
||||||
"""
|
"""
|
||||||
Create a custom domain
|
Create a custom domain
|
||||||
|
|
||||||
|
@ -74,9 +76,12 @@ def domain_add(operation_logger, auth, domain, dyndns=False):
|
||||||
"""
|
"""
|
||||||
from yunohost.hook import hook_callback
|
from yunohost.hook import hook_callback
|
||||||
from yunohost.app import app_ssowatconf
|
from yunohost.app import app_ssowatconf
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
auth.validate_uniqueness({'virtualdomain': domain})
|
ldap.validate_uniqueness({'virtualdomain': domain})
|
||||||
except MoulinetteError:
|
except MoulinetteError:
|
||||||
raise YunohostError('domain_exists')
|
raise YunohostError('domain_exists')
|
||||||
|
|
||||||
|
@ -107,18 +112,18 @@ def domain_add(operation_logger, auth, domain, dyndns=False):
|
||||||
'virtualdomain': domain,
|
'virtualdomain': domain,
|
||||||
}
|
}
|
||||||
|
|
||||||
if not auth.add('virtualdomain=%s,ou=domains' % domain, attr_dict):
|
if not ldap.add('virtualdomain=%s,ou=domains' % domain, attr_dict):
|
||||||
raise YunohostError('domain_creation_failed')
|
raise YunohostError('domain_creation_failed')
|
||||||
|
|
||||||
# Don't regen these conf if we're still in postinstall
|
# Don't regen these conf if we're still in postinstall
|
||||||
if os.path.exists('/etc/yunohost/installed'):
|
if os.path.exists('/etc/yunohost/installed'):
|
||||||
regen_conf(names=['nginx', 'metronome', 'dnsmasq', 'postfix', 'rspamd'])
|
regen_conf(names=['nginx', 'metronome', 'dnsmasq', 'postfix', 'rspamd'])
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
# Force domain removal silently
|
# Force domain removal silently
|
||||||
try:
|
try:
|
||||||
domain_remove(auth, domain, True)
|
domain_remove(domain, True)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
raise
|
raise
|
||||||
|
@ -129,7 +134,7 @@ def domain_add(operation_logger, auth, domain, dyndns=False):
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation()
|
@is_unit_operation()
|
||||||
def domain_remove(operation_logger, auth, domain, force=False):
|
def domain_remove(operation_logger, domain, force=False):
|
||||||
"""
|
"""
|
||||||
Delete domains
|
Delete domains
|
||||||
|
|
||||||
|
@ -140,8 +145,9 @@ def domain_remove(operation_logger, auth, domain, force=False):
|
||||||
"""
|
"""
|
||||||
from yunohost.hook import hook_callback
|
from yunohost.hook import hook_callback
|
||||||
from yunohost.app import app_ssowatconf
|
from yunohost.app import app_ssowatconf
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
|
||||||
if not force and domain not in domain_list(auth)['domains']:
|
if not force and domain not in domain_list()['domains']:
|
||||||
raise YunohostError('domain_unknown')
|
raise YunohostError('domain_unknown')
|
||||||
|
|
||||||
# Check domain is not the main domain
|
# Check domain is not the main domain
|
||||||
|
@ -160,13 +166,14 @@ def domain_remove(operation_logger, auth, domain, force=False):
|
||||||
raise YunohostError('domain_uninstall_app_first')
|
raise YunohostError('domain_uninstall_app_first')
|
||||||
|
|
||||||
operation_logger.start()
|
operation_logger.start()
|
||||||
if auth.remove('virtualdomain=' + domain + ',ou=domains') or force:
|
ldap = _get_ldap_interface()
|
||||||
|
if ldap.remove('virtualdomain=' + domain + ',ou=domains') or force:
|
||||||
os.system('rm -rf /etc/yunohost/certs/%s' % domain)
|
os.system('rm -rf /etc/yunohost/certs/%s' % domain)
|
||||||
else:
|
else:
|
||||||
raise YunohostError('domain_deletion_failed')
|
raise YunohostError('domain_deletion_failed')
|
||||||
|
|
||||||
regen_conf(names=['nginx', 'metronome', 'dnsmasq', 'postfix'])
|
regen_conf(names=['nginx', 'metronome', 'dnsmasq', 'postfix'])
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
hook_callback('post_domain_remove', args=[domain])
|
hook_callback('post_domain_remove', args=[domain])
|
||||||
|
|
||||||
|
@ -222,19 +229,19 @@ def domain_dns_conf(domain, ttl=None):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def domain_cert_status(auth, domain_list, full=False):
|
def domain_cert_status(domain_list, full=False):
|
||||||
return yunohost.certificate.certificate_status(auth, domain_list, full)
|
return yunohost.certificate.certificate_status(domain_list, full)
|
||||||
|
|
||||||
|
|
||||||
def domain_cert_install(auth, domain_list, force=False, no_checks=False, self_signed=False, staging=False):
|
def domain_cert_install(domain_list, force=False, no_checks=False, self_signed=False, staging=False):
|
||||||
return yunohost.certificate.certificate_install(auth, domain_list, force, no_checks, self_signed, staging)
|
return yunohost.certificate.certificate_install(domain_list, force, no_checks, self_signed, staging)
|
||||||
|
|
||||||
|
|
||||||
def domain_cert_renew(auth, domain_list, force=False, no_checks=False, email=False, staging=False):
|
def domain_cert_renew(domain_list, force=False, no_checks=False, email=False, staging=False):
|
||||||
return yunohost.certificate.certificate_renew(auth, domain_list, force, no_checks, email, staging)
|
return yunohost.certificate.certificate_renew(domain_list, force, no_checks, email, staging)
|
||||||
|
|
||||||
|
|
||||||
def _get_conflicting_apps(auth, domain, path, ignore_app=None):
|
def _get_conflicting_apps(domain, path, ignore_app=None):
|
||||||
"""
|
"""
|
||||||
Return a list of all conflicting apps with a domain/path (it can be empty)
|
Return a list of all conflicting apps with a domain/path (it can be empty)
|
||||||
|
|
||||||
|
@ -247,7 +254,7 @@ def _get_conflicting_apps(auth, domain, path, ignore_app=None):
|
||||||
domain, path = _normalize_domain_path(domain, path)
|
domain, path = _normalize_domain_path(domain, path)
|
||||||
|
|
||||||
# Abort if domain is unknown
|
# Abort if domain is unknown
|
||||||
if domain not in domain_list(auth)['domains']:
|
if domain not in domain_list()['domains']:
|
||||||
raise YunohostError('domain_unknown')
|
raise YunohostError('domain_unknown')
|
||||||
|
|
||||||
# This import cannot be put on top of file because it would create a
|
# This import cannot be put on top of file because it would create a
|
||||||
|
@ -274,7 +281,7 @@ def _get_conflicting_apps(auth, domain, path, ignore_app=None):
|
||||||
return conflicts
|
return conflicts
|
||||||
|
|
||||||
|
|
||||||
def domain_url_available(auth, domain, path):
|
def domain_url_available(domain, path):
|
||||||
"""
|
"""
|
||||||
Check availability of a web path
|
Check availability of a web path
|
||||||
|
|
||||||
|
@ -283,7 +290,7 @@ def domain_url_available(auth, domain, path):
|
||||||
path -- The path to check (e.g. /coffee)
|
path -- The path to check (e.g. /coffee)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return len(_get_conflicting_apps(auth, domain, path)) == 0
|
return len(_get_conflicting_apps(domain, path)) == 0
|
||||||
|
|
||||||
|
|
||||||
def _get_maindomain():
|
def _get_maindomain():
|
||||||
|
|
|
@ -208,7 +208,7 @@ def log_display(path, number=50, share=False):
|
||||||
|
|
||||||
|
|
||||||
def is_unit_operation(entities=['app', 'domain', 'service', 'user'],
|
def is_unit_operation(entities=['app', 'domain', 'service', 'user'],
|
||||||
exclude=['auth', 'password'], operation_key=None):
|
exclude=['password'], operation_key=None):
|
||||||
"""
|
"""
|
||||||
Configure quickly a unit operation
|
Configure quickly a unit operation
|
||||||
|
|
||||||
|
@ -222,9 +222,8 @@ def is_unit_operation(entities=['app', 'domain', 'service', 'user'],
|
||||||
(argname, entity_type) instead of just put the entity type.
|
(argname, entity_type) instead of just put the entity type.
|
||||||
|
|
||||||
exclude Remove some arguments from the context. By default, arguments
|
exclude Remove some arguments from the context. By default, arguments
|
||||||
called 'password' and 'auth' are removed. If an argument is an object, you
|
called 'password' are removed. If an argument is an object, you need to
|
||||||
need to exclude it or create manually the unit operation without this
|
exclude it or create manually the unit operation without this decorator.
|
||||||
decorator.
|
|
||||||
|
|
||||||
operation_key A key to describe the unit operation log used to create the
|
operation_key A key to describe the unit operation log used to create the
|
||||||
filename and search a translation. Please ensure that this key prefixed by
|
filename and search a translation. Please ensure that this key prefixed by
|
||||||
|
|
|
@ -11,7 +11,7 @@ from moulinette.utils.filesystem import read_file, write_to_file, chown, chmod,
|
||||||
SSHD_CONFIG_PATH = "/etc/ssh/sshd_config"
|
SSHD_CONFIG_PATH = "/etc/ssh/sshd_config"
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_allow(auth, username):
|
def user_ssh_allow(username):
|
||||||
"""
|
"""
|
||||||
Allow YunoHost user connect as ssh.
|
Allow YunoHost user connect as ssh.
|
||||||
|
|
||||||
|
@ -20,17 +20,19 @@ def user_ssh_allow(auth, username):
|
||||||
"""
|
"""
|
||||||
# TODO it would be good to support different kind of shells
|
# TODO it would be good to support different kind of shells
|
||||||
|
|
||||||
if not _get_user_for_ssh(auth, username):
|
if not _get_user_for_ssh(username):
|
||||||
raise YunohostError('user_unknown', user=username)
|
raise YunohostError('user_unknown', user=username)
|
||||||
|
|
||||||
auth.update('uid=%s,ou=users' % username, {'loginShell': '/bin/bash'})
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
ldap.update('uid=%s,ou=users' % username, {'loginShell': '/bin/bash'})
|
||||||
|
|
||||||
# Somehow this is needed otherwise the PAM thing doesn't forget about the
|
# Somehow this is needed otherwise the PAM thing doesn't forget about the
|
||||||
# old loginShell value ?
|
# old loginShell value ?
|
||||||
subprocess.call(['nscd', '-i', 'passwd'])
|
subprocess.call(['nscd', '-i', 'passwd'])
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_disallow(auth, username):
|
def user_ssh_disallow(username):
|
||||||
"""
|
"""
|
||||||
Disallow YunoHost user connect as ssh.
|
Disallow YunoHost user connect as ssh.
|
||||||
|
|
||||||
|
@ -39,18 +41,20 @@ def user_ssh_disallow(auth, username):
|
||||||
"""
|
"""
|
||||||
# TODO it would be good to support different kind of shells
|
# TODO it would be good to support different kind of shells
|
||||||
|
|
||||||
if not _get_user_for_ssh(auth, username):
|
if not _get_user_for_ssh(username):
|
||||||
raise YunohostError('user_unknown', user=username)
|
raise YunohostError('user_unknown', user=username)
|
||||||
|
|
||||||
auth.update('uid=%s,ou=users' % username, {'loginShell': '/bin/false'})
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
ldap.update('uid=%s,ou=users' % username, {'loginShell': '/bin/false'})
|
||||||
|
|
||||||
# Somehow this is needed otherwise the PAM thing doesn't forget about the
|
# Somehow this is needed otherwise the PAM thing doesn't forget about the
|
||||||
# old loginShell value ?
|
# old loginShell value ?
|
||||||
subprocess.call(['nscd', '-i', 'passwd'])
|
subprocess.call(['nscd', '-i', 'passwd'])
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_list_keys(auth, username):
|
def user_ssh_list_keys(username):
|
||||||
user = _get_user_for_ssh(auth, username, ["homeDirectory"])
|
user = _get_user_for_ssh(username, ["homeDirectory"])
|
||||||
if not user:
|
if not user:
|
||||||
raise Exception("User with username '%s' doesn't exists" % username)
|
raise Exception("User with username '%s' doesn't exists" % username)
|
||||||
|
|
||||||
|
@ -82,8 +86,8 @@ def user_ssh_list_keys(auth, username):
|
||||||
return {"keys": keys}
|
return {"keys": keys}
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_add_key(auth, username, key, comment):
|
def user_ssh_add_key(username, key, comment):
|
||||||
user = _get_user_for_ssh(auth, username, ["homeDirectory", "uid"])
|
user = _get_user_for_ssh(username, ["homeDirectory", "uid"])
|
||||||
if not user:
|
if not user:
|
||||||
raise Exception("User with username '%s' doesn't exists" % username)
|
raise Exception("User with username '%s' doesn't exists" % username)
|
||||||
|
|
||||||
|
@ -116,8 +120,8 @@ def user_ssh_add_key(auth, username, key, comment):
|
||||||
write_to_file(authorized_keys_file, authorized_keys_content)
|
write_to_file(authorized_keys_file, authorized_keys_content)
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_remove_key(auth, username, key):
|
def user_ssh_remove_key(username, key):
|
||||||
user = _get_user_for_ssh(auth, username, ["homeDirectory", "uid"])
|
user = _get_user_for_ssh(username, ["homeDirectory", "uid"])
|
||||||
if not user:
|
if not user:
|
||||||
raise Exception("User with username '%s' doesn't exists" % username)
|
raise Exception("User with username '%s' doesn't exists" % username)
|
||||||
|
|
||||||
|
@ -148,8 +152,8 @@ def user_ssh_remove_key(auth, username, key):
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
def _get_user_for_ssh(auth, username, attrs=None):
|
def _get_user_for_ssh(username, attrs=None):
|
||||||
def ssh_root_login_status(auth):
|
def ssh_root_login_status():
|
||||||
# XXX temporary placed here for when the ssh_root commands are integrated
|
# XXX temporary placed here for when the ssh_root commands are integrated
|
||||||
# extracted from https://github.com/YunoHost/yunohost/pull/345
|
# extracted from https://github.com/YunoHost/yunohost/pull/345
|
||||||
# XXX should we support all the options?
|
# XXX should we support all the options?
|
||||||
|
@ -172,7 +176,7 @@ def _get_user_for_ssh(auth, username, attrs=None):
|
||||||
'username': 'root',
|
'username': 'root',
|
||||||
'fullname': '',
|
'fullname': '',
|
||||||
'mail': '',
|
'mail': '',
|
||||||
'ssh_allowed': ssh_root_login_status(auth)["PermitRootLogin"],
|
'ssh_allowed': ssh_root_login_status()["PermitRootLogin"],
|
||||||
'shell': root_unix.pw_shell,
|
'shell': root_unix.pw_shell,
|
||||||
'home_path': root_unix.pw_dir,
|
'home_path': root_unix.pw_dir,
|
||||||
}
|
}
|
||||||
|
@ -189,7 +193,9 @@ def _get_user_for_ssh(auth, username, attrs=None):
|
||||||
}
|
}
|
||||||
|
|
||||||
# TODO escape input using https://www.python-ldap.org/doc/html/ldap-filter.html
|
# TODO escape input using https://www.python-ldap.org/doc/html/ldap-filter.html
|
||||||
user = auth.search('ou=users,dc=yunohost,dc=org',
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
user = ldap.search('ou=users,dc=yunohost,dc=org',
|
||||||
'(&(objectclass=person)(uid=%s))' % username,
|
'(&(objectclass=person)(uid=%s))' % username,
|
||||||
attrs)
|
attrs)
|
||||||
|
|
||||||
|
|
|
@ -111,10 +111,9 @@ def tools_ldapinit():
|
||||||
raise YunohostError('installation_failed')
|
raise YunohostError('installation_failed')
|
||||||
|
|
||||||
logger.success(m18n.n('ldap_initialized'))
|
logger.success(m18n.n('ldap_initialized'))
|
||||||
return auth
|
|
||||||
|
|
||||||
|
|
||||||
def tools_adminpw(auth, new_password, check_strength=True):
|
def tools_adminpw(new_password, check_strength=True):
|
||||||
"""
|
"""
|
||||||
Change admin password
|
Change admin password
|
||||||
|
|
||||||
|
@ -136,8 +135,11 @@ def tools_adminpw(auth, new_password, check_strength=True):
|
||||||
|
|
||||||
new_hash = _hash_user_password(new_password)
|
new_hash = _hash_user_password(new_password)
|
||||||
|
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
auth.update("cn=admin", {"userPassword": new_hash, })
|
ldap.update("cn=admin", {"userPassword": new_hash, })
|
||||||
except:
|
except:
|
||||||
logger.exception('unable to change admin password')
|
logger.exception('unable to change admin password')
|
||||||
raise YunohostError('admin_password_change_failed')
|
raise YunohostError('admin_password_change_failed')
|
||||||
|
@ -161,7 +163,7 @@ def tools_adminpw(auth, new_password, check_strength=True):
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation()
|
@is_unit_operation()
|
||||||
def tools_maindomain(operation_logger, auth, new_domain=None):
|
def tools_maindomain(operation_logger, new_domain=None):
|
||||||
"""
|
"""
|
||||||
Check the current main domain, or change it
|
Check the current main domain, or change it
|
||||||
|
|
||||||
|
@ -175,7 +177,7 @@ def tools_maindomain(operation_logger, auth, new_domain=None):
|
||||||
return {'current_main_domain': _get_maindomain()}
|
return {'current_main_domain': _get_maindomain()}
|
||||||
|
|
||||||
# Check domain exists
|
# Check domain exists
|
||||||
if new_domain not in domain_list(auth)['domains']:
|
if new_domain not in domain_list()['domains']:
|
||||||
raise YunohostError('domain_unknown')
|
raise YunohostError('domain_unknown')
|
||||||
|
|
||||||
operation_logger.related_to.append(('domain', new_domain))
|
operation_logger.related_to.append(('domain', new_domain))
|
||||||
|
@ -204,7 +206,7 @@ def tools_maindomain(operation_logger, auth, new_domain=None):
|
||||||
_set_hostname(new_domain)
|
_set_hostname(new_domain)
|
||||||
|
|
||||||
# Generate SSOwat configuration file
|
# Generate SSOwat configuration file
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
# Regen configurations
|
# Regen configurations
|
||||||
try:
|
try:
|
||||||
|
@ -331,7 +333,7 @@ def tools_postinstall(operation_logger, domain, password, ignore_dyndns=False,
|
||||||
|
|
||||||
# Initialize LDAP for YunoHost
|
# Initialize LDAP for YunoHost
|
||||||
# TODO: Improve this part by integrate ldapinit into conf_regen hook
|
# TODO: Improve this part by integrate ldapinit into conf_regen hook
|
||||||
auth = tools_ldapinit()
|
tools_ldapinit()
|
||||||
|
|
||||||
# Create required folders
|
# Create required folders
|
||||||
folders_to_create = [
|
folders_to_create = [
|
||||||
|
@ -405,11 +407,11 @@ def tools_postinstall(operation_logger, domain, password, ignore_dyndns=False,
|
||||||
|
|
||||||
# New domain config
|
# New domain config
|
||||||
regen_conf(['nsswitch'], force=True)
|
regen_conf(['nsswitch'], force=True)
|
||||||
domain_add(auth, domain, dyndns)
|
domain_add(domain, dyndns)
|
||||||
tools_maindomain(auth, domain)
|
tools_maindomain(domain)
|
||||||
|
|
||||||
# Change LDAP admin password
|
# Change LDAP admin password
|
||||||
tools_adminpw(auth, password, check_strength=not force_password)
|
tools_adminpw(password, check_strength=not force_password)
|
||||||
|
|
||||||
# Enable UPnP silently and reload firewall
|
# Enable UPnP silently and reload firewall
|
||||||
firewall_upnp('enable', no_refresh=True)
|
firewall_upnp('enable', no_refresh=True)
|
||||||
|
@ -573,7 +575,7 @@ def _dump_sources_list():
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation()
|
@is_unit_operation()
|
||||||
def tools_upgrade(operation_logger, auth, ignore_apps=False, ignore_packages=False):
|
def tools_upgrade(operation_logger, ignore_apps=False, ignore_packages=False):
|
||||||
"""
|
"""
|
||||||
Update apps & package cache, then display changelog
|
Update apps & package cache, then display changelog
|
||||||
|
|
||||||
|
@ -645,7 +647,7 @@ def tools_upgrade(operation_logger, auth, ignore_apps=False, ignore_packages=Fal
|
||||||
|
|
||||||
if not ignore_apps:
|
if not ignore_apps:
|
||||||
try:
|
try:
|
||||||
app_upgrade(auth)
|
app_upgrade()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
failure = True
|
failure = True
|
||||||
logger.warning('unable to upgrade apps: %s' % str(e))
|
logger.warning('unable to upgrade apps: %s' % str(e))
|
||||||
|
@ -659,7 +661,7 @@ def tools_upgrade(operation_logger, auth, ignore_apps=False, ignore_packages=Fal
|
||||||
return {"log": service_log('yunohost-api', number="100").values()[0]}
|
return {"log": service_log('yunohost-api', number="100").values()[0]}
|
||||||
|
|
||||||
|
|
||||||
def tools_diagnosis(auth, private=False):
|
def tools_diagnosis(private=False):
|
||||||
"""
|
"""
|
||||||
Return global info about current yunohost instance to help debugging
|
Return global info about current yunohost instance to help debugging
|
||||||
|
|
||||||
|
@ -754,7 +756,7 @@ def tools_diagnosis(auth, private=False):
|
||||||
diagnosis['private']['public_ip']['IPv6'] = get_public_ip(6)
|
diagnosis['private']['public_ip']['IPv6'] = get_public_ip(6)
|
||||||
|
|
||||||
# Domains
|
# Domains
|
||||||
diagnosis['private']['domains'] = domain_list(auth)['domains']
|
diagnosis['private']['domains'] = domain_list()['domains']
|
||||||
|
|
||||||
diagnosis['private']['regen_conf'] = regen_conf(with_diff=True, dry_run=True)
|
diagnosis['private']['regen_conf'] = regen_conf(with_diff=True, dry_run=True)
|
||||||
|
|
||||||
|
@ -1078,18 +1080,21 @@ def tools_migrations_state():
|
||||||
return read_json(MIGRATIONS_STATE_PATH)
|
return read_json(MIGRATIONS_STATE_PATH)
|
||||||
|
|
||||||
|
|
||||||
def tools_shell(auth, command=None):
|
def tools_shell(command=None):
|
||||||
"""
|
"""
|
||||||
Launch an (i)python shell in the YunoHost context.
|
Launch an (i)python shell in the YunoHost context.
|
||||||
|
|
||||||
This is entirely aim for development.
|
This is entirely aim for development.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
|
||||||
if command:
|
if command:
|
||||||
exec(command)
|
exec(command)
|
||||||
return
|
return
|
||||||
|
|
||||||
logger.warn("The \033[1;34mauth\033[0m is available in this context")
|
logger.warn("The \033[1;34mldap\033[0m interface is available in this context")
|
||||||
try:
|
try:
|
||||||
from IPython import embed
|
from IPython import embed
|
||||||
embed()
|
embed()
|
||||||
|
|
|
@ -41,7 +41,7 @@ from yunohost.log import is_unit_operation
|
||||||
logger = getActionLogger('yunohost.user')
|
logger = getActionLogger('yunohost.user')
|
||||||
|
|
||||||
|
|
||||||
def user_list(auth, fields=None):
|
def user_list(fields=None):
|
||||||
"""
|
"""
|
||||||
List users
|
List users
|
||||||
|
|
||||||
|
@ -52,6 +52,8 @@ def user_list(auth, fields=None):
|
||||||
fields -- fields to fetch
|
fields -- fields to fetch
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
|
||||||
user_attrs = {
|
user_attrs = {
|
||||||
'uid': 'username',
|
'uid': 'username',
|
||||||
'cn': 'fullname',
|
'cn': 'fullname',
|
||||||
|
@ -75,7 +77,8 @@ def user_list(auth, fields=None):
|
||||||
else:
|
else:
|
||||||
attrs = ['uid', 'cn', 'mail', 'mailuserquota', 'loginShell']
|
attrs = ['uid', 'cn', 'mail', 'mailuserquota', 'loginShell']
|
||||||
|
|
||||||
result = auth.search('ou=users,dc=yunohost,dc=org',
|
ldap = _get_ldap_interface()
|
||||||
|
result = ldap.search('ou=users,dc=yunohost,dc=org',
|
||||||
'(&(objectclass=person)(!(uid=root))(!(uid=nobody)))',
|
'(&(objectclass=person)(!(uid=root))(!(uid=nobody)))',
|
||||||
attrs)
|
attrs)
|
||||||
|
|
||||||
|
@ -98,7 +101,7 @@ def user_list(auth, fields=None):
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation([('username', 'user')])
|
@is_unit_operation([('username', 'user')])
|
||||||
def user_create(operation_logger, auth, username, firstname, lastname, mail, password,
|
def user_create(operation_logger, username, firstname, lastname, mail, password,
|
||||||
mailbox_quota="0"):
|
mailbox_quota="0"):
|
||||||
"""
|
"""
|
||||||
Create user
|
Create user
|
||||||
|
@ -116,12 +119,15 @@ def user_create(operation_logger, auth, username, firstname, lastname, mail, pas
|
||||||
from yunohost.hook import hook_callback
|
from yunohost.hook import hook_callback
|
||||||
from yunohost.app import app_ssowatconf
|
from yunohost.app import app_ssowatconf
|
||||||
from yunohost.utils.password import assert_password_is_strong_enough
|
from yunohost.utils.password import assert_password_is_strong_enough
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
|
||||||
# Ensure sufficiently complex password
|
# Ensure sufficiently complex password
|
||||||
assert_password_is_strong_enough("user", password)
|
assert_password_is_strong_enough("user", password)
|
||||||
|
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
|
||||||
# Validate uniqueness of username and mail in LDAP
|
# Validate uniqueness of username and mail in LDAP
|
||||||
auth.validate_uniqueness({
|
ldap.validate_uniqueness({
|
||||||
'uid': username,
|
'uid': username,
|
||||||
'mail': mail
|
'mail': mail
|
||||||
})
|
})
|
||||||
|
@ -143,7 +149,7 @@ def user_create(operation_logger, auth, username, firstname, lastname, mail, pas
|
||||||
raise YunohostError('mail_unavailable')
|
raise YunohostError('mail_unavailable')
|
||||||
|
|
||||||
# Check that the mail domain exists
|
# Check that the mail domain exists
|
||||||
if mail.split("@")[1] not in domain_list(auth)['domains']:
|
if mail.split("@")[1] not in domain_list()['domains']:
|
||||||
raise YunohostError('mail_domain_unknown', domain=mail.split("@")[1])
|
raise YunohostError('mail_domain_unknown', domain=mail.split("@")[1])
|
||||||
|
|
||||||
operation_logger.start()
|
operation_logger.start()
|
||||||
|
@ -177,7 +183,7 @@ def user_create(operation_logger, auth, username, firstname, lastname, mail, pas
|
||||||
}
|
}
|
||||||
|
|
||||||
# If it is the first user, add some aliases
|
# If it is the first user, add some aliases
|
||||||
if not auth.search(base='ou=users,dc=yunohost,dc=org', filter='uid=*'):
|
if not ldap.search(base='ou=users,dc=yunohost,dc=org', filter='uid=*'):
|
||||||
attr_dict['mail'] = [attr_dict['mail']] + aliases
|
attr_dict['mail'] = [attr_dict['mail']] + aliases
|
||||||
|
|
||||||
# If exists, remove the redirection from the SSO
|
# If exists, remove the redirection from the SSO
|
||||||
|
@ -197,14 +203,14 @@ def user_create(operation_logger, auth, username, firstname, lastname, mail, pas
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
raise YunohostError('ssowat_persistent_conf_write_error', error=e.strerror)
|
raise YunohostError('ssowat_persistent_conf_write_error', error=e.strerror)
|
||||||
|
|
||||||
if auth.add('uid=%s,ou=users' % username, attr_dict):
|
if ldap.add('uid=%s,ou=users' % username, attr_dict):
|
||||||
# Invalidate passwd to take user creation into account
|
# Invalidate passwd to take user creation into account
|
||||||
subprocess.call(['nscd', '-i', 'passwd'])
|
subprocess.call(['nscd', '-i', 'passwd'])
|
||||||
|
|
||||||
# Update SFTP user group
|
# Update SFTP user group
|
||||||
memberlist = auth.search(filter='cn=sftpusers', attrs=['memberUid'])[0]['memberUid']
|
memberlist = ldap.search(filter='cn=sftpusers', attrs=['memberUid'])[0]['memberUid']
|
||||||
memberlist.append(username)
|
memberlist.append(username)
|
||||||
if auth.update('cn=sftpusers,ou=groups', {'memberUid': memberlist}):
|
if ldap.update('cn=sftpusers,ou=groups', {'memberUid': memberlist}):
|
||||||
try:
|
try:
|
||||||
# Attempt to create user home folder
|
# Attempt to create user home folder
|
||||||
subprocess.check_call(
|
subprocess.check_call(
|
||||||
|
@ -213,7 +219,7 @@ def user_create(operation_logger, auth, username, firstname, lastname, mail, pas
|
||||||
if not os.path.isdir('/home/{0}'.format(username)):
|
if not os.path.isdir('/home/{0}'.format(username)):
|
||||||
logger.warning(m18n.n('user_home_creation_failed'),
|
logger.warning(m18n.n('user_home_creation_failed'),
|
||||||
exc_info=1)
|
exc_info=1)
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
# TODO: Send a welcome mail to user
|
# TODO: Send a welcome mail to user
|
||||||
logger.success(m18n.n('user_created'))
|
logger.success(m18n.n('user_created'))
|
||||||
hook_callback('post_user_create',
|
hook_callback('post_user_create',
|
||||||
|
@ -225,7 +231,7 @@ def user_create(operation_logger, auth, username, firstname, lastname, mail, pas
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation([('username', 'user')])
|
@is_unit_operation([('username', 'user')])
|
||||||
def user_delete(operation_logger, auth, username, purge=False):
|
def user_delete(operation_logger, username, purge=False):
|
||||||
"""
|
"""
|
||||||
Delete user
|
Delete user
|
||||||
|
|
||||||
|
@ -236,34 +242,37 @@ def user_delete(operation_logger, auth, username, purge=False):
|
||||||
"""
|
"""
|
||||||
from yunohost.app import app_ssowatconf
|
from yunohost.app import app_ssowatconf
|
||||||
from yunohost.hook import hook_callback
|
from yunohost.hook import hook_callback
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
|
||||||
operation_logger.start()
|
operation_logger.start()
|
||||||
if auth.remove('uid=%s,ou=users' % username):
|
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
if ldap.remove('uid=%s,ou=users' % username):
|
||||||
# Invalidate passwd to take user deletion into account
|
# Invalidate passwd to take user deletion into account
|
||||||
subprocess.call(['nscd', '-i', 'passwd'])
|
subprocess.call(['nscd', '-i', 'passwd'])
|
||||||
|
|
||||||
# Update SFTP user group
|
# Update SFTP user group
|
||||||
memberlist = auth.search(filter='cn=sftpusers', attrs=['memberUid'])[0]['memberUid']
|
memberlist = ldap.search(filter='cn=sftpusers', attrs=['memberUid'])[0]['memberUid']
|
||||||
try:
|
try:
|
||||||
memberlist.remove(username)
|
memberlist.remove(username)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if auth.update('cn=sftpusers,ou=groups', {'memberUid': memberlist}):
|
if ldap.update('cn=sftpusers,ou=groups', {'memberUid': memberlist}):
|
||||||
if purge:
|
if purge:
|
||||||
subprocess.call(['rm', '-rf', '/home/{0}'.format(username)])
|
subprocess.call(['rm', '-rf', '/home/{0}'.format(username)])
|
||||||
subprocess.call(['rm', '-rf', '/var/mail/{0}'.format(username)])
|
subprocess.call(['rm', '-rf', '/var/mail/{0}'.format(username)])
|
||||||
else:
|
else:
|
||||||
raise YunohostError('user_deletion_failed')
|
raise YunohostError('user_deletion_failed')
|
||||||
|
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
|
|
||||||
hook_callback('post_user_delete', args=[username, purge])
|
hook_callback('post_user_delete', args=[username, purge])
|
||||||
|
|
||||||
logger.success(m18n.n('user_deleted'))
|
logger.success(m18n.n('user_deleted'))
|
||||||
|
|
||||||
|
|
||||||
@is_unit_operation([('username', 'user')], exclude=['auth', 'change_password'])
|
@is_unit_operation([('username', 'user')], exclude=['change_password'])
|
||||||
def user_update(operation_logger, auth, username, firstname=None, lastname=None, mail=None,
|
def user_update(operation_logger, username, firstname=None, lastname=None, mail=None,
|
||||||
change_password=None, add_mailforward=None, remove_mailforward=None,
|
change_password=None, add_mailforward=None, remove_mailforward=None,
|
||||||
add_mailalias=None, remove_mailalias=None, mailbox_quota=None):
|
add_mailalias=None, remove_mailalias=None, mailbox_quota=None):
|
||||||
"""
|
"""
|
||||||
|
@ -284,13 +293,15 @@ def user_update(operation_logger, auth, username, firstname=None, lastname=None,
|
||||||
from yunohost.domain import domain_list, _get_maindomain
|
from yunohost.domain import domain_list, _get_maindomain
|
||||||
from yunohost.app import app_ssowatconf
|
from yunohost.app import app_ssowatconf
|
||||||
from yunohost.utils.password import assert_password_is_strong_enough
|
from yunohost.utils.password import assert_password_is_strong_enough
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
attrs_to_fetch = ['givenName', 'sn', 'mail', 'maildrop']
|
attrs_to_fetch = ['givenName', 'sn', 'mail', 'maildrop']
|
||||||
new_attr_dict = {}
|
new_attr_dict = {}
|
||||||
domains = domain_list(auth)['domains']
|
domains = domain_list()['domains']
|
||||||
|
|
||||||
# Populate user informations
|
# Populate user informations
|
||||||
result = auth.search(base='ou=users,dc=yunohost,dc=org', filter='uid=' + username, attrs=attrs_to_fetch)
|
result = ldap.search(base='ou=users,dc=yunohost,dc=org', filter='uid=' + username, attrs=attrs_to_fetch)
|
||||||
if not result:
|
if not result:
|
||||||
raise YunohostError('user_unknown', user=username)
|
raise YunohostError('user_unknown', user=username)
|
||||||
user = result[0]
|
user = result[0]
|
||||||
|
@ -321,7 +332,7 @@ def user_update(operation_logger, auth, username, firstname=None, lastname=None,
|
||||||
'webmaster@' + main_domain,
|
'webmaster@' + main_domain,
|
||||||
'postmaster@' + main_domain,
|
'postmaster@' + main_domain,
|
||||||
]
|
]
|
||||||
auth.validate_uniqueness({'mail': mail})
|
ldap.validate_uniqueness({'mail': mail})
|
||||||
if mail[mail.find('@') + 1:] not in domains:
|
if mail[mail.find('@') + 1:] not in domains:
|
||||||
raise YunohostError('mail_domain_unknown', domain=mail[mail.find('@') + 1:])
|
raise YunohostError('mail_domain_unknown', domain=mail[mail.find('@') + 1:])
|
||||||
if mail in aliases:
|
if mail in aliases:
|
||||||
|
@ -334,7 +345,7 @@ def user_update(operation_logger, auth, username, firstname=None, lastname=None,
|
||||||
if not isinstance(add_mailalias, list):
|
if not isinstance(add_mailalias, list):
|
||||||
add_mailalias = [add_mailalias]
|
add_mailalias = [add_mailalias]
|
||||||
for mail in add_mailalias:
|
for mail in add_mailalias:
|
||||||
auth.validate_uniqueness({'mail': mail})
|
ldap.validate_uniqueness({'mail': mail})
|
||||||
if mail[mail.find('@') + 1:] not in domains:
|
if mail[mail.find('@') + 1:] not in domains:
|
||||||
raise YunohostError('mail_domain_unknown', domain=mail[mail.find('@') + 1:])
|
raise YunohostError('mail_domain_unknown', domain=mail[mail.find('@') + 1:])
|
||||||
user['mail'].append(mail)
|
user['mail'].append(mail)
|
||||||
|
@ -374,15 +385,15 @@ def user_update(operation_logger, auth, username, firstname=None, lastname=None,
|
||||||
|
|
||||||
operation_logger.start()
|
operation_logger.start()
|
||||||
|
|
||||||
if auth.update('uid=%s,ou=users' % username, new_attr_dict):
|
if ldap.update('uid=%s,ou=users' % username, new_attr_dict):
|
||||||
logger.success(m18n.n('user_updated'))
|
logger.success(m18n.n('user_updated'))
|
||||||
app_ssowatconf(auth)
|
app_ssowatconf()
|
||||||
return user_info(auth, username)
|
return user_info(username)
|
||||||
else:
|
else:
|
||||||
raise YunohostError('user_update_failed')
|
raise YunohostError('user_update_failed')
|
||||||
|
|
||||||
|
|
||||||
def user_info(auth, username):
|
def user_info(username):
|
||||||
"""
|
"""
|
||||||
Get user informations
|
Get user informations
|
||||||
|
|
||||||
|
@ -390,6 +401,10 @@ def user_info(auth, username):
|
||||||
username -- Username or mail to get informations
|
username -- Username or mail to get informations
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from yunohost.utils.ldap import _get_ldap_interface
|
||||||
|
|
||||||
|
ldap = _get_ldap_interface()
|
||||||
|
|
||||||
user_attrs = [
|
user_attrs = [
|
||||||
'cn', 'mail', 'uid', 'maildrop', 'givenName', 'sn', 'mailuserquota'
|
'cn', 'mail', 'uid', 'maildrop', 'givenName', 'sn', 'mailuserquota'
|
||||||
]
|
]
|
||||||
|
@ -399,7 +414,7 @@ def user_info(auth, username):
|
||||||
else:
|
else:
|
||||||
filter = 'uid=' + username
|
filter = 'uid=' + username
|
||||||
|
|
||||||
result = auth.search('ou=users,dc=yunohost,dc=org', filter, user_attrs)
|
result = ldap.search('ou=users,dc=yunohost,dc=org', filter, user_attrs)
|
||||||
|
|
||||||
if result:
|
if result:
|
||||||
user = result[0]
|
user = result[0]
|
||||||
|
@ -469,24 +484,24 @@ def user_info(auth, username):
|
||||||
import yunohost.ssh
|
import yunohost.ssh
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_allow(auth, username):
|
def user_ssh_allow(username):
|
||||||
return yunohost.ssh.user_ssh_allow(auth, username)
|
return yunohost.ssh.user_ssh_allow(username)
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_disallow(auth, username):
|
def user_ssh_disallow(username):
|
||||||
return yunohost.ssh.user_ssh_disallow(auth, username)
|
return yunohost.ssh.user_ssh_disallow(username)
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_list_keys(auth, username):
|
def user_ssh_list_keys(username):
|
||||||
return yunohost.ssh.user_ssh_list_keys(auth, username)
|
return yunohost.ssh.user_ssh_list_keys(username)
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_add_key(auth, username, key, comment):
|
def user_ssh_add_key(username, key, comment):
|
||||||
return yunohost.ssh.user_ssh_add_key(auth, username, key, comment)
|
return yunohost.ssh.user_ssh_add_key(username, key, comment)
|
||||||
|
|
||||||
|
|
||||||
def user_ssh_remove_key(auth, username, key):
|
def user_ssh_remove_key(username, key):
|
||||||
return yunohost.ssh.user_ssh_remove_key(auth, username, key)
|
return yunohost.ssh.user_ssh_remove_key(username, key)
|
||||||
|
|
||||||
#
|
#
|
||||||
# End SSH subcategory
|
# End SSH subcategory
|
||||||
|
|
Loading…
Add table
Reference in a new issue