mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
Move a bunch of function from domain.py to app.py because it's much simpler to have them here
This commit is contained in:
parent
1ce1ecc2be
commit
07cec39af5
4 changed files with 81 additions and 90 deletions
|
@ -317,7 +317,6 @@ def app_change_url(operation_logger, app, domain, path):
|
|||
|
||||
"""
|
||||
from yunohost.hook import hook_exec, hook_callback
|
||||
from yunohost.domain import _normalize_domain_path, _assert_no_conflicting_apps
|
||||
|
||||
installed = _is_installed(app)
|
||||
if not installed:
|
||||
|
@ -1309,10 +1308,6 @@ def app_register_url(app, domain, path):
|
|||
path -- The path to be registered (e.g. /coffee)
|
||||
"""
|
||||
|
||||
# This line can't be moved on top of file, otherwise it creates an infinite
|
||||
# loop of import with tools.py...
|
||||
from .domain import _assert_no_conflicting_apps, _normalize_domain_path
|
||||
|
||||
domain, path = _normalize_domain_path(domain, path)
|
||||
|
||||
# We cannot change the url of an app already installed simply by changing
|
||||
|
@ -2586,8 +2581,6 @@ def _parse_args_in_yunohost_format(user_answers, argument_questions):
|
|||
|
||||
def _validate_and_normalize_webpath(manifest, args_dict, app_folder):
|
||||
|
||||
from yunohost.domain import _assert_no_conflicting_apps, _normalize_domain_path
|
||||
|
||||
# If there's only one "domain" and "path", validate that domain/path
|
||||
# is an available url and normalize the path.
|
||||
|
||||
|
@ -2627,6 +2620,82 @@ def _validate_and_normalize_webpath(manifest, args_dict, app_folder):
|
|||
_assert_no_conflicting_apps(domain, "/", full_domain=True)
|
||||
|
||||
|
||||
def _normalize_domain_path(domain, path):
|
||||
|
||||
# We want url to be of the format :
|
||||
# some.domain.tld/foo
|
||||
|
||||
# Remove http/https prefix if it's there
|
||||
if domain.startswith("https://"):
|
||||
domain = domain[len("https://"):]
|
||||
elif domain.startswith("http://"):
|
||||
domain = domain[len("http://"):]
|
||||
|
||||
# Remove trailing slashes
|
||||
domain = domain.rstrip("/").lower()
|
||||
path = "/" + path.strip("/")
|
||||
|
||||
return domain, path
|
||||
|
||||
|
||||
def _get_conflicting_apps(domain, path, ignore_app=None):
|
||||
"""
|
||||
Return a list of all conflicting apps with a domain/path (it can be empty)
|
||||
|
||||
Keyword argument:
|
||||
domain -- The domain for the web path (e.g. your.domain.tld)
|
||||
path -- The path to check (e.g. /coffee)
|
||||
ignore_app -- An optional app id to ignore (c.f. the change_url usecase)
|
||||
"""
|
||||
|
||||
from yunohost.domain import domain_list
|
||||
|
||||
domain, path = _normalize_domain_path(domain, path)
|
||||
|
||||
# Abort if domain is unknown
|
||||
if domain not in domain_list()['domains']:
|
||||
raise YunohostError('domain_name_unknown', domain=domain)
|
||||
|
||||
# Fetch apps map
|
||||
apps_map = app_map(raw=True)
|
||||
|
||||
# Loop through all apps to check if path is taken by one of them
|
||||
conflicts = []
|
||||
if domain in apps_map:
|
||||
# Loop through apps
|
||||
for p, a in apps_map[domain].items():
|
||||
if a["id"] == ignore_app:
|
||||
continue
|
||||
if path == p:
|
||||
conflicts.append((p, a["id"], a["label"]))
|
||||
# We also don't want conflicts with other apps starting with
|
||||
# same name
|
||||
elif path.startswith(p) or p.startswith(path):
|
||||
conflicts.append((p, a["id"], a["label"]))
|
||||
|
||||
return conflicts
|
||||
|
||||
|
||||
def _assert_no_conflicting_apps(domain, path, ignore_app=None, full_domain=False):
|
||||
|
||||
conflicts = _get_conflicting_apps(domain, path, ignore_app)
|
||||
|
||||
if conflicts:
|
||||
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,
|
||||
))
|
||||
|
||||
if full_domain:
|
||||
raise YunohostError('app_full_domain_unavailable', domain=domain)
|
||||
else:
|
||||
raise YunohostError('app_location_unavailable', apps="\n".join(apps))
|
||||
|
||||
|
||||
def _make_environment_dict(args_dict, prefix="APP_ARG_"):
|
||||
"""
|
||||
Convert a dictionnary containing manifest arguments
|
||||
|
|
|
@ -31,7 +31,7 @@ from moulinette.core import MoulinetteError
|
|||
from yunohost.utils.error import YunohostError
|
||||
from moulinette.utils.log import getActionLogger
|
||||
|
||||
from yunohost.app import app_ssowatconf, _installed_apps, _get_app_settings
|
||||
from yunohost.app import app_ssowatconf, _installed_apps, _get_app_settings, _get_conflicting_apps
|
||||
from yunohost.regenconf import regen_conf, _force_clear_hashes, _process_regen_conf
|
||||
from yunohost.utils.network import get_public_ip
|
||||
from yunohost.log import is_unit_operation
|
||||
|
@ -349,66 +349,6 @@ def domain_cert_renew(domain_list, force=False, no_checks=False, email=False, st
|
|||
return yunohost.certificate.certificate_renew(domain_list, force, no_checks, email, staging)
|
||||
|
||||
|
||||
def _get_conflicting_apps(domain, path, ignore_app=None):
|
||||
"""
|
||||
Return a list of all conflicting apps with a domain/path (it can be empty)
|
||||
|
||||
Keyword argument:
|
||||
domain -- The domain for the web path (e.g. your.domain.tld)
|
||||
path -- The path to check (e.g. /coffee)
|
||||
ignore_app -- An optional app id to ignore (c.f. the change_url usecase)
|
||||
"""
|
||||
|
||||
domain, path = _normalize_domain_path(domain, path)
|
||||
|
||||
# Abort if domain is unknown
|
||||
if domain not in domain_list()['domains']:
|
||||
raise YunohostError('domain_name_unknown', domain=domain)
|
||||
|
||||
# This import cannot be put on top of file because it would create a
|
||||
# recursive import...
|
||||
from yunohost.app import app_map
|
||||
|
||||
# Fetch apps map
|
||||
apps_map = app_map(raw=True)
|
||||
|
||||
# Loop through all apps to check if path is taken by one of them
|
||||
conflicts = []
|
||||
if domain in apps_map:
|
||||
# Loop through apps
|
||||
for p, a in apps_map[domain].items():
|
||||
if a["id"] == ignore_app:
|
||||
continue
|
||||
if path == p:
|
||||
conflicts.append((p, a["id"], a["label"]))
|
||||
# We also don't want conflicts with other apps starting with
|
||||
# same name
|
||||
elif path.startswith(p) or p.startswith(path):
|
||||
conflicts.append((p, a["id"], a["label"]))
|
||||
|
||||
return conflicts
|
||||
|
||||
|
||||
def _assert_no_conflicting_apps(domain, path, ignore_app=None, full_domain=False):
|
||||
|
||||
conflicts = _get_conflicting_apps(domain, path, ignore_app)
|
||||
|
||||
if conflicts:
|
||||
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,
|
||||
))
|
||||
|
||||
if full_domain:
|
||||
raise YunohostError('app_full_domain_unavailable', domain=domain)
|
||||
else:
|
||||
raise YunohostError('app_location_unavailable', apps="\n".join(apps))
|
||||
|
||||
|
||||
def domain_url_available(domain, path):
|
||||
"""
|
||||
Check availability of a web path
|
||||
|
@ -432,24 +372,6 @@ def _set_maindomain(domain):
|
|||
f.write(domain)
|
||||
|
||||
|
||||
def _normalize_domain_path(domain, path):
|
||||
|
||||
# We want url to be of the format :
|
||||
# some.domain.tld/foo
|
||||
|
||||
# Remove http/https prefix if it's there
|
||||
if domain.startswith("https://"):
|
||||
domain = domain[len("https://"):]
|
||||
elif domain.startswith("http://"):
|
||||
domain = domain[len("http://"):]
|
||||
|
||||
# Remove trailing slashes
|
||||
domain = domain.rstrip("/").lower()
|
||||
path = "/" + path.strip("/")
|
||||
|
||||
return domain, path
|
||||
|
||||
|
||||
def _build_dns_conf(domain, ttl=3600, include_empty_AAAA_if_no_ipv6=False):
|
||||
"""
|
||||
Internal function that will returns a data structure containing the needed
|
||||
|
|
|
@ -676,8 +676,8 @@ def _validate_and_sanitize_permission_url(url, app_base_path, app):
|
|||
re:domain.tld/app/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$
|
||||
"""
|
||||
|
||||
from yunohost.domain import domain_list, _assert_no_conflicting_apps
|
||||
|
||||
from yunohost.domain import domain_list
|
||||
from yunohost.app import _assert_no_conflicting_apps
|
||||
|
||||
domains = domain_list()['domains']
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@ import os
|
|||
from conftest import get_test_apps_dir
|
||||
|
||||
from yunohost.utils.error import YunohostError
|
||||
from yunohost.app import app_install, app_remove
|
||||
from yunohost.domain import _get_maindomain, domain_url_available, _normalize_domain_path
|
||||
from yunohost.app import app_install, app_remove, _normalize_domain_path
|
||||
from yunohost.domain import _get_maindomain, domain_url_available
|
||||
from yunohost.permission import _validate_and_sanitize_permission_url
|
||||
|
||||
# Get main domain
|
||||
|
|
Loading…
Add table
Reference in a new issue