diff --git a/actions/diaspora b/actions/diaspora index 082be3b96..c2207f91c 100755 --- a/actions/diaspora +++ b/actions/diaspora @@ -27,6 +27,8 @@ import subprocess from plinth import action_utils from plinth.modules import diaspora +DIASPORA_YAML = "/etc/diaspora/diaspora.yml" + def parse_arguments(): """Return parsed command line arguments as dictionary.""" @@ -38,6 +40,10 @@ def parse_arguments(): subparsers.add_parser('enable', help='Enable diaspora* web server') subparsers.add_parser('disable', help='Disable diaspora* web server') + subparsers.add_parser('enable-user-registrations', help='Allow users to' \ + 'sign up to this diaspora* pod without an invitation.') + subparsers.add_parser('disable-user-registrations', help='Allow only, ' \ + 'users with an invitation to register to this diaspora* pod') subparsers.add_parser('start-diaspora', help='Start diaspora* service') subparsers.add_parser( 'disable-ssl', help="Disable SSL on the diaspora* application server") @@ -55,6 +61,7 @@ def subcommand_setup(arguments): with open('/etc/diaspora/domain_name', 'w') as dnf: dnf.write(domain_name) set_domain_name(domain_name) + uncomment_user_registrations() action_utils.service_start('diaspora') action_utils.webserver_enable('diaspora-plinth') @@ -92,8 +99,33 @@ def subcommand_disable_ssl(_): """ # Using sed because ruamel.yaml has a bug for this kind of files subprocess.call([ - "sed", "-i", "s/#require_ssl: true/require_ssl: false/g", - "/etc/diaspora/diaspora.yml" + "sed", "-i", "s/#require_ssl: true/require_ssl: false/g", DIASPORA_YAML + ]) + + +def uncomment_user_registrations(): + """Uncomment the enable_registrations line which is commented by default""" + subprocess.call([ + "sed", "-i", "s/#enable_registrations/enable_registrations/g", + DIASPORA_YAML + ]) + + +def subcommand_enable_user_registrations(_): + """Enable new user registrations on the diaspora* pod """ + subprocess.call([ + "sed", "-i", + "s/enable_registrations: false/enable_registrations: true/g", + DIASPORA_YAML + ]) + + +def subcommand_disable_user_registrations(_): + """Disable new user registrations on the diaspora* pod """ + subprocess.call([ + "sed", "-i", + "s/enable_registrations: true/enable_registrations: false/g", + DIASPORA_YAML ]) diff --git a/plinth/forms.py b/plinth/forms.py index cbf7fe63e..73c022877 100644 --- a/plinth/forms.py +++ b/plinth/forms.py @@ -42,6 +42,9 @@ class DomainSelectionForm(forms.Form): self.fields['domain_name'].choices = utils.get_domain_names() domain_name = forms.ChoiceField( - label=_('Select the domain name to be used for this application'), + label=_('Select a domain name to be used with this application'), + help_text=_( + 'Warning! The application may not work properly if domain name is changed later.' + ), choices=[] ) diff --git a/plinth/modules/diaspora/__init__.py b/plinth/modules/diaspora/__init__.py index 676bf7a51..a89caa187 100644 --- a/plinth/modules/diaspora/__init__.py +++ b/plinth/modules/diaspora/__init__.py @@ -139,6 +139,24 @@ def disable(): frontpage.remove_shortcut('diaspora') +def is_user_registrations_enabled(): + """Return whether user registrations are enabled""" + with open('/etc/diaspora/diaspora.yml') as f: + for line in f.readlines(): + if "enable_registrations" in line: + return line.split(":")[1].strip() == "true" + + +def enable_user_registrations(): + """Allow users to register without invitation""" + actions.superuser_run('diaspora', ['enable-user-registrations']) + + +def disable_user_registrations(): + """Disallow users from registering without invitation""" + actions.superuser_run('diaspora', ['disable-user-registrations']) + + def diagnose(): """Run diagnostics and return the results.""" results = [] diff --git a/plinth/modules/diaspora/forms.py b/plinth/modules/diaspora/forms.py index 02e97bc2a..949f5aa31 100644 --- a/plinth/modules/diaspora/forms.py +++ b/plinth/modules/diaspora/forms.py @@ -22,17 +22,12 @@ from django import forms from django.utils.translation import ugettext_lazy as _ from plinth import utils +from plinth.forms import ServiceForm -class DiasporaForm(forms.Form): - """Form to do initial configuration of diaspora""" - domain_name = forms.ChoiceField( - label=_('Select the domain name to be used for diaspora*'), - help_text=_( - 'Warning! Do not change the FreedomBox domain name after setting up diaspora*' - ), - choices=[]) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields['domain_name'].choices = utils.get_domain_names() +class DiasporaServiceForm(ServiceForm): + """Service Form with additional fields for diaspora*""" + is_user_registrations_enabled = forms.BooleanField( + label=_('Enable new user registrations'), + required=False + ) diff --git a/plinth/modules/diaspora/views.py b/plinth/modules/diaspora/views.py index 157521af7..dfd0a08eb 100644 --- a/plinth/modules/diaspora/views.py +++ b/plinth/modules/diaspora/views.py @@ -14,25 +14,29 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ Views for the diaspora module """ + +from django.contrib import messages from django.shortcuts import redirect from django.urls import reverse_lazy +from django.utils.translation import ugettext as _ from django.views.generic import FormView from plinth import actions +from plinth.forms import DomainSelectionForm from plinth.modules import diaspora -from plinth.modules.diaspora.forms import DiasporaForm from plinth.utils import get_domain_names from plinth.views import ServiceView +from .forms import DiasporaServiceForm + class DiasporaSetupView(FormView): """Show diaspora setup page.""" template_name = 'diaspora-pre-setup.html' - form_class = DiasporaForm + form_class = DomainSelectionForm description = diaspora.description title = diaspora.title success_url = reverse_lazy('diaspora:index') @@ -56,6 +60,7 @@ class DiasporaSetupView(FormView): class DiasporaServiceView(ServiceView): """Show diaspora service page.""" + form_class = DiasporaServiceForm service_id = diaspora.managed_services[0] template_name = 'diaspora-post-setup.html' diagnostics_module_name = 'diaspora' @@ -63,11 +68,39 @@ class DiasporaServiceView(ServiceView): def dispatch(self, request, *args, **kwargs): if not diaspora.is_setup(): return redirect('diaspora:setup') - return super().dispatch(request, *args, **kwargs) def get_context_data(self, *args, **kwargs): context = super().get_context_data(**kwargs) context['domain_name'] = diaspora.get_configured_domain_name() - return context + + def get_initial(self): + """Return the status of the service to fill in the form.""" + return { + 'is_enabled': + self.service.is_enabled(), + 'is_user_registrations_enabled': + diaspora.is_user_registrations_enabled(), + 'is_running': + self.service.is_running() + } + + def form_valid(self, form): + """Enable/disable user registrations""" + old_status = form.initial['is_user_registrations_enabled'] + new_status = form.cleaned_data['is_user_registrations_enabled'] + + if old_status == new_status: + if not self.request._messages._queued_messages: + messages.info(self.request, _('Setting unchanged')) + else: + if new_status: + diaspora.enable_user_registrations() + messages.success(self.request, _('User registrations enabled')) + else: + diaspora.disable_user_registrations() + messages.success(self.request, + _('User registrations disabled')) + + return super().form_valid(form) diff --git a/plinth/modules/matrixsynapse/forms.py b/plinth/modules/matrixsynapse/forms.py deleted file mode 100644 index 48918065d..000000000 --- a/plinth/modules/matrixsynapse/forms.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# 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 configuring matrix-synapse. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - -from plinth.utils import get_domain_names - - -class MatrixSynapseForm(forms.Form): - """Form to do initial configuration of matrix-synapse.""" - domain_name = forms.ChoiceField( - label=_('Select the domain name'), - choices=[] - ) - - def __init__(self, *args, **kwargs): - """Initialize the form object.""" - super().__init__(*args, **kwargs) - self.fields['domain_name'].choices = get_domain_names() diff --git a/plinth/modules/matrixsynapse/views.py b/plinth/modules/matrixsynapse/views.py index f670c50d3..406086ebb 100644 --- a/plinth/modules/matrixsynapse/views.py +++ b/plinth/modules/matrixsynapse/views.py @@ -26,14 +26,14 @@ from django.views.generic import FormView from plinth import actions from plinth import views from plinth.modules import matrixsynapse -from plinth.modules.matrixsynapse.forms import MatrixSynapseForm +from plinth.forms import DomainSelectionForm from plinth.utils import get_domain_names class SetupView(FormView): """Show matrix-synapse setup page.""" template_name = 'matrix-synapse-pre-setup.html' - form_class = MatrixSynapseForm + form_class = DomainSelectionForm success_url = reverse_lazy('matrixsynapse:index') def form_valid(self, form):