# SPDX-License-Identifier: AGPL-3.0-or-later """ Forms for configuring Ejabberd. """ from django import forms from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from plinth import cfg from plinth.modules import ejabberd from plinth.modules.coturn.forms import turn_uris_validator from plinth.utils import format_lazy class EjabberdForm(forms.Form): """Ejabberd configuration form.""" domain_names = forms.MultipleChoiceField( label=_('Domain names'), widget=forms.CheckboxSelectMultiple, help_text=_( 'Domains to be used by ejabberd. Note that user accounts are ' 'unique for each domain, and migrating users to a new domain name ' 'is not yet implemented.'), choices=[]) MAM_enabled = forms.BooleanField( label=_('Enable Message Archive Management'), required=False, help_text=format_lazy( _('If enabled, your {box_name} will store chat message histories. ' 'This allows synchronization of conversations between multiple ' 'clients, and reading the history of a multi-user chat room. ' 'It depends on the client settings whether the histories are ' 'stored as plain text or encrypted.'), box_name=_(cfg.box_name))) enable_managed_turn = forms.BooleanField( label=_('Automatically manage audio/video call setup'), required=False, help_text=format_lazy( _('Configures the local coturn app as ' 'the STUN/TURN server for ejabberd. Disable this if you ' 'want to use a different STUN/TURN server.'), coturn_url=reverse_lazy('coturn:index'))) # STUN/TURN server setup turn_uris = forms.CharField( label=_('STUN/TURN Server URIs'), required=False, strip=True, widget=forms.Textarea(attrs={'rows': 4}), help_text=_('List of public URIs of the STUN/TURN server, one on each ' 'line.'), validators=[turn_uris_validator]) shared_secret = forms.CharField( label=_('Shared Authentication Secret'), required=False, strip=True, help_text=_('Shared secret used to compute passwords for the ' 'TURN server.')) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Start with any existing domains from ejabberd configuration. domains = set(ejabberd.get_domains()) # Add other domains that can be configured. from plinth.modules.names.components import DomainName domains |= DomainName.list_names() self.fields['domain_names'].choices = zip(domains, domains) def clean_turn_uris(self): """Normalize newlines in URIs.""" data = self.cleaned_data['turn_uris'] return '\n'.join([uri.strip() for uri in data.splitlines()])