in atr/ssh.py [0:0]
def _step_05_command_path_validate(path: str) -> tuple[str, str] | str:
"""Validate the path argument for rsync commands."""
# READ: rsync --server --sender -vlogDtpre.iLsfxCIvu . /proj/v1/
# Validating path: /proj/v1/
# WRITE: rsync --server -vlogDtpre.iLsfxCIvu . /proj/v1/
# Validating path: /proj/v1/
if not path.startswith("/"):
return "The path argument should be an absolute path"
if not path.endswith("/"):
# Technically we could ignore this, because we rewrite the path anyway for writes
# But we should enforce good rsync usage practices
return "The path argument should be a directory path, ending with a /"
if "//" in path:
return "The path argument should not contain //"
if path.count("/") != 3:
return "The path argument should be a /PROJECT/VERSION/ directory path"
path_project, path_version = path.strip("/").split("/", 1)
alphanum = set(string.ascii_letters + string.digits + "-")
if not all(c in alphanum for c in path_project):
return "The project name should contain only alphanumeric characters or hyphens"
# From a survey of version numbers we find that only . and - are used
# We also allow + which is in common use
version_punctuation = set(".-+")
if path_version[0] not in alphanum:
# Must certainly not allow the directory to be called "." or ".."
# And we also want to avoid patterns like ".htaccess"
return "The version should start with an alphanumeric character"
if path_version[-1] not in alphanum:
return "The version should end with an alphanumeric character"
if not all(c in (alphanum | version_punctuation) for c in path_version):
return "The version should contain only alphanumeric characters, dots, dashes, or pluses"
return path_project, path_version