From 6f5b4fba3838afe5c8e5629b1181d72584ea5a8a Mon Sep 17 00:00:00 2001 From: Hemanth Kumar Veeranki Date: Thu, 24 May 2018 17:58:14 +0530 Subject: [PATCH] Added an option to enable/disable private mode in mediawiki Add tests for mediawiki private mode Signed-off-by: Hemanth Kumar Veeranki Reviewed-by: James Valleroy --- actions/mediawiki | 41 +++++++++++++++++++ functional_tests/features/wiki_engine.feature | 13 +++++- .../step_definitions/application.py | 10 +++++ functional_tests/step_definitions/site.py | 10 +++++ functional_tests/support/application.py | 14 +++++++ functional_tests/support/site.py | 15 +++++++ plinth/modules/mediawiki/__init__.py | 7 ++++ plinth/modules/mediawiki/forms.py | 6 +++ plinth/modules/mediawiki/views.py | 24 +++++++++-- 9 files changed, 136 insertions(+), 4 deletions(-) diff --git a/actions/mediawiki b/actions/mediawiki index fa23486b4..ef85c6ff0 100755 --- a/actions/mediawiki +++ b/actions/mediawiki @@ -48,6 +48,11 @@ def parse_arguments(): pub_reg.add_argument('command', choices=('enable', 'disable', 'status'), help=help_pub_reg) + help_private_mode = 'Enable/Disable/Status private mode.' + private_mode = subparsers.add_parser('private-mode', help=help_private_mode) + private_mode.add_argument('command', choices=('enable', 'disable', 'status'), + help=help_private_mode) + change_password = subparsers.add_parser('change-password', help='Change user password') change_password.add_argument('--username', default='admin', @@ -171,6 +176,42 @@ def subcommand_public_registrations(arguments): conf_file.write(line) +def subcommand_private_mode(arguments): + """Enable or Disable Private mode for wiki""" + with open(CONF_FILE, 'r') as conf_file: + lines = conf_file.readlines() + + def is_edit_line(line): + return line.startswith("$wgGroupPermissions['*']['edit']") + + def is_read_line(line): + return line.startswith("$wgGroupPermissions['*']['read']") + + edit_conf_lines = list(filter(is_edit_line, lines)) + read_conf_lines = list(filter(is_read_line, lines)) + if arguments.command == 'status': + if edit_conf_lines and read_conf_lines: + print('enabled' if ('false' in read_conf_lines[0]) and + ('false' in edit_conf_lines[0]) else 'disabled') + else: + print('disabled') + else: + with open(CONF_FILE, 'w') as conf_file: + conf_value = 'false;' if arguments.command == 'enable' else 'true;' + for line in lines: + if is_edit_line(line) or is_read_line(line): + words = line.split() + words[-1] = conf_value + conf_file.write(" ".join(words) + '\n') + else: + conf_file.write(line) + + if edit_conf_lines is None: + conf_file.write("$wgGroupPermissions['*']['edit'] = " + conf_value + '\n') + if read_conf_lines is None: + conf_file.write("$wgGroupPermissions['*']['read'] = " + conf_value + '\n') + + def main(): """Parse arguments and perform all duties.""" arguments = parse_arguments() diff --git a/functional_tests/features/wiki_engine.feature b/functional_tests/features/wiki_engine.feature index 5a9be615a..d79e380cd 100644 --- a/functional_tests/features/wiki_engine.feature +++ b/functional_tests/features/wiki_engine.feature @@ -41,4 +41,15 @@ Scenario: Enable public registrations Scenario: Disable public registrations Given the mediawiki application is enabled When I disable mediawiki public registrations - Then the mediawiki site should not allow creating accounts \ No newline at end of file + Then the mediawiki site should not allow creating accounts + +Scenario: Enable private mode + Given the mediawiki application is enabled + When I enable mediawiki private mode + Then the mediawiki site should not allow creating accounts + Then the mediawiki site should not allow anonymous reads and writes + +Scenario: Disable private mode + Given the mediawiki application is enabled + When I disable mediawiki private mode + Then the mediawiki site should allow anonymous reads and writes diff --git a/functional_tests/step_definitions/application.py b/functional_tests/step_definitions/application.py index d761a8a84..5be245296 100644 --- a/functional_tests/step_definitions/application.py +++ b/functional_tests/step_definitions/application.py @@ -174,3 +174,13 @@ def enable_mediawiki_public_registrations(browser): @when(parsers.parse('I disable mediawiki public registrations')) def disable_mediawiki_public_registrations(browser): application.disable_mediawiki_public_registrations(browser) + + +@when(parsers.parse('I enable mediawiki private mode')) +def enable_mediawiki_private_mode(browser): + application.enable_mediawiki_private_mode(browser) + + +@when(parsers.parse('I disable mediawiki private mode')) +def disable_mediawiki_private_mode(browser): + application.disable_mediawiki_private_mode(browser) diff --git a/functional_tests/step_definitions/site.py b/functional_tests/step_definitions/site.py index 2d508b45c..29a018092 100644 --- a/functional_tests/step_definitions/site.py +++ b/functional_tests/step_definitions/site.py @@ -50,3 +50,13 @@ def mediawiki_allows_creating_accounts(browser): @then(parsers.parse('the mediawiki site should not allow creating accounts')) def mediawiki_does_not_allow_creating_accounts(browser): site.verify_mediawiki_no_create_account_link(browser) + + +@then(parsers.parse('the mediawiki site should allow anonymous reads and writes')) +def mediawiki_allows_anonymous_reads_edits(browser): + site.verify_mediawiki_anonymous_reads_edits_link(browser) + + +@then(parsers.parse('the mediawiki site should not allow anonymous reads and writes')) +def mediawiki_does_not_allow__account_creation_anonymous_reads_edits(browser): + site.verify_mediawiki_no_anonymous_reads_edits_link(browser) \ No newline at end of file diff --git a/functional_tests/support/application.py b/functional_tests/support/application.py index fc2dbe735..41063cc55 100644 --- a/functional_tests/support/application.py +++ b/functional_tests/support/application.py @@ -232,3 +232,17 @@ def disable_mediawiki_public_registrations(browser): interface.nav_to_module(browser, 'mediawiki') _change_status(browser, 'mediawiki', 'disabled', checkbox_id='id_enable_public_registrations') + + +def enable_mediawiki_private_mode(browser): + """Enable public registrations in MediaWiki.""" + interface.nav_to_module(browser, 'mediawiki') + _change_status(browser, 'mediawiki', 'enabled', + checkbox_id='id_enable_private_mode') + + +def disable_mediawiki_private_mode(browser): + """Enable public registrations in MediaWiki.""" + interface.nav_to_module(browser, 'mediawiki') + _change_status(browser, 'mediawiki', 'disabled', + checkbox_id='id_enable_private_mode') diff --git a/functional_tests/support/site.py b/functional_tests/support/site.py index 636f48aee..bc394994f 100644 --- a/functional_tests/support/site.py +++ b/functional_tests/support/site.py @@ -69,3 +69,18 @@ def verify_mediawiki_no_create_account_link(browser): browser.visit(config['DEFAULT']['url'] + '/mediawiki') assert eventually(browser.is_element_not_present_by_id, args=['pt-createaccount']) + + +def verify_mediawiki_anonymous_reads_edits_link(browser): + browser.visit(config['DEFAULT']['url'] + '/mediawiki') + assert eventually(browser.is_element_present_by_id, + args=['ca-nstab-main']) + + +def verify_mediawiki_no_anonymous_reads_edits_link(browser): + browser.visit(config['DEFAULT']['url'] + '/mediawiki') + assert eventually(browser.is_element_not_present_by_id, + args=['ca-nstab-main']) + assert eventually(browser.is_element_present_by_id, + args=['ca-nstab-special']) + diff --git a/plinth/modules/mediawiki/__init__.py b/plinth/modules/mediawiki/__init__.py index a4033df98..034205fa4 100644 --- a/plinth/modules/mediawiki/__init__.py +++ b/plinth/modules/mediawiki/__init__.py @@ -134,3 +134,10 @@ def get_public_registration_status(): output = actions.superuser_run('mediawiki', ['public-registrations', 'status']) return output.strip() == 'enabled' + + +def get_private_mode_status(): + """ Return wheter private mode is enabled or disabled""" + output = actions.superuser_run('mediawiki', + ['private-mode', 'status']) + return output.strip() == 'enabled' diff --git a/plinth/modules/mediawiki/forms.py b/plinth/modules/mediawiki/forms.py index b61c5e1e2..228d3db95 100644 --- a/plinth/modules/mediawiki/forms.py +++ b/plinth/modules/mediawiki/forms.py @@ -36,3 +36,9 @@ class MediaWikiForm(ServiceForm): # pylint: disable=W0232 label=_('Enable public registrations'), required=False, help_text=_( 'If enabled, anyone on the internet will be able to ' 'create an account on your MediaWiki instance.')) + + enable_private_mode = forms.BooleanField( + label=_('Enable private mode'), required=False, help_text=_( + 'If enabled, Access will be restricted. Only people ' + 'who have accounts can read/write to the wiki. ' + 'Public registrations will also be disabled.')) diff --git a/plinth/modules/mediawiki/views.py b/plinth/modules/mediawiki/views.py index b17c713fb..5461a2e60 100644 --- a/plinth/modules/mediawiki/views.py +++ b/plinth/modules/mediawiki/views.py @@ -26,7 +26,7 @@ from django.utils.translation import ugettext as _ from plinth import actions, views from plinth.modules import mediawiki -from . import get_public_registration_status +from . import get_public_registration_status, get_private_mode_status from .forms import MediaWikiForm logger = logging.getLogger(__name__) @@ -46,7 +46,8 @@ class MediaWikiServiceView(views.ServiceView): """Return the values to fill in the form.""" initial = super().get_initial() initial.update({ - 'enable_public_registrations': get_public_registration_status() + 'enable_public_registrations': get_public_registration_status(), + 'enable_private_mode': get_private_mode_status() }) return initial @@ -60,13 +61,14 @@ class MediaWikiServiceView(views.ServiceView): app_same = is_unchanged('is_enabled') pub_reg_same = is_unchanged('enable_public_registrations') + private_mode_same = is_unchanged('enable_private_mode') if new_config['password']: actions.superuser_run('mediawiki', ['change-password'], input=new_config['password'].encode()) messages.success(self.request, _('Password updated')) - if app_same and pub_reg_same: + if app_same and pub_reg_same and private_mode_same: if not self.request._messages._queued_messages: messages.info(self.request, _('Setting unchanged')) elif not app_same: @@ -90,4 +92,20 @@ class MediaWikiServiceView(views.ServiceView): messages.success(self.request, _('Public registrations disabled')) + if not private_mode_same: + if new_config['enable_private_mode']: + actions.superuser_run('mediawiki', + ['private-mode', 'enable']) + if new_config['enable_public_registrations']: + # If public registrations are enabled, then disable it + actions.superuser_run('mediawiki', + ['public-registrations', 'disable']) + messages.success(self.request, + _('Private mode enabled')) + else: + actions.superuser_run('mediawiki', + ['private-mode', 'disable']) + messages.success(self.request, + _('Private mode disabled')) + return super().form_valid(form)