diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index c3579c805..903f65c95 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -437,7 +437,7 @@ def _check_and_normalize_permission_path(url): if '/' not in url: raise YunohostError('regex_with_only_domain') domain = url[3:].split('/')[0] - path = url[3:].split('/', 1)[1] + path = '/' + url[3:].split('/', 1)[1] if domain not in domains: raise YunohostError('domain_named_unknown', domain=domain) diff --git a/src/yunohost/tests/test_appurl.py b/src/yunohost/tests/test_appurl.py index b0a47d89f..3b7af4d92 100644 --- a/src/yunohost/tests/test_appurl.py +++ b/src/yunohost/tests/test_appurl.py @@ -2,7 +2,7 @@ import pytest 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.domain import _get_maindomain, domain_url_available, _normalize_domain_path, _check_and_normalize_permission_path # Get main domain maindomain = _get_maindomain() @@ -59,3 +59,44 @@ def test_registerurl_baddomain(): with pytest.raises(YunohostError): app_install("./tests/apps/register_url_app_ynh", args="domain=%s&path=%s" % ("yolo.swag", "/urlregisterapp"), force=True) + + +def test_normalize_permission_path(): + # Relative path + assert _check_and_normalize_permission_path("/wiki/") == "/wiki" + assert _check_and_normalize_permission_path("/") == "/" + assert _check_and_normalize_permission_path("//salut/") == "/salut" + + # Full path + assert _check_and_normalize_permission_path(maindomain + "/hey/") == maindomain + "/hey" + assert _check_and_normalize_permission_path(maindomain + "//") == maindomain + "/" + assert _check_and_normalize_permission_path(maindomain + "/") == maindomain + "/" + + # Relative Regex + assert _check_and_normalize_permission_path("re:/yolo.*/") == "re:/yolo.*/" + assert _check_and_normalize_permission_path("re:/y.*o(o+)[a-z]*/bo\1y") == "re:/y.*o(o+)[a-z]*/bo\1y" + + # Full Regex + assert _check_and_normalize_permission_path("re:" + maindomain + "/yolo.*/") == "re:" + maindomain + "/yolo.*/" + assert _check_and_normalize_permission_path("re:" + maindomain + "/y.*o(o+)[a-z]*/bo\1y") == "re:" + maindomain + "/y.*o(o+)[a-z]*/bo\1y" + + +def test_normalize_permission_path_with_bad_regex(): + # Relative Regex + with pytest.raises(YunohostError): + _check_and_normalize_permission_path("re:/yolo.*[1-7]^?/") + with pytest.raises(YunohostError): + _check_and_normalize_permission_path("re:/yolo.*[1-7](]/") + + # Full Regex + with pytest.raises(YunohostError): + _check_and_normalize_permission_path("re:" + maindomain + "/yolo?+/") + with pytest.raises(YunohostError): + _check_and_normalize_permission_path("re:" + maindomain + "/yolo[1-9]**/") + + +def test_normalize_permission_path_with_unknown_domain(): + with pytest.raises(YunohostError): + _check_and_normalize_permission_path("shouldntexist.tld/hey") + with pytest.raises(YunohostError): + _check_and_normalize_permission_path("re:shouldntexist.tld/hey.*")