1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Views for the Matrix Synapse module."""
import datetime
from django.contrib import messages
from django.shortcuts import redirect
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _
from django.views.generic import FormView
from plinth import app as app_module
from plinth.forms import DomainSelectionForm
from plinth.modules import matrixsynapse, names
from plinth.modules.coturn.components import TurnConfiguration
from plinth.views import AppView
from . import get_turn_configuration, privileged
from .forms import MatrixSynapseForm
class SetupView(FormView):
"""Show matrix-synapse setup page."""
template_name = 'matrix-synapse-pre-setup.html'
form_class = DomainSelectionForm
success_url = reverse_lazy('matrixsynapse:index')
def form_valid(self, form):
"""Handle valid form submission."""
matrixsynapse.setup_domain(form.cleaned_data['domain_name'])
return super().form_valid(form)
def get_context_data(self, *args, **kwargs) -> dict[str, object]:
"""Provide context data to the template."""
context = super().get_context_data(**kwargs)
app = app_module.App.get('matrixsynapse')
context['title'] = app.info.name
context['app_info'] = app.info
context['domain_names'] = names.components.DomainName.list_names(
'matrix-synapse-plinth')
return context
class MatrixSynapseAppView(AppView):
"""Show matrix-synapse service page."""
app_id = 'matrixsynapse'
template_name = 'matrix-synapse.html'
form_class = MatrixSynapseForm
def dispatch(self, request, *args, **kwargs):
"""Redirect to setup page if setup is not done yet."""
status = self.get_common_status()
if status['is_enabled']:
# App is disabled when uninstalling
if not matrixsynapse.is_setup():
return redirect('matrixsynapse:setup')
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, *args, **kwargs):
"""Add additional context data for template."""
context = super().get_context_data(*args, **kwargs)
context['domain_name'] = matrixsynapse.get_configured_domain_name()
context['certificate_status'] = matrixsynapse.get_certificate_status()
context['config'] = privileged.get_config()
tokens = privileged.list_registration_tokens()
for token in tokens:
if token['expiry_time']:
date = datetime.datetime.utcfromtimestamp(
token['expiry_time'] / 1000)
token['expiry_time'] = date
context['registration_tokens'] = tokens
return context
def get_initial(self):
"""Return the values to fill in the form."""
initial = super().get_initial()
turn_config, managed = get_turn_configuration()
config = privileged.get_config()
initial.update({
'enable_public_registration':
config['public_registration'],
'registration_verification':
config['registration_verification'] or 'disabled',
'enable_managed_turn':
managed,
'turn_uris':
'\n'.join(turn_config.uris),
'shared_secret':
turn_config.shared_secret
})
return initial
@staticmethod
def _handle_turn_configuration(old_config, new_config):
if not new_config['enable_managed_turn']:
new_turn_uris = new_config['turn_uris'].splitlines()
new_shared_secret = new_config['shared_secret']
turn_config_changed = \
old_config['turn_uris'] != new_turn_uris or \
old_config['shared_secret'] != new_shared_secret
if turn_config_changed:
matrixsynapse.update_turn_configuration(
TurnConfiguration(None, new_turn_uris, new_shared_secret),
managed=False)
else:
# Remove overridden turn configuration
matrixsynapse.update_turn_configuration(TurnConfiguration(),
managed=False)
def form_valid(self, form):
"""Handle valid form submission."""
old_config = self.get_initial()
new_config = form.cleaned_data
def changed(prop):
return old_config[prop] != new_config[prop]
is_changed = False
if (changed('enable_public_registration')
or changed('registration_verification')):
try:
privileged.set_config(
public_registration=new_config[
'enable_public_registration'],
registration_verification=new_config[
'registration_verification'])
is_changed = True
except ProcessLookupError:
# Matrix Synapse server is not running
messages.error(
self.request,
_('Registration configuration cannot be updated when app '
'is disabled.'))
if changed('enable_managed_turn') or changed('turn_uris') or \
changed('shared_secret'):
self._handle_turn_configuration(old_config, new_config)
is_changed = True
if is_changed:
messages.success(self.request, _('Configuration updated'))
return super().form_valid(form)
|