mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
Merge pull request #512 from YunoHost/better_error_path_conflict
Better error path conflict
This commit is contained in:
commit
ff33d8c3c8
3 changed files with 45 additions and 17 deletions
|
@ -21,7 +21,7 @@
|
||||||
"app_location_already_used": "The app '{app}' is already installed on that location ({path})",
|
"app_location_already_used": "The app '{app}' is already installed on that location ({path})",
|
||||||
"app_make_default_location_already_used": "Can't make the app '{app}' the default on the domain {domain} is already used by the other app '{other_app}'",
|
"app_make_default_location_already_used": "Can't make the app '{app}' the default on the domain {domain} is already used by the other app '{other_app}'",
|
||||||
"app_location_install_failed": "Unable to install the app in this location because it conflit with the app '{other_app}' already installed on '{other_path}'",
|
"app_location_install_failed": "Unable to install the app in this location because it conflit with the app '{other_app}' already installed on '{other_path}'",
|
||||||
"app_location_unavailable": "This url is not available or conflicts with an already installed app",
|
"app_location_unavailable": "This url is not available or conflicts with the already installed app(s):\n{apps:s}",
|
||||||
"app_manifest_invalid": "Invalid app manifest: {error}",
|
"app_manifest_invalid": "Invalid app manifest: {error}",
|
||||||
"app_no_upgrade": "No app to upgrade",
|
"app_no_upgrade": "No app to upgrade",
|
||||||
"app_not_correctly_installed": "{app:s} seems to be incorrectly installed",
|
"app_not_correctly_installed": "{app:s} seems to be incorrectly installed",
|
||||||
|
|
|
@ -1147,7 +1147,7 @@ def app_register_url(auth, app, domain, path):
|
||||||
|
|
||||||
# This line can't be moved on top of file, otherwise it creates an infinite
|
# This line can't be moved on top of file, otherwise it creates an infinite
|
||||||
# loop of import with tools.py...
|
# loop of import with tools.py...
|
||||||
from domain import domain_url_available, _normalize_domain_path
|
from domain import _get_conflicting_apps, _normalize_domain_path
|
||||||
|
|
||||||
domain, path = _normalize_domain_path(domain, path)
|
domain, path = _normalize_domain_path(domain, path)
|
||||||
|
|
||||||
|
@ -1163,9 +1163,18 @@ def app_register_url(auth, app, domain, path):
|
||||||
m18n.n('app_already_installed_cant_change_url'))
|
m18n.n('app_already_installed_cant_change_url'))
|
||||||
|
|
||||||
# Check the url is available
|
# Check the url is available
|
||||||
if not domain_url_available(auth, domain, path):
|
conflicts = _get_conflicting_apps(auth, domain, path)
|
||||||
raise MoulinetteError(errno.EINVAL,
|
if conflicts:
|
||||||
m18n.n('app_location_unavailable'))
|
apps = []
|
||||||
|
for path, app_id, app_label in conflicts:
|
||||||
|
apps.append(" * {domain:s}{path:s} → {app_label:s} ({app_id:s})".format(
|
||||||
|
domain=domain,
|
||||||
|
path=path,
|
||||||
|
app_id=app_id,
|
||||||
|
app_label=app_label,
|
||||||
|
))
|
||||||
|
|
||||||
|
raise MoulinetteError(errno.EINVAL, m18n.n('app_location_unavailable', apps="\n".join(apps)))
|
||||||
|
|
||||||
app_setting(app, 'domain', value=domain)
|
app_setting(app, 'domain', value=domain)
|
||||||
app_setting(app, 'path', value=path)
|
app_setting(app, 'path', value=path)
|
||||||
|
@ -2053,7 +2062,7 @@ def _parse_action_args_in_yunohost_format(args, action_args, auth=None):
|
||||||
"""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,
|
||||||
domain_url_available, _normalize_domain_path)
|
_get_conflicting_apps, _normalize_domain_path)
|
||||||
from yunohost.user import user_info, user_list
|
from yunohost.user import user_info, user_list
|
||||||
|
|
||||||
args_dict = OrderedDict()
|
args_dict = OrderedDict()
|
||||||
|
@ -2181,9 +2190,18 @@ 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
|
||||||
if not domain_url_available(auth, domain, path):
|
conflicts = _get_conflicting_apps(auth, domain, path)
|
||||||
raise MoulinetteError(errno.EINVAL,
|
if conflicts:
|
||||||
m18n.n('app_location_unavailable'))
|
apps = []
|
||||||
|
for path, app_id, app_label in conflicts:
|
||||||
|
apps.append(" * {domain:s}{path:s} → {app_label:s} ({app_id:s})".format(
|
||||||
|
domain=domain,
|
||||||
|
path=path,
|
||||||
|
app_id=app_id,
|
||||||
|
app_label=app_label,
|
||||||
|
))
|
||||||
|
|
||||||
|
raise MoulinetteError(errno.EINVAL, m18n.n('app_location_unavailable', "\n".join(apps=apps)))
|
||||||
|
|
||||||
# (We save this normalized path so that the install script have a
|
# (We save this normalized path so that the install script have a
|
||||||
# standard path format to deal with no matter what the user inputted)
|
# standard path format to deal with no matter what the user inputted)
|
||||||
|
|
|
@ -219,9 +219,9 @@ def domain_cert_renew(auth, domain_list, force=False, no_checks=False, email=Fal
|
||||||
return yunohost.certificate.certificate_renew(auth, domain_list, force, no_checks, email, staging)
|
return yunohost.certificate.certificate_renew(auth, domain_list, force, no_checks, email, staging)
|
||||||
|
|
||||||
|
|
||||||
def domain_url_available(auth, domain, path):
|
def _get_conflicting_apps(auth, domain, path):
|
||||||
"""
|
"""
|
||||||
Check availability of a web path
|
Return a list of all conflicting apps with a domain/path (it can be empty)
|
||||||
|
|
||||||
Keyword argument:
|
Keyword argument:
|
||||||
domain -- The domain for the web path (e.g. your.domain.tld)
|
domain -- The domain for the web path (e.g. your.domain.tld)
|
||||||
|
@ -242,20 +242,30 @@ def domain_url_available(auth, domain, path):
|
||||||
apps_map = app_map(raw=True)
|
apps_map = app_map(raw=True)
|
||||||
|
|
||||||
# Loop through all apps to check if path is taken by one of them
|
# Loop through all apps to check if path is taken by one of them
|
||||||
available = True
|
conflicts = []
|
||||||
if domain in apps_map:
|
if domain in apps_map:
|
||||||
# Loop through apps
|
# Loop through apps
|
||||||
for p, a in apps_map[domain].items():
|
for p, a in apps_map[domain].items():
|
||||||
if path == p:
|
if path == p:
|
||||||
available = False
|
conflicts.append((p, a["id"], a["label"]))
|
||||||
break
|
|
||||||
# We also don't want conflicts with other apps starting with
|
# We also don't want conflicts with other apps starting with
|
||||||
# same name
|
# same name
|
||||||
elif path.startswith(p) or p.startswith(path):
|
elif path.startswith(p) or p.startswith(path):
|
||||||
available = False
|
conflicts.append((p, a["id"], a["label"]))
|
||||||
break
|
|
||||||
|
|
||||||
return available
|
return conflicts
|
||||||
|
|
||||||
|
|
||||||
|
def domain_url_available(auth, domain, path):
|
||||||
|
"""
|
||||||
|
Check availability of a web path
|
||||||
|
|
||||||
|
Keyword argument:
|
||||||
|
domain -- The domain for the web path (e.g. your.domain.tld)
|
||||||
|
path -- The path to check (e.g. /coffee)
|
||||||
|
"""
|
||||||
|
|
||||||
|
return len(_get_conflicting_apps(auth, domain, path)) == 0
|
||||||
|
|
||||||
|
|
||||||
def _get_maindomain():
|
def _get_maindomain():
|
||||||
|
|
Loading…
Add table
Reference in a new issue