diff --git a/docs/source/usage/repositories.rst b/docs/source/usage/repositories.rst index b1dfae2..19a13ea 100644 --- a/docs/source/usage/repositories.rst +++ b/docs/source/usage/repositories.rst @@ -73,6 +73,8 @@ If you want to run multiple ones - they need to be comma-separated. These hooks will not be processed if you override the actual create/update command. +**Note**: For security reasons (XSS) these characters are not allowed: :code:`& < > "` + ---- Clone via SSH diff --git a/src/ansibleguy-webui/aw/api_endpoints/base.py b/src/ansibleguy-webui/aw/api_endpoints/base.py index d2b2f15..807bb77 100644 --- a/src/ansibleguy-webui/aw/api_endpoints/base.py +++ b/src/ansibleguy-webui/aw/api_endpoints/base.py @@ -93,6 +93,11 @@ def not_implemented(*args, **kwargs): return JsonResponse({'error': 'Not yet implemented'}, status=404) -def validate_no_xss(value: str, field: str): - if is_set(value) and isinstance(value, str) and value != escape_html(value): - raise ValidationError(f"Found illegal characters in field '{field}'") +def validate_no_xss(value: str, field: str, shell_cmd: bool = False): + if is_set(value) and isinstance(value, str): + if shell_cmd: + # allow single-quotes + value = value.replace("'", '') + + if value != escape_html(value): + raise ValidationError(f"Found illegal characters in field '{field}'") diff --git a/src/ansibleguy-webui/aw/api_endpoints/repository.py b/src/ansibleguy-webui/aw/api_endpoints/repository.py index 25734c2..c2fea4b 100644 --- a/src/ansibleguy-webui/aw/api_endpoints/repository.py +++ b/src/ansibleguy-webui/aw/api_endpoints/repository.py @@ -30,7 +30,11 @@ class Meta: def validate(self, attrs: dict): for field in Repository.api_fields_write: if field in attrs: - validate_no_xss(value=attrs[field], field=field) + if field in Repository.fields_shell_cmds: + validate_no_xss(value=attrs[field], field=field, shell_cmd=True) + + else: + validate_no_xss(value=attrs[field], field=field) return attrs diff --git a/src/ansibleguy-webui/aw/model/repository.py b/src/ansibleguy-webui/aw/model/repository.py index b308f70..a36b5a3 100644 --- a/src/ansibleguy-webui/aw/model/repository.py +++ b/src/ansibleguy-webui/aw/model/repository.py @@ -31,6 +31,7 @@ class Repository(BaseModel): ]) api_fields_write = form_fields + fields_shell_cmds = ['git_hook_pre', 'git_hook_post', 'git_override_initialize', 'git_override_update'] name = models.CharField(max_length=100, null=False, blank=False) rtype = models.PositiveSmallIntegerField(choices=CHOICES_REPOSITORY)