mirror of
https://github.com/ivuorinen/actions.git
synced 2026-01-26 11:34:00 +00:00
refactor: centralize validation logic with validate_with helper (#412)
* chore: sonarcloud fixes * chore: coderabbit cr fixes
This commit is contained in:
@@ -27,57 +27,45 @@ class CustomValidator(BaseValidator):
|
||||
self.boolean_validator = BooleanValidator()
|
||||
self.file_validator = FileValidator()
|
||||
|
||||
def validate_inputs(self, inputs: dict[str, str]) -> bool: # pylint: disable=too-many-branches
|
||||
def validate_inputs(self, inputs: dict[str, str]) -> bool:
|
||||
"""Validate validate-inputs action inputs."""
|
||||
valid = True
|
||||
|
||||
# Validate action/action-type input
|
||||
if "action" in inputs or "action-type" in inputs:
|
||||
action_input = inputs.get("action") or inputs.get("action-type", "")
|
||||
# Check for empty action
|
||||
action_key = self.get_key_variant(inputs, "action", "action-type")
|
||||
if action_key:
|
||||
action_input = inputs[action_key]
|
||||
if action_input == "":
|
||||
self.add_error("Action name cannot be empty")
|
||||
valid = False
|
||||
# Allow GitHub expressions
|
||||
elif action_input.startswith("${{") and action_input.endswith("}}"):
|
||||
pass # GitHub expressions are valid
|
||||
# Check for dangerous characters
|
||||
elif any(
|
||||
char in action_input
|
||||
for char in [";", "`", "$", "&", "|", ">", "<", "\n", "\r", "/"]
|
||||
):
|
||||
self.add_error(f"Invalid characters in action name: {action_input}")
|
||||
valid = False
|
||||
# Validate action name format (should be lowercase with hyphens or underscores)
|
||||
elif action_input and not re.match(r"^[a-z][a-z0-9_-]*[a-z0-9]$", action_input):
|
||||
self.add_error(f"Invalid action name format: {action_input}")
|
||||
valid = False
|
||||
elif not self.is_github_expression(action_input):
|
||||
# Only validate non-GitHub expressions
|
||||
if any(
|
||||
char in action_input
|
||||
for char in [";", "`", "$", "&", "|", ">", "<", "\n", "\r", "/"]
|
||||
):
|
||||
self.add_error(f"Invalid characters in action name: {action_input}")
|
||||
valid = False
|
||||
elif action_input and not re.match(r"^[a-z][a-z0-9_-]*[a-z0-9]$", action_input):
|
||||
self.add_error(f"Invalid action name format: {action_input}")
|
||||
valid = False
|
||||
|
||||
# Validate rules-file if provided
|
||||
if inputs.get("rules-file"):
|
||||
result = self.file_validator.validate_file_path(inputs["rules-file"], "rules-file")
|
||||
for error in self.file_validator.errors:
|
||||
if error not in self.errors:
|
||||
self.add_error(error)
|
||||
self.file_validator.clear_errors()
|
||||
if not result:
|
||||
valid = False
|
||||
valid &= self.validate_with(
|
||||
self.file_validator, "validate_file_path", inputs["rules-file"], "rules-file"
|
||||
)
|
||||
|
||||
# Validate fail-on-error boolean
|
||||
if "fail-on-error" in inputs:
|
||||
value = inputs["fail-on-error"]
|
||||
# Reject empty string
|
||||
if value == "":
|
||||
self.add_error("fail-on-error cannot be empty")
|
||||
valid = False
|
||||
elif value:
|
||||
result = self.boolean_validator.validate_boolean(value, "fail-on-error")
|
||||
for error in self.boolean_validator.errors:
|
||||
if error not in self.errors:
|
||||
self.add_error(error)
|
||||
self.boolean_validator.clear_errors()
|
||||
if not result:
|
||||
valid = False
|
||||
valid &= self.validate_with(
|
||||
self.boolean_validator, "validate_boolean", value, "fail-on-error"
|
||||
)
|
||||
|
||||
return valid
|
||||
|
||||
|
||||
Reference in New Issue
Block a user