diff --git a/actions/matrixsynapse b/actions/matrixsynapse index 464b74a4b..32a1e2dca 100755 --- a/actions/matrixsynapse +++ b/actions/matrixsynapse @@ -25,6 +25,7 @@ import argparse from ruamel.yaml import round_trip_dump, round_trip_load from plinth import action_utils +from plinth.modules.matrixsynapse import CONFIG_FILE_PATH def parse_arguments(): @@ -35,6 +36,11 @@ def parse_arguments(): subparsers.add_parser('post-install', help='Perform post install steps') subparsers.add_parser('enable', help='Enable matrix-synapse service') subparsers.add_parser('disable', help='Disable matrix-synapse service') + subparsers.add_parser('restart', help='Restart matrix-synapse service') + subparsers.add_parser('enable-registration', + help='Turn on Public registrations') + subparsers.add_parser('disable-registration', + help='Turn off Public registrations') setup = subparsers.add_parser('setup', help='Set domain name for Matrix') setup.add_argument( '--domain-name', @@ -46,8 +52,7 @@ def parse_arguments(): def subcommand_post_install(_): """Perform post installation configuration.""" - file_path = '/etc/matrix-synapse/homeserver.yaml' - with open(file_path) as config_file: + with open(CONFIG_FILE_PATH) as config_file: config = round_trip_load(config_file) config['max_upload_size'] = '100M' @@ -56,7 +61,7 @@ def subcommand_post_install(_): if listener['port'] == 8448: listener['bind_address'] = '0.0.0.0' - with open(file_path, 'w') as config_file: + with open(CONFIG_FILE_PATH, 'w') as config_file: round_trip_dump(config, config_file) @@ -80,6 +85,30 @@ def subcommand_disable(_): action_utils.service_disable('matrix-synapse') +def subcommand_enable_registration(_): + """ Enable public registration""" + with open(CONFIG_FILE_PATH) as config_file: + config = round_trip_load(config_file) + config['enable_registration'] = True + with open(CONFIG_FILE_PATH, 'w') as config_file: + round_trip_dump(config, config_file) + + if action_utils.is_service_running('matrix-synapse'): + action_utils.service_restart('matrix-synapse') + + +def subcommand_disable_registration(_): + """ Disable public registration""" + with open(CONFIG_FILE_PATH) as config_file: + config = round_trip_load(config_file) + config['enable_registration'] = False + with open(CONFIG_FILE_PATH, 'w') as config_file: + round_trip_dump(config, config_file) + + if action_utils.is_service_running('matrix-synapse'): + action_utils.service_restart('matrix-synapse') + + def main(): arguments = parse_arguments() diff --git a/plinth/modules/matrixsynapse/__init__.py b/plinth/modules/matrixsynapse/__init__.py index c9425b763..fccb13df9 100644 --- a/plinth/modules/matrixsynapse/__init__.py +++ b/plinth/modules/matrixsynapse/__init__.py @@ -62,7 +62,7 @@ service = None logger = logging.getLogger(__name__) SERVER_NAME_PATH = "/etc/matrix-synapse/conf.d/server_name.yaml" - +CONFIG_FILE_PATH = '/etc/matrix-synapse/homeserver.yaml' def init(): """Initialize the matrix-synapse module.""" @@ -149,3 +149,14 @@ def get_configured_domain_name(): config, _, _ = load_yaml_guess_indent(config_file) return config['server_name'] + + +def get_public_registration_status(): + """ Return whether public registration is turned on""" + if not is_setup(): + return None + + with open(CONFIG_FILE_PATH) as config_file: + config, _, _ = load_yaml_guess_indent(config_file) + + return config['enable_registration'] \ No newline at end of file diff --git a/plinth/modules/matrixsynapse/forms.py b/plinth/modules/matrixsynapse/forms.py new file mode 100644 index 000000000..b7b1f0c90 --- /dev/null +++ b/plinth/modules/matrixsynapse/forms.py @@ -0,0 +1,36 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Forms for the Matrix Synapse module. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from plinth.forms import ServiceForm + + +class MatrixSynapseForm(ServiceForm): + enable_public_registration = forms.BooleanField( + label=_('Enable Public Registration'), + required=False, + help_text=_( + 'Enable or disable public registrations for matrix-synapse. ' + 'Enabling public registrations means that anyone on the internet ' + 'can register a new account on your Matrix server.Disable the ' + 'this if you only want existing users to be able to use it.')) diff --git a/plinth/modules/matrixsynapse/views.py b/plinth/modules/matrixsynapse/views.py index f3f3f3206..0cd1cdb57 100644 --- a/plinth/modules/matrixsynapse/views.py +++ b/plinth/modules/matrixsynapse/views.py @@ -19,8 +19,10 @@ Views for the Matrix Synapse module. """ +from django.contrib import messages from django.shortcuts import redirect from django.urls import reverse_lazy +from django.utils.translation import ugettext_lazy as _ from django.views.generic import FormView from plinth import actions @@ -29,6 +31,8 @@ from plinth.modules import matrixsynapse from plinth.forms import DomainSelectionForm from plinth.utils import get_domain_names +from .forms import MatrixSynapseForm +from . import get_public_registration_status class SetupView(FormView): """Show matrix-synapse setup page.""" @@ -61,6 +65,7 @@ class ServiceView(views.ServiceView): template_name = 'matrix-synapse.html' description = matrixsynapse.description diagnostics_module_name = 'matrixsynapse' + form_class = MatrixSynapseForm def dispatch(self, request, *args, **kwargs): """Redirect to setup page if setup is not done yet.""" @@ -74,3 +79,29 @@ class ServiceView(views.ServiceView): context = super().get_context_data(**kwargs) context['domain_name'] = matrixsynapse.get_configured_domain_name() return context + + def get_initial(self): + """Return the values to fill in the form.""" + initial = super().get_initial() + initial.update({ + 'enable_public_registration': get_public_registration_status()}) + return initial + + def form_valid(self, form): + """Handle valid form submission.""" + old_config = self.get_initial() + new_config = form.cleaned_data + if old_config['enable_public_registration'] !=\ + new_config['enable_public_registration']: + enable_registration = new_config['enable_public_registration'] + if enable_registration: + actions.superuser_run('matrixsynapse', ['enable-registration']) + messages.success(self.request, + _('Public registration enabled')) + else: + actions.superuser_run('matrixsynapse', ['disable-registration']) + messages.success(self.request, + _('Public registration disabled')) + if new_config['is_enabled'] == True: + actions.superuser_run('matrixsynapse', ['restart']) + return super().form_valid(form)