mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 19:26:48 +00:00
A VM owner who may manage the console (is_change and is_vnc) could set its listen address to all interfaces and remove its password: a VNC console reachable from the network without a password. Checked on a test host: the owner's form changed the VM's listen address to 0.0.0.0 and then removed the password. - The listen address field is disabled for users who are not superusers; a disabled field ignores posted values. They can still set or change the password and the keymap. - A console whose persistent definition does not bind it to loopback (or a Unix socket) only loses its password through an administrator. A binding the XML does not pin down counts as not local: listen type network, or no address (the host's default in qemu.conf). On the test host, the owner's form now leaves the listen address alone and is refused when it removes the password of a console listening on 0.0.0.0; with the console on localhost the password can be removed. The new tests fail on the previous code.
79 lines
3.6 KiB
Python
79 lines
3.6 KiB
Python
import re
|
|
|
|
from django import forms
|
|
from django.utils.translation import gettext_lazy as _
|
|
from webvirtcloud.settings import QEMU_CONSOLE_LISTENER_ADDRESSES, QEMU_KEYMAPS
|
|
|
|
from .models import CreateInstance, Flavor
|
|
|
|
|
|
class FlavorForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Flavor
|
|
fields = "__all__"
|
|
|
|
|
|
class ConsoleForm(forms.Form):
|
|
listen_on = forms.ChoiceField(label=_("Listen on"))
|
|
generate_password = forms.BooleanField(label=_("Generate password"), required=False)
|
|
clear_password = forms.BooleanField(label=_("Clear password"), required=False)
|
|
password = forms.CharField(
|
|
label=_("Password"),
|
|
widget=forms.PasswordInput(render_value=True),
|
|
required=False
|
|
)
|
|
clear_keymap = forms.BooleanField(label=_("Clear keymap"), required=False)
|
|
keymap = forms.ChoiceField(label=_("Keymap"), required=False)
|
|
|
|
def __init__(self, *args, can_set_listener=True, **kwargs):
|
|
super(ConsoleForm, self).__init__(*args, **kwargs)
|
|
keymap_choices = [("auto", _("Auto"))] + list((c, c) for c in QEMU_KEYMAPS)
|
|
# Only administrators choose the listen address: beyond localhost the
|
|
# console is reachable from the network. A disabled field ignores
|
|
# posted values.
|
|
self.fields["listen_on"] = forms.ChoiceField(
|
|
label=_("Listen on"),
|
|
choices=QEMU_CONSOLE_LISTENER_ADDRESSES,
|
|
disabled=not can_set_listener,
|
|
required=can_set_listener,
|
|
)
|
|
self.fields["keymap"] = forms.ChoiceField(label=_("Keymap"), choices=keymap_choices)
|
|
|
|
|
|
class NewVMForm(forms.ModelForm):
|
|
# name = forms.CharField(error_messages={'required': _('No Virtual Machine name has been entered')}, max_length=64)
|
|
# firmware = forms.CharField(max_length=50, required=False)
|
|
# vcpu = forms.IntegerField(error_messages={'required': _('No VCPU has been entered')})
|
|
# vcpu_mode = forms.CharField(max_length=20, required=False)
|
|
# disk = forms.IntegerField(required=False)
|
|
# memory = forms.IntegerField(error_messages={'required': _('No RAM size has been entered')})
|
|
# networks = forms.CharField(error_messages={'required': _('No Network pool has been choosen')})
|
|
# nwfilter = forms.CharField(required=False)
|
|
# storage = forms.CharField(max_length=20, required=False)
|
|
# template = forms.CharField(required=False)
|
|
# images = forms.CharField(required=False)
|
|
# cache_mode = forms.CharField(error_messages={'required': _('Please select HDD cache mode')})
|
|
# hdd_size = forms.IntegerField(required=False)
|
|
# meta_prealloc = forms.BooleanField(required=False)
|
|
# virtio = forms.BooleanField(required=False)
|
|
# qemu_ga = forms.BooleanField(required=False)
|
|
# mac = forms.CharField(required=False)
|
|
# console_pass = forms.CharField(required=False, empty_value="", widget=forms.PasswordInput())
|
|
# graphics = forms.CharField(error_messages={'required': _('Please select a graphics type')})
|
|
# video = forms.CharField(error_messages={'required': _('Please select a video driver')})
|
|
# listener_addr = forms.ChoiceField(required=True, widget=forms.RadioSelect, choices=QEMU_CONSOLE_LISTENER_ADDRESSES)
|
|
class Meta:
|
|
model = CreateInstance
|
|
fields = "__all__"
|
|
exclude = ["compute"]
|
|
|
|
def clean_name(self):
|
|
name = self.cleaned_data["name"]
|
|
have_symbol = re.match("^[a-zA-Z0-9._-]+$", name)
|
|
if not have_symbol:
|
|
raise forms.ValidationError(
|
|
_(
|
|
"The name of the virtual machine must not contain any special characters"
|
|
)
|
|
)
|
|
return name
|