mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 19:26:48 +00:00
Each was checked with git grep across every tracked file (templates, JS, shell, unit files and the extensionless console daemons) and for dynamic use (URL names, template names, registries): - vrtManager: host_is_up, is_kvm_supported, get_emulators, get_file_extensions, both get_network_forward, get_snapshots, get_storages_images, get_os_type, get_host_arch, the get_pretty_* trio and, in util, is_kvm_available, randomMAC, get_max_vcpus, compareMAC, pretty_mem, pretty_bytes and validate_uuid; with them the port constants only host_is_up read. Some were reached only by their tests, which go too. - The flavor edit page: nothing linked to it; flavors are created and deleted on the Flavors page and edited through the API. - computes.validate_name, UserForm.identity_has_errors, the has_perm template tag, the ALLOW_EMPTY_PASSWORD setting nothing reads, hidePleaseWaitDialog, default_app_config (ignored since Django 4.1) and the Python < 3.6 lines of secret_generator.py.
54 lines
2.2 KiB
Python
54 lines
2.2 KiB
Python
import re
|
|
from ipaddress import ip_address
|
|
|
|
from django.core.exceptions import ValidationError
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
# one or more dot-separated RFC 1123 labels, optional trailing dot
|
|
_hostname = re.compile(r"[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*\.?")
|
|
_login = re.compile(r"[A-Za-z0-9._][A-Za-z0-9._-]*")
|
|
|
|
|
|
def validate_hostname(value):
|
|
"""An IPv4 address or a host name that goes safely into a libvirt
|
|
connection URI. No scheme, port, path, query, whitespace or IPv6 literal:
|
|
those would change the URI (an injected ?command=, ?no_verify=, a port or
|
|
a userinfo separator). IPv6 is rejected until the URI building brackets
|
|
it."""
|
|
try:
|
|
if ip_address(value).version == 4:
|
|
return
|
|
except ValueError:
|
|
if _hostname.fullmatch(value):
|
|
return
|
|
raise ValidationError(_("Enter an IPv4 address or a host name, without a scheme, port or path"))
|
|
|
|
|
|
def validate_login(value):
|
|
"""A user name that goes safely into a libvirt connection URI and an ssh
|
|
command line. Empty is allowed (TCP falls back to the server's own
|
|
authentication, the socket transport ignores the login); otherwise only
|
|
letters, digits, ".", "_" and "-", and never a leading "-" (an ssh
|
|
option)."""
|
|
if value and not _login.fullmatch(value):
|
|
raise ValidationError(
|
|
_("The login may contain only letters, digits, '.', '_' and '-', and may not start with '-'")
|
|
)
|
|
|
|
|
|
def validate_migration_address(value):
|
|
"""An IP address (no IPv6 scope) or a host name: no scheme, port or brackets."""
|
|
try:
|
|
if not getattr(ip_address(value), "scope_id", None):
|
|
return
|
|
except ValueError:
|
|
if _hostname.fullmatch(value):
|
|
return
|
|
raise ValidationError(_("Enter an IP address or a host name, without a scheme or port"))
|
|
|
|
|
|
def validate_gstfsd_key(value):
|
|
"""The key gstfsd on the host signs with: GSTFSD_KEY in its
|
|
/etc/default/webvirt-gstfsd, 64 lowercase hexadecimal characters."""
|
|
if not re.fullmatch(r"[0-9a-f]{64}", value):
|
|
raise ValidationError(_("Enter the 64 hexadecimal characters of GSTFSD_KEY in the host's /etc/default/webvirt-gstfsd"))
|