File: views.py

package info (click to toggle)
freedombox 26.2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 82,976 kB
  • sloc: python: 48,504; javascript: 1,736; xml: 481; makefile: 290; sh: 167; php: 32
file content (151 lines) | stat: -rw-r--r-- 5,587 bytes parent folder | download | duplicates (4)
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)