From 168f662a179543dcab62bb89fe53cb32dac633f5 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 17 Nov 2025 14:14:41 -0800 Subject: [PATCH] *: Update URL base from /plinth to /freedombox - Since we are going to be an OpenID Provider, we need to fix the URLs that other apps will be configured with for authentication. So change now from /plinth to /freedombox. If done later, it will be harder since all the configuration files for all dependent apps will need to be updated. Tests: - App availability checking works. Request goes to /freedombox URL - Favicon is served properly and through /favicon.ico URL - Redirection happens from / to /freedombox directly - UI is available on /freedombox and on /plinth - Manual page show /freedombox as the URL in two places - Static files are successfully served from /freedombox URLs. URLs inside page start with /freedombox - backup, bepasty, calibre, config, dynamicdns, ejabberd, featherwiki, gitweb, ikiwiki, kiwix, miniflux, names, openvpn, shadowsocks, shadowsocksserver, sharing, shapshot, tiddlywiki, users, wireguard, jsxc, matrixsynapse, first wizard, storage, samba, tags functional tests work. Backup/restore test for matrixsynapse fails due to an unrelated bug (server not restarted after restore). - Setting the home page works: - Having /plinth in the home page configuration works. Shows selection correctly. - Setting to app works. Shows selection correctly. - Setting to user home page (sets /freedombox). Shows selection correctly. - Setting to apache default works. Shows selection correctly. - Changing back to FreedomBox service works. Shows selection correctly. - Unit tests work - Configuration page shows /freedombox in description but not /plinth - Diagnostics show /freedombox in tests - Roundcube URL link in email app has /freedombox - email loads the page /.well-known/autoconfig/mail/config-v1.1.xml correctly - email app shows /freedombox/apps/roundcube for /roundcube if roundcube is not installed. - networks: router configuration page shows URL starting with /freedombox. - snapshot: Shows URL starting with /freedombox on the app page - js licenses page uses /freedombox prefix for JSXC. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- INSTALL.md | 2 +- Makefile | 2 +- Vagrantfile | 2 +- .../apache2/conf-available/freedombox.conf | 12 ++--- doc/plinth.xml | 6 +-- doc/scripts/wikiparser.py | 22 ++++----- plinth/cfg.py | 2 +- .../modules/backups/tests/test_functional.py | 20 ++++---- .../modules/bepasty/tests/test_functional.py | 2 +- .../modules/calibre/tests/test_functional.py | 6 +-- plinth/modules/config/__init__.py | 8 ++-- plinth/modules/config/forms.py | 8 ++-- plinth/modules/config/tests/test_config.py | 17 ++++--- .../modules/config/tests/test_functional.py | 8 ++-- plinth/modules/diagnostics/__init__.py | 2 +- .../dynamicdns/tests/test_functional.py | 6 +-- .../modules/ejabberd/tests/test_functional.py | 2 +- plinth/modules/email/__init__.py | 2 +- .../conf-available/email-freedombox.conf | 4 +- .../featherwiki/tests/test_functional.py | 8 ++-- .../modules/gitweb/tests/test_functional.py | 13 ++--- .../modules/ikiwiki/tests/test_functional.py | 4 +- plinth/modules/kiwix/tests/test_functional.py | 5 +- .../modules/miniflux/tests/test_functional.py | 3 +- plinth/modules/names/tests/test_functional.py | 2 +- .../router_configuration_content.html | 2 +- .../modules/openvpn/tests/test_functional.py | 3 +- .../shadowsocks/tests/test_functional.py | 4 +- .../tests/test_functional.py | 4 +- .../modules/sharing/tests/test_functional.py | 6 +-- plinth/modules/snapshot/__init__.py | 2 +- .../modules/snapshot/tests/test_functional.py | 6 +-- .../includes/freedombox-single-sign-on.conf | 6 +-- .../tiddlywiki/tests/test_functional.py | 12 ++--- plinth/modules/users/tests/test_functional.py | 20 ++++---- .../wireguard/tests/test_functional.py | 2 +- plinth/settings.py | 4 +- plinth/tests/data/configs/freedombox.config | 2 +- plinth/tests/data/shortcuts/dotd.json | 2 +- .../data/shortcuts/dotd.json.d/01_extra.json | 2 +- plinth/tests/data/shortcuts/nextcloud.json | 2 +- plinth/tests/functional/__init__.py | 47 ++++++++++--------- plinth/tests/tags/test_functional.py | 12 ++--- plinth/tests/test_middleware.py | 14 +++--- plinth/tests/test_notification.py | 6 +-- plinth/tests/test_utils.py | 2 +- plinth/tests/test_views.py | 10 ++-- plinth/tests/test_web_server.py | 4 +- plinth/web_server.py | 4 +- static/jslicense.html | 2 +- static/themes/default/js/main.js | 2 +- 51 files changed, 182 insertions(+), 168 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 19d35cb38..d4d8fcce0 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -35,7 +35,7 @@ FreedomBox [Manual](https://wiki.debian.org/FreedomBox/Manual/)'s 3. Access FreedomBox UI: - UI should be accessible at http://localhost:8000/plinth + UI should be accessible at http://localhost:8000/freedombox If you are installing FreedomBox Service (Plinth) for development purposes, see HACKING.md instead. diff --git a/Makefile b/Makefile index 9d0f1c705..e5e5673b7 100644 --- a/Makefile +++ b/Makefile @@ -230,7 +230,7 @@ provision-dev: sshpass bash-completion wait-while-first-setup: - while [ x$$(curl -k https://localhost/plinth/status/ 2> /dev/null | \ + while [ x$$(curl -k https://localhost/freedombox/status/ 2> /dev/null | \ json_pp 2> /dev/null | grep 'is_first_setup_running' | \ tr -d '[:space:]' | cut -d':' -f2 ) != 'xfalse' ] ; do \ sleep 1; echo -n .; done diff --git a/Vagrantfile b/Vagrantfile index c78a26ab3..7534b7549 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -28,7 +28,7 @@ Vagrant.configure(2) do |config| SHELL config.vm.provision "tests", run: "never", type: "shell", path: "plinth/tests/functional/install.sh" config.vm.post_up_message = "FreedomBox virtual machine is ready -for development. Plinth will be available at https://localhost:4430/plinth +for development. Plinth will be available at https://localhost:4430/freedombox (with an invalid SSL certificate). To watch logs: $ vagrant ssh $ sudo freedombox-logs diff --git a/data/etc/apache2/conf-available/freedombox.conf b/data/etc/apache2/conf-available/freedombox.conf index fffff0490..14d2b85fb 100644 --- a/data/etc/apache2/conf-available/freedombox.conf +++ b/data/etc/apache2/conf-available/freedombox.conf @@ -39,16 +39,16 @@ ## -## Redirect traffic on home to /plinth as part of turning the machine +## Redirect traffic on home to /freedombox as part of turning the machine ## into FreedomBox server. Plinth then acts as a portal to reach all ## other services. ## - RedirectMatch "^/$" "/plinth" + RedirectMatch "^/$" "/freedombox" ## -## On all sites, provide FreedomBox on a default path: /plinth +## On all sites, provide FreedomBox on a default path: /freedombox ## ## Requires the following Apache modules to be enabled: ## mod_headers @@ -56,7 +56,7 @@ ## mod_proxy_http ## - ProxyPass http://127.0.0.1:8000/plinth + ProxyPass http://127.0.0.1:8000/freedombox ## Send the scheme from user's request to enable Plinth to redirect ## URLs, set cookies, set absolute URLs (if any) properly. RequestHeader set X-Forwarded-Proto 'https' env=HTTPS @@ -70,7 +70,7 @@ RequestHeader unset X-Forwarded-For - ProxyPass http://127.0.0.1:8000/plinth + ProxyPass http://127.0.0.1:8000/freedombox RequestHeader set X-Forwarded-Proto 'https' env=HTTPS RequestHeader unset X-Forwarded-For @@ -82,7 +82,7 @@ RewriteEngine On - RewriteRule /favicon\.ico$ "/plinth/static/theme/img/favicon.ico" [PT] + RewriteRule /favicon\.ico$ "/freedombox/static/theme/img/favicon.ico" [PT] diff --git a/doc/plinth.xml b/doc/plinth.xml index 1331e08e1..083e68936 100644 --- a/doc/plinth.xml +++ b/doc/plinth.xml @@ -73,8 +73,8 @@ This the URL fragment under which Plinth will provide its services. Plinth is shipped with a default value of - /plinth. This means that Plinth will be - available as http://localhost:8000/plinth by default. + /freedombox. This means that Plinth will be + available as http://localhost:8000/freedombox by default. @@ -194,7 +194,7 @@ $ plinth --server_dir='/myurl' Run Plinth with the '/myurl' prefix. Note that Apache forwards requests - to '/plinth' by default, so /myurl is not accessible outside of your + to '/freedombox' by default, so /myurl is not accessible outside of your FreedomBox without adapting the apache configuration. diff --git a/doc/scripts/wikiparser.py b/doc/scripts/wikiparser.py index a8026f09e..5e08b67cf 100755 --- a/doc/scripts/wikiparser.py +++ b/doc/scripts/wikiparser.py @@ -13,7 +13,7 @@ from pathlib import Path from xml.sax.saxutils import escape BASE_URL = 'https://wiki.debian.org/' -LOCAL_BASE = '/plinth/help/manual/{lang}/' +LOCAL_BASE = '/freedombox/help/manual/{lang}/' ICONS_DIR = 'icons' DEFAULT_LANGUAGE = 'en' @@ -624,21 +624,21 @@ def resolve_url(url, context): Locally available page in default language => shortcut to local copy: >>> resolve_url('FreedomBox/Contribute', {'language': '', 'title': ''}) - '/plinth/help/manual/en/Contribute#' + '/freedombox/help/manual/en/Contribute#' Translated available page => shortcut to local copy: >>> resolve_url('es/FreedomBox/Contribute', {'language': '', 'title': ''}) - '/plinth/help/manual/es/Contribute#' + '/freedombox/help/manual/es/Contribute#' Available page in default language refferred as translated => shortcut to local copy: >>> resolve_url('en/FreedomBox/Contribute', {'language': '', 'title': ''}) - '/plinth/help/manual/en/Contribute#' + '/freedombox/help/manual/en/Contribute#' Unrecognized language => handle considering it as default language: >>> resolve_url('missing/FreedomBox/Contribute', {'language': '', \ 'title': ''}) - '/plinth/help/manual/en/Contribute#' + '/freedombox/help/manual/en/Contribute#' """ # Process first all easy, straight forward cases: @@ -1191,11 +1191,11 @@ from="## BEGIN_INCLUDE", to="## END_INCLUDE")>>') [Paragraph([PlainText('a')]), Paragraph([PlainText('b ')])] >>> parse_wiki('{{{#!wiki caution\\n\\nOnce some other app is set as the \ home page, you can only navigate to the !FreedomBox Service (Plinth) by \ -typing https://myfreedombox.rocks/plinth/ into the browser. <
>\\n\ +typing https://myfreedombox.rocks/freedombox/ into the browser. <
>\\n\ ''/freedombox'' can also be used as an alias to ''/plinth''\\n}}}') [Admonition('caution', [Paragraph([PlainText('Once some other app is set \ as the home page, you can only navigate to the FreedomBox Service (Plinth) by \ -typing '), Url('https://myfreedombox.rocks/plinth/'), PlainText(' into the \ +typing '), Url('https://myfreedombox.rocks/freedombox/'), PlainText(' into the \ browser. ')]), Paragraph([PlainText('/freedombox can also be used as an alias \ to /plinth ')])])] @@ -1761,7 +1761,7 @@ Features introduction' >>> generate_inner_docbook([Link('../../Contribute', \ [PlainText('Contribute')])], context={'title': 'FreedomBox/Manual/Hardware'}) - '\ + '\ Contribute' >>> generate_inner_docbook([Link('/Code', \ @@ -1772,9 +1772,9 @@ Code' >>> generate_inner_docbook([Link('DebianBug:1234', [PlainText('Bug')])]) 'Bug' - >>> generate_inner_docbook([Link('DebianPkg:plinth', \ + >>> generate_inner_docbook([Link('DebianPkg:freedombox', \ [PlainText('Plinth')])]) - 'Plinth' + 'Plinth' >>> generate_inner_docbook([Link('AliothList:freedombox-discuss', \ [PlainText('Discuss')])]) @@ -1911,7 +1911,7 @@ PlainText(' on it. ')])]) 'An alternative to downloading these images is to \ \ install Debian on the BeagleBone and then \ -install \ +install \ FreedomBox on it. ' >>> generate_inner_docbook([Paragraph([PlainText('After Roundcube is \ diff --git a/plinth/cfg.py b/plinth/cfg.py index b53d2df71..d95ff07dc 100644 --- a/plinth/cfg.py +++ b/plinth/cfg.py @@ -16,7 +16,7 @@ data_dir = '/var/lib/plinth' custom_static_dir = '/var/www/plinth/custom/static' store_file = data_dir + '/plinth.sqlite3' doc_dir = '/usr/share/freedombox' -server_dir = '/plinth' +server_dir = '/freedombox' # [Network] section host = '127.0.0.1' diff --git a/plinth/modules/backups/tests/test_functional.py b/plinth/modules/backups/tests/test_functional.py index 7a109288d..0377239b2 100644 --- a/plinth/modules/backups/tests/test_functional.py +++ b/plinth/modules/backups/tests/test_functional.py @@ -85,7 +85,8 @@ def test_remote_backup_location(session_browser): def _assert_main_page_is_shown(session_browser): - assert (session_browser.url.endswith('/plinth/')) + assert (session_browser.url.endswith('/freedombox/') + or session_browser.url.endswith('/plinth/')) def _backup_download(session_browser, downloaded_file_info, archive_name): @@ -126,7 +127,7 @@ def _backup_schedule_get(browser): functional.nav_to_module(browser, 'backups') with functional.wait_for_page_update(browser): browser.links.find_by_href( - '/plinth/sys/backups/root/schedule/').first.click() + '/freedombox/sys/backups/root/schedule/').first.click() without_apps = [] elements = browser.find_by_name('backups_schedule-selected_apps') @@ -158,7 +159,7 @@ def _backup_schedule_set(browser, enable, daily, weekly, monthly, run_at, functional.nav_to_module(browser, 'backups') with functional.wait_for_page_update(browser): browser.links.find_by_href( - '/plinth/sys/backups/root/schedule/').first.click() + '/freedombox/sys/backups/root/schedule/').first.click() if enable: browser.find_by_name('backups_schedule-enabled').check() @@ -192,7 +193,7 @@ def _download_file_logged_in(browser, url, suffix=''): def _download(browser, archive_name=None): """Download a backup archive to a temporary file on disk.""" functional.nav_to_module(browser, 'backups') - href = f'/plinth/sys/backups/root/download/{archive_name}/' + href = f'/freedombox/sys/backups/root/download/{archive_name}/' url = functional.base_url + href file_path = _download_file_logged_in(browser, url, suffix='.tar.gz') return file_path @@ -201,22 +202,23 @@ def _download(browser, archive_name=None): def _open_main_page(browser): """Open the FreedomBox interface main page.""" with functional.wait_for_page_update(browser): - browser.links.find_by_href('/plinth/').first.click() + browser.links.find_by_href('/freedombox/').first.click() def _upload_and_restore(browser, app_name, downloaded_file_path): """Upload a backup archive from the disk and perform restore operation.""" functional.nav_to_module(browser, 'backups') with functional.wait_for_page_update(browser): - browser.links.find_by_href('/plinth/sys/backups/upload/').first.click() + browser.links.find_by_href( + '/freedombox/sys/backups/upload/').first.click() fileinput = browser.find_by_id('id_backups-file') fileinput.fill(downloaded_file_path) # submit upload form functional.submit(browser, form_class='form-upload') # submit restore form - with functional.wait_for_page_update(browser, - expected_url='/plinth/sys/backups/'): + with functional.wait_for_page_update( + browser, expected_url='/freedombox/sys/backups/'): functional.submit(browser, form_class='form-restore') @@ -233,7 +235,7 @@ def _add_remote_backup_location(browser, ssh_use_password=True): _remove_remote_backup_location(browser) browser.links.find_by_href( - '/plinth/sys/backups/repositories/add-remote/').first.click() + '/freedombox/sys/backups/repositories/add-remote/').first.click() browser.find_by_name('repository').fill(REMOTE_PATH) password = functional.get_password( functional.config['DEFAULT']['username']) diff --git a/plinth/modules/bepasty/tests/test_functional.py b/plinth/modules/bepasty/tests/test_functional.py index 222d5db1d..a1e0dc1c5 100644 --- a/plinth/modules/bepasty/tests/test_functional.py +++ b/plinth/modules/bepasty/tests/test_functional.py @@ -68,7 +68,7 @@ def _set_default_permissions(browser, permissions=''): def _add_password(browser): - functional.visit(browser, '/plinth/apps/bepasty/add/') + functional.visit(browser, '/freedombox/apps/bepasty/add/') for permission in ['read', 'create', 'list', 'delete', 'admin']: browser.find_by_css('#id_bepasty-permissions input[value="{}"]'.format( permission)).check() diff --git a/plinth/modules/calibre/tests/test_functional.py b/plinth/modules/calibre/tests/test_functional.py index d658ceecf..6e52d026a 100644 --- a/plinth/modules/calibre/tests/test_functional.py +++ b/plinth/modules/calibre/tests/test_functional.py @@ -60,7 +60,7 @@ def _add_library(browser, name): return browser.links.find_by_href( - '/plinth/apps/calibre/library/create/').first.click() + '/freedombox/apps/calibre/library/create/').first.click() browser.find_by_id('id_calibre-name').fill(name) functional.submit(browser, form_class='form-calibre') @@ -69,7 +69,7 @@ def _delete_library(browser, name, ignore_missing=False): """Delete a library.""" functional.nav_to_module(browser, 'calibre') link = browser.links.find_by_href( - f'/plinth/apps/calibre/library/{name}/delete/') + f'/freedombox/apps/calibre/library/{name}/delete/') if not link: if ignore_missing: return @@ -84,7 +84,7 @@ def _is_library_available(browser, name): """Return whether a library is present in the list of libraries.""" functional.nav_to_module(browser, 'calibre') link = browser.links.find_by_href( - f'/plinth/apps/calibre/library/{name}/delete/') + f'/freedombox/apps/calibre/library/{name}/delete/') return bool(link) diff --git a/plinth/modules/config/__init__.py b/plinth/modules/config/__init__.py index c0b82f459..3981a25e5 100644 --- a/plinth/modules/config/__init__.py +++ b/plinth/modules/config/__init__.py @@ -94,7 +94,7 @@ def home_page_url2scid(url: str | None): if url in ('/plinth/', '/plinth', 'plinth', '/freedombox/', '/freedombox', 'freedombox'): - return 'plinth' + return 'freedombox' if url and url.startswith('/~'): return 'uws-{}'.format(user_of_uws_url(url)) @@ -109,8 +109,8 @@ def home_page_url2scid(url: str | None): def _home_page_scid2url(shortcut_id: str) -> str | None: """Return the url for the given home page shortcut ID.""" - url: str | None = '/plinth/' - if shortcut_id == 'plinth': + url: str | None = '/freedombox/' + if shortcut_id == 'freedombox': pass elif shortcut_id == 'apache-default': url = None @@ -134,7 +134,7 @@ def _get_home_page_url() -> str | None: """Get the default application for the domain.""" conf_file = privileged.APACHE_HOMEPAGE_CONFIG if not pathlib.Path(conf_file).exists(): - return '/plinth/' + return '/freedombox/' aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + augeas.Augeas.NO_MODL_AUTOLOAD) diff --git a/plinth/modules/config/forms.py b/plinth/modules/config/forms.py index e79d9aa11..107905652 100644 --- a/plinth/modules/config/forms.py +++ b/plinth/modules/config/forms.py @@ -24,8 +24,8 @@ def get_homepage_choices(): format_lazy(gettext_lazy("{user}'s website"), user=user)) for user, url in get_users_with_website().items()] apache_default = ('apache-default', _('Apache Default')) - plinth = ('plinth', _('FreedomBox Service (Plinth)')) - return [apache_default, plinth] + uws_choices + shortcut_choices + freedombox = ('freedombox', _('FreedomBox Service (Plinth)')) + return [apache_default, freedombox] + uws_choices + shortcut_choices class ConfigurationForm(forms.Form): @@ -39,8 +39,8 @@ class ConfigurationForm(forms.Form): 'case is to set your blog or wiki as the home page when ' 'someone visits the domain name. Note that once the home ' 'page is set to something other than {box_name} Service ' - '(Plinth), your users must explicitly type /plinth or ' - '/freedombox to reach {box_name} Service (Plinth).'), + '(Plinth), your users must explicitly type /freedombox to ' + 'reach {box_name} Service (Plinth).'), box_name=gettext_lazy(cfg.box_name)), required=False, choices=get_homepage_choices) diff --git a/plinth/modules/config/tests/test_config.py b/plinth/modules/config/tests/test_config.py index 5453fed1a..0d576e3f3 100644 --- a/plinth/modules/config/tests/test_config.py +++ b/plinth/modules/config/tests/test_config.py @@ -21,15 +21,18 @@ def test_homepage_mapping(): func = home_page_url2scid assert func(None) == 'apache-default' assert func('/unknown/url') is None - assert func('/plinth/') == 'plinth' - assert func('/plinth') == 'plinth' - assert func('plinth') == 'plinth' + assert func('/plinth/') == 'freedombox' + assert func('/plinth') == 'freedombox' + assert func('plinth') == 'freedombox' + assert func('/freedombox/') == 'freedombox' + assert func('/freedombox') == 'freedombox' + assert func('freedombox') == 'freedombox' assert func('/index.html') == 'apache-default' assert func('/~user') == 'uws-user' assert func('/~user/whatever/else') == 'uws-user' func = _home_page_scid2url - assert func('plinth') == '/plinth/' + assert func('freedombox') == '/freedombox/' assert func('apache-default') is None @@ -63,7 +66,7 @@ def test_homepage_mapping_skip_ci(): # AC: Return None if it doesn't: os.rmdir(uws_directory) - assert _home_page_scid2url(uws_scid) == '/plinth/' + assert _home_page_scid2url(uws_scid) == '/freedombox/' @patch( @@ -102,7 +105,7 @@ def test_homepage_field(): uws_url = uws_url_of_user(user) uws_scid = home_page_url2scid(uws_url) - default_home_page = 'plinth' + default_home_page = 'freedombox' original_home_page = get_home_page() or default_home_page change_home_page(default_home_page) # Set to known value explicitly @@ -113,7 +116,7 @@ def test_homepage_field(): # AC: valid changes actually happen: pathlib.Path(uws_directory).mkdir(parents=True) - for scid in ('b', 'a', uws_scid, 'apache-default', 'plinth'): + for scid in ('b', 'a', uws_scid, 'apache-default', 'freedombox'): change_home_page(scid) assert get_home_page() == scid diff --git a/plinth/modules/config/tests/test_functional.py b/plinth/modules/config/tests/test_functional.py index 241858386..3296b4c87 100644 --- a/plinth/modules/config/tests/test_functional.py +++ b/plinth/modules/config/tests/test_functional.py @@ -22,12 +22,12 @@ def test_change_home_page(session_browser): functional.app_enable(session_browser, 'syncthing') _set_home_page(session_browser, 'syncthing') - _set_home_page(session_browser, 'plinth') - assert _check_home_page_redirect(session_browser, 'plinth') + _set_home_page(session_browser, 'freedombox') + assert _check_home_page_redirect(session_browser, 'freedombox') def _set_home_page(browser, home_page): - if 'plinth' not in home_page and 'apache' not in home_page: + if 'freedombox' not in home_page and 'apache' not in home_page: home_page = 'shortcut-' + home_page functional.nav_to_module(browser, 'config') @@ -39,4 +39,4 @@ def _set_home_page(browser, home_page): def _check_home_page_redirect(browser, app_name): functional.visit(browser, '/') return browser.find_by_xpath( - "//a[contains(@href, '/plinth/') and @title='FreedomBox']") + "//a[contains(@href, '/freedombox/') and @title='FreedomBox']") diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index 0b3d21d65..21248f58d 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -100,7 +100,7 @@ class DiagnosticsApp(app_module.App): results = super().diagnose() results.append(diagnose_port_listening(8000, 'tcp4')) results.extend( - diagnose_url_on_all('http://{host}/plinth/', + diagnose_url_on_all('http://{host}/freedombox/', check_certificate=False)) return results diff --git a/plinth/modules/dynamicdns/tests/test_functional.py b/plinth/modules/dynamicdns/tests/test_functional.py index 10df62575..b91a0e6b2 100644 --- a/plinth/modules/dynamicdns/tests/test_functional.py +++ b/plinth/modules/dynamicdns/tests/test_functional.py @@ -112,7 +112,7 @@ def _configure(browser, config): functional.nav_to_module(browser, 'dynamicdns') functional.click_link_by_href(browser, - '/plinth/sys/dynamicdns/domain/add/') + '/freedombox/sys/dynamicdns/domain/add/') for key, value in config.items(): field_id = f'id_domain-{key}' if key == 'service_type': @@ -130,7 +130,7 @@ def _configure(browser, config): def _assert_has_config(browser, config): functional.nav_to_module(browser, 'dynamicdns') - link = f'/plinth/sys/dynamicdns/domain/{config["domain"]}/edit/' + link = f'/freedombox/sys/dynamicdns/domain/{config["domain"]}/edit/' functional.click_link_by_href(browser, link) for key, value in config.items(): if key == 'password': @@ -153,6 +153,6 @@ def _get_domains(browser): def _delete_domain(browser, domain): """Delete a given domain.""" functional.nav_to_module(browser, 'dynamicdns') - link = f'/plinth/sys/dynamicdns/domain/{domain}/delete/' + link = f'/freedombox/sys/dynamicdns/domain/{domain}/delete/' functional.click_link_by_href(browser, link) functional.submit(browser, form_class='form-delete') diff --git a/plinth/modules/ejabberd/tests/test_functional.py b/plinth/modules/ejabberd/tests/test_functional.py index 101146c89..edd0e387b 100644 --- a/plinth/modules/ejabberd/tests/test_functional.py +++ b/plinth/modules/ejabberd/tests/test_functional.py @@ -118,7 +118,7 @@ def _jsxc_login(browser): """Login to JSXC.""" username = functional.config['DEFAULT']['username'] password = functional.config['DEFAULT']['password'] - functional.visit(browser, '/plinth/apps/jsxc/jsxc/') + functional.visit(browser, '/freedombox/apps/jsxc/jsxc/') assert functional.eventually(browser.find_by_text, ['BOSH Server reachable.']) if browser.find_by_text('relogin'): diff --git a/plinth/modules/email/__init__.py b/plinth/modules/email/__init__.py index b8de9b7a7..0bc6763a1 100644 --- a/plinth/modules/email/__init__.py +++ b/plinth/modules/email/__init__.py @@ -38,7 +38,7 @@ _description = [ 'they can add aliases to their email address. Necessary aliases ' 'such as "postmaster" are automatically created pointing to the ' 'first admin user.'), box_name=_(cfg.box_name)), - _('Roundcube app provides web ' + _('Roundcube app provides web ' 'interface for users to access email.'), _('During installation, any other email servers in the system will be ' 'uninstalled.') diff --git a/plinth/modules/email/data/usr/share/freedombox/etc/apache2/conf-available/email-freedombox.conf b/plinth/modules/email/data/usr/share/freedombox/etc/apache2/conf-available/email-freedombox.conf index f402a3cb3..59421bc7e 100644 --- a/plinth/modules/email/data/usr/share/freedombox/etc/apache2/conf-available/email-freedombox.conf +++ b/plinth/modules/email/data/usr/share/freedombox/etc/apache2/conf-available/email-freedombox.conf @@ -25,12 +25,12 @@ RewriteEngine On - RewriteRule ^ /plinth/apps/email/config.xml [PT] + RewriteRule ^ /freedombox/apps/email/config.xml [PT] # If Roundcube is not yet installed and the user clicks on 'Launch web client', # redirect to the installation page instead of Apache's Not Found page. - ErrorDocument 404 /plinth/apps/roundcube/ + ErrorDocument 404 /freedombox/apps/roundcube/ diff --git a/plinth/modules/featherwiki/tests/test_functional.py b/plinth/modules/featherwiki/tests/test_functional.py index 812c54e97..4bc7dfb9a 100644 --- a/plinth/modules/featherwiki/tests/test_functional.py +++ b/plinth/modules/featherwiki/tests/test_functional.py @@ -27,7 +27,7 @@ class TestFeatherWikiApp(functional.BaseAppTests): return session_browser.links.find_by_href( - '/plinth/apps/featherwiki/create/').first.click() + '/freedombox/apps/featherwiki/create/').first.click() session_browser.find_by_id('id_featherwiki-name').fill(course_1) functional.submit(session_browser, form_class='form-featherwiki') @@ -73,7 +73,7 @@ class TestFeatherWikiApp(functional.BaseAppTests): new_course = 'A Midsummer Night\'s Dream' new_file_name = 'A_Midsummer_Nights_Dream.html' self._get_links_in_app_page( - session_browser, '/plinth/apps/featherwiki/' + file_name_1 + + session_browser, '/freedombox/apps/featherwiki/' + file_name_1 + '/rename/').first.click() session_browser.find_by_id('id_featherwiki-new_name').fill(new_course) functional.submit(session_browser, form_class='form-featherwiki') @@ -87,7 +87,7 @@ class TestFeatherWikiApp(functional.BaseAppTests): test_wiki_file = str(_test_data_dir / 'dummy_wiki.html') session_browser.links.find_by_href( - '/plinth/apps/featherwiki/upload/').first.click() + '/freedombox/apps/featherwiki/upload/').first.click() session_browser.attach_file('featherwiki-file', test_wiki_file) functional.submit(session_browser, form_class='form-featherwiki') @@ -98,7 +98,7 @@ class TestFeatherWikiApp(functional.BaseAppTests): self._create_wiki_file(session_browser) self._get_links_in_app_page( - session_browser, '/plinth/apps/featherwiki/' + file_name_1 + + session_browser, '/freedombox/apps/featherwiki/' + file_name_1 + '/delete/').first.click() functional.submit(session_browser, form_class='form-delete') diff --git a/plinth/modules/gitweb/tests/test_functional.py b/plinth/modules/gitweb/tests/test_functional.py index 5f8a67ee7..96147cc6f 100644 --- a/plinth/modules/gitweb/tests/test_functional.py +++ b/plinth/modules/gitweb/tests/test_functional.py @@ -144,7 +144,8 @@ def _create_repo(browser, repo, access=None, ok_if_exists=False): """Create repository.""" if not _repo_exists(browser, repo, access): _delete_repo(browser, repo, ignore_missing=True) - browser.links.find_by_href('/plinth/apps/gitweb/create/').first.click() + browser.links.find_by_href( + '/freedombox/apps/gitweb/create/').first.click() browser.find_by_id('id_gitweb-name').fill(repo) if access == 'private': browser.find_by_id('id_gitweb-is_private').check() @@ -182,7 +183,7 @@ def _delete_repo(browser, repo, ignore_missing=False): if repo.endswith('.git'): repo = repo[:-4] delete_link = browser.links.find_by_href( - '/plinth/apps/gitweb/{}/delete/'.format(repo)) + '/freedombox/apps/gitweb/{}/delete/'.format(repo)) if delete_link or not ignore_missing: delete_link.first.click() functional.submit(browser, form_class='form-delete') @@ -192,7 +193,7 @@ def _edit_repo_metadata(browser, repo, metadata): """Set repository metadata.""" functional.nav_to_module(browser, 'gitweb') browser.links.find_by_href( - '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() + '/freedombox/apps/gitweb/{}/edit/'.format(repo)).first.click() browser.find_by_id('id_gitweb-name').fill(metadata['name']) browser.find_by_id('id_gitweb-description').fill(metadata['description']) browser.find_by_id('id_gitweb-owner').fill(metadata['owner']) @@ -214,7 +215,7 @@ def _get_repo_metadata(browser, repo): """Get repository metadata.""" functional.nav_to_module(browser, 'gitweb') browser.links.find_by_href( - '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() + '/freedombox/apps/gitweb/{}/edit/'.format(repo)).first.click() metadata = {} for item in ['name', 'description', 'owner']: metadata[item] = browser.find_by_id('id_gitweb-' + item).value @@ -318,7 +319,7 @@ def _set_default_branch(browser, repo, branch): """Set default branch of the repository.""" functional.nav_to_module(browser, 'gitweb') browser.links.find_by_href( - '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() + '/freedombox/apps/gitweb/{}/edit/'.format(repo)).first.click() browser.find_by_id('id_gitweb-default_branch').select(branch) functional.submit(browser, form_class='form-gitweb') @@ -327,7 +328,7 @@ def _set_repo_access(browser, repo, access): """Set repository as public or private.""" functional.nav_to_module(browser, 'gitweb') browser.links.find_by_href( - '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() + '/freedombox/apps/gitweb/{}/edit/'.format(repo)).first.click() if access == 'private': browser.find_by_id('id_gitweb-is_private').check() else: diff --git a/plinth/modules/ikiwiki/tests/test_functional.py b/plinth/modules/ikiwiki/tests/test_functional.py index 183ceae07..dc5908fe1 100644 --- a/plinth/modules/ikiwiki/tests/test_functional.py +++ b/plinth/modules/ikiwiki/tests/test_functional.py @@ -34,7 +34,7 @@ def _create_wiki_if_needed(browser): wiki = browser.links.find_by_href('/ikiwiki/wiki') if not wiki: browser.links.find_by_href( - '/plinth/apps/ikiwiki/create/').first.click() + '/freedombox/apps/ikiwiki/create/').first.click() browser.find_by_id('id_ikiwiki-name').fill('wiki') browser.find_by_id('id_ikiwiki-admin_name').fill( functional.config['DEFAULT']['username']) @@ -47,7 +47,7 @@ def _delete_wiki(browser): """Delete wiki.""" functional.nav_to_module(browser, 'ikiwiki') browser.links.find_by_href( - '/plinth/apps/ikiwiki/wiki/delete/').first.click() + '/freedombox/apps/ikiwiki/wiki/delete/').first.click() functional.submit(browser, form_class='form-delete') diff --git a/plinth/modules/kiwix/tests/test_functional.py b/plinth/modules/kiwix/tests/test_functional.py index c23644b5d..504efbb81 100644 --- a/plinth/modules/kiwix/tests/test_functional.py +++ b/plinth/modules/kiwix/tests/test_functional.py @@ -74,7 +74,8 @@ class TestKiwixApp(functional.BaseAppTests): def _add_package(browser, file_name): """Add a package by uploading the ZIM file in kiwix app page.""" - browser.links.find_by_href('/plinth/apps/kiwix/package/add/').first.click() + browser.links.find_by_href( + '/freedombox/apps/kiwix/package/add/').first.click() browser.attach_file('kiwix-file', file_name) functional.submit(browser, form_class='form-kiwix') @@ -98,7 +99,7 @@ def _delete_package(browser, zim_id): """Delete a content package from the kiwix app page.""" functional.nav_to_module(browser, 'kiwix') link = browser.links.find_by_href( - f'/plinth/apps/kiwix/package/{zim_id}/delete/') + f'/freedombox/apps/kiwix/package/{zim_id}/delete/') if not link: raise ValueError('ZIM file missing!') diff --git a/plinth/modules/miniflux/tests/test_functional.py b/plinth/modules/miniflux/tests/test_functional.py index ffca4fca5..f3e5e685f 100644 --- a/plinth/modules/miniflux/tests/test_functional.py +++ b/plinth/modules/miniflux/tests/test_functional.py @@ -59,7 +59,8 @@ class TestMinifluxApp(functional.BaseAppTests): def _fill_credentials_form(browser, href): """Fill the user credentials form in Miniflux app.""" functional.nav_to_module(browser, 'miniflux') - functional.click_link_by_href(browser, f'/plinth/apps/miniflux/{href}/') + functional.click_link_by_href(browser, + f'/freedombox/apps/miniflux/{href}/') browser.fill('miniflux-username', CREDENTIALS['username']) browser.fill('miniflux-password', CREDENTIALS['password']) diff --git a/plinth/modules/names/tests/test_functional.py b/plinth/modules/names/tests/test_functional.py index 4e14d92da..c5d0b09c4 100644 --- a/plinth/modules/names/tests/test_functional.py +++ b/plinth/modules/names/tests/test_functional.py @@ -24,7 +24,7 @@ def test_change_hostname(session_browser): def _get_hostname(browser): - functional.visit(browser, '/plinth/sys/names/hostname/') + functional.visit(browser, '/freedombox/sys/names/hostname/') return browser.find_by_id('id_hostname-hostname').value diff --git a/plinth/modules/networks/templates/router_configuration_content.html b/plinth/modules/networks/templates/router_configuration_content.html index af407ded0..25cd3dc8d 100644 --- a/plinth/modules/networks/templates/router_configuration_content.html +++ b/plinth/modules/networks/templates/router_configuration_content.html @@ -32,7 +32,7 @@ {% blocktrans trimmed %} If you don't have control over your router, choose not to configure it. To see options to overcome this limitation, choose 'I dont have a public IP address' option - in Internet connection type selection. + in Internet connection type selection. {% endblocktrans %}

diff --git a/plinth/modules/openvpn/tests/test_functional.py b/plinth/modules/openvpn/tests/test_functional.py index 4c8aeda47..dc7f58675 100644 --- a/plinth/modules/openvpn/tests/test_functional.py +++ b/plinth/modules/openvpn/tests/test_functional.py @@ -4,6 +4,7 @@ Functional, browser based tests for openvpn app. """ import pytest + from plinth.tests import functional pytestmark = [pytest.mark.apps, pytest.mark.openvpn] @@ -64,5 +65,5 @@ def _download_profile(browser): """Return the content of the current user's OpenVPN profile.""" browser.visit(base_url) browser.links.find_by_href(shortcut_href).click() - profile_url = f'{base_url}/plinth/apps/openvpn/profile/' + profile_url = f'{base_url}/freedombox/apps/openvpn/profile/' return functional.download_file(browser, profile_url) diff --git a/plinth/modules/shadowsocks/tests/test_functional.py b/plinth/modules/shadowsocks/tests/test_functional.py index 1ed8fc38e..14a50d6f8 100644 --- a/plinth/modules/shadowsocks/tests/test_functional.py +++ b/plinth/modules/shadowsocks/tests/test_functional.py @@ -38,7 +38,7 @@ class TestShadowsocksApp(functional.BaseAppTests): def _configure(browser, server, password): """Configure shadowsocks client with given server details.""" - functional.visit(browser, '/plinth/apps/shadowsocks/') + functional.visit(browser, '/freedombox/apps/shadowsocks/') browser.find_by_id('id_server').fill(server) browser.find_by_id('id_password').fill(password) functional.submit(browser, form_class='form-configuration') @@ -46,7 +46,7 @@ def _configure(browser, server, password): def _get_configuration(browser): """Return the server and password currently configured in shadowsocks.""" - functional.visit(browser, '/plinth/apps/shadowsocks/') + functional.visit(browser, '/freedombox/apps/shadowsocks/') server = browser.find_by_id('id_server').value password = browser.find_by_id('id_password').value return server, password diff --git a/plinth/modules/shadowsocksserver/tests/test_functional.py b/plinth/modules/shadowsocksserver/tests/test_functional.py index 4b0cc2c07..02e302d37 100644 --- a/plinth/modules/shadowsocksserver/tests/test_functional.py +++ b/plinth/modules/shadowsocksserver/tests/test_functional.py @@ -38,13 +38,13 @@ class TestShadowsocksServerApp(functional.BaseAppTests): def _configure(browser, password): """Configure Shadowsocks Server with given details.""" - functional.visit(browser, '/plinth/apps/shadowsocksserver/') + functional.visit(browser, '/freedombox/apps/shadowsocksserver/') browser.find_by_id('id_password').fill(password) functional.submit(browser, form_class='form-configuration') def _get_configuration(browser): """Return the password currently configured in Shadowsocks Server.""" - functional.visit(browser, '/plinth/apps/shadowsocksserver/') + functional.visit(browser, '/freedombox/apps/shadowsocksserver/') password = browser.find_by_id('id_password').value return password diff --git a/plinth/modules/sharing/tests/test_functional.py b/plinth/modules/sharing/tests/test_functional.py index 1dc238af2..77aab943b 100644 --- a/plinth/modules/sharing/tests/test_functional.py +++ b/plinth/modules/sharing/tests/test_functional.py @@ -80,7 +80,7 @@ def _remove_share(browser, name): def _add_share(browser, name, path, group): """Add a share in sharing app.""" - functional.visit(browser, '/plinth/apps/sharing/add/') + functional.visit(browser, '/freedombox/apps/sharing/add/') browser.fill('sharing-name', name) browser.fill('sharing-path', path) browser.find_by_css( @@ -102,7 +102,7 @@ def _edit_share(browser, old_name, new_name, path, group): def _get_share(browser, name): """Return the row for a given share.""" - functional.visit(browser, '/plinth/apps/sharing/') + functional.visit(browser, '/freedombox/apps/sharing/') return browser.find_by_id('share-{}'.format(name))[0] @@ -148,4 +148,4 @@ def _verify_nonexistant_share(browser, name): def _verify_inaccessible_share(browser, name): """Verify that given URL for a given share name denies permission.""" functional.visit(browser, f'/share/{name}') - functional.eventually(lambda: '/plinth' in browser.url, args=[]) + functional.eventually(lambda: '/freedombox' in browser.url, args=[]) diff --git a/plinth/modules/snapshot/__init__.py b/plinth/modules/snapshot/__init__.py index 6b211c938..7dca6336a 100644 --- a/plinth/modules/snapshot/__init__.py +++ b/plinth/modules/snapshot/__init__.py @@ -24,7 +24,7 @@ _description = [ 'automatically cleaned up according to the settings below.'), _('Snapshots currently work on btrfs file systems only and on the root ' 'partition only. Snapshots are not a replacement for ' - 'backups since ' + 'backups since ' 'they can only be stored on the same partition. ') ] diff --git a/plinth/modules/snapshot/tests/test_functional.py b/plinth/modules/snapshot/tests/test_functional.py index fb39aa58b..88664a3b8 100644 --- a/plinth/modules/snapshot/tests/test_functional.py +++ b/plinth/modules/snapshot/tests/test_functional.py @@ -61,7 +61,7 @@ def _empty_snapshots_list(browser): def _delete_all(browser): - functional.visit(browser, '/plinth/sys/snapshot/manage/') + functional.visit(browser, '/freedombox/sys/snapshot/manage/') delete_button = browser.find_by_name('delete_selected').first if not delete_button['disabled']: browser.find_by_id('select-all').check() @@ -73,13 +73,13 @@ def _delete_all(browser): def _create_snapshot(browser): - functional.visit(browser, '/plinth/sys/snapshot/manage/') + functional.visit(browser, '/freedombox/sys/snapshot/manage/') create_button = browser.find_by_name('create').first functional.submit(browser, element=create_button) def _get_count(browser): - functional.visit(browser, '/plinth/sys/snapshot/manage/') + functional.visit(browser, '/freedombox/sys/snapshot/manage/') # Subtract 1 for table header return len(browser.find_by_xpath('//tr')) - 1 diff --git a/plinth/modules/sso/data/usr/share/freedombox/etc/apache2/includes/freedombox-single-sign-on.conf b/plinth/modules/sso/data/usr/share/freedombox/etc/apache2/includes/freedombox-single-sign-on.conf index 09cb21ba6..6ced5ea9f 100644 --- a/plinth/modules/sso/data/usr/share/freedombox/etc/apache2/includes/freedombox-single-sign-on.conf +++ b/plinth/modules/sso/data/usr/share/freedombox/etc/apache2/includes/freedombox-single-sign-on.conf @@ -1,11 +1,11 @@ TKTAuthPublicKey /etc/apache2/auth-pubtkt-keys/pubkey.pem - TKTAuthLoginURL /plinth/accounts/sso/login/ + TKTAuthLoginURL /freedombox/accounts/sso/login/ TKTAuthBackArgName next TKTAuthDigest SHA512 - TKTAuthRefreshURL /plinth/accounts/sso/refresh/ - TKTAuthUnauthURL /plinth + TKTAuthRefreshURL /freedombox/accounts/sso/refresh/ + TKTAuthUnauthURL /freedombox AuthType mod_auth_pubtkt AuthName "FreedomBox Single Sign On" Require valid-user diff --git a/plinth/modules/tiddlywiki/tests/test_functional.py b/plinth/modules/tiddlywiki/tests/test_functional.py index aa603a6a1..a8c222ade 100644 --- a/plinth/modules/tiddlywiki/tests/test_functional.py +++ b/plinth/modules/tiddlywiki/tests/test_functional.py @@ -27,7 +27,7 @@ class TestTiddlyWikiApp(functional.BaseAppTests): return session_browser.links.find_by_href( - '/plinth/apps/tiddlywiki/create/').first.click() + '/freedombox/apps/tiddlywiki/create/').first.click() session_browser.find_by_id('id_tiddlywiki-name').fill(wiki_name) functional.submit(session_browser, form_class='form-tiddlywiki') @@ -74,8 +74,8 @@ class TestTiddlyWikiApp(functional.BaseAppTests): new_wiki_name = 'A Midsummer Night\'s Dream' new_file_name = 'A_Midsummer_Nights_Dream.html' self._get_links_in_app_page( - session_browser, - '/plinth/apps/tiddlywiki/' + file_name + '/rename/').first.click() + session_browser, '/freedombox/apps/tiddlywiki/' + file_name + + '/rename/').first.click() session_browser.find_by_id('id_tiddlywiki-new_name').fill( new_wiki_name) functional.submit(session_browser, form_class='form-tiddlywiki') @@ -89,7 +89,7 @@ class TestTiddlyWikiApp(functional.BaseAppTests): test_wiki_file = str(_test_data_dir / 'dummy_wiki.html') session_browser.links.find_by_href( - '/plinth/apps/tiddlywiki/upload/').first.click() + '/freedombox/apps/tiddlywiki/upload/').first.click() session_browser.attach_file('tiddlywiki-file', test_wiki_file) functional.submit(session_browser, form_class='form-tiddlywiki') @@ -100,8 +100,8 @@ class TestTiddlyWikiApp(functional.BaseAppTests): self._create_wiki_file(session_browser) self._get_links_in_app_page( - session_browser, - '/plinth/apps/tiddlywiki/' + file_name + '/delete/').first.click() + session_browser, '/freedombox/apps/tiddlywiki/' + file_name + + '/delete/').first.click() functional.submit(session_browser, form_class='form-delete') self._assert_wiki_present(session_browser, file_name, present=False) diff --git a/plinth/modules/users/tests/test_functional.py b/plinth/modules/users/tests/test_functional.py index a56cbf11e..b18f537c9 100644 --- a/plinth/modules/users/tests/test_functional.py +++ b/plinth/modules/users/tests/test_functional.py @@ -303,7 +303,7 @@ def _should_not_connect_passwordless_over_ssh(session_browser, def _rename_user(browser, old_name, new_name): functional.nav_to_module(browser, 'users') functional.click_link_by_href(browser, - f'/plinth/sys/users/{old_name}/edit/') + f'/freedombox/sys/users/{old_name}/edit/') browser.find_by_id('id_username').fill(new_name) browser.find_by_id('id_confirm_password').fill(_admin_password) functional.submit(browser, form_class='form-update') @@ -311,7 +311,8 @@ def _rename_user(browser, old_name, new_name): def _set_email(browser, username, email): """Set the email field value for a user.""" - functional.visit(browser, '/plinth/sys/users/{}/edit/'.format(username)) + functional.visit(browser, + '/freedombox/sys/users/{}/edit/'.format(username)) browser.find_by_id('id_email').fill(email) browser.find_by_id('id_confirm_password').fill(_admin_password) functional.submit(browser, form_class='form-update') @@ -319,7 +320,8 @@ def _set_email(browser, username, email): def _get_email(browser, username): """Return the email field value for a user.""" - functional.visit(browser, '/plinth/sys/users/{}/edit/'.format(username)) + functional.visit(browser, + '/freedombox/sys/users/{}/edit/'.format(username)) return browser.find_by_id('id_email').value @@ -330,13 +332,13 @@ def _check_language(browser, language_code): def _get_ssh_keys(browser, username=None): - functional.visit(browser, '/plinth/') + functional.visit(browser, '/freedombox/') if username is None: browser.find_by_id('id_user_menu').click() functional.click_and_wait(browser, browser.find_by_id('id_user_edit_menu')) else: - functional.visit(browser, f'/plinth/sys/users/{username}/edit/') + functional.visit(browser, f'/freedombox/sys/users/{username}/edit/') return browser.find_by_id('id_ssh_keys').text @@ -346,7 +348,7 @@ def _set_ssh_keys(browser, ssh_keys, username=None): functional.click_and_wait(browser, browser.find_by_id('id_user_edit_menu')) else: - functional.visit(browser, f'/plinth/sys/users/{username}/edit/') + functional.visit(browser, f'/freedombox/sys/users/{username}/edit/') current_user = browser.find_by_id('id_user_menu_link').text auth_password = functional.get_password(current_user) @@ -358,7 +360,8 @@ def _set_ssh_keys(browser, ssh_keys, username=None): def _set_user_status(browser, username, status): - functional.visit(browser, '/plinth/sys/users/{}/edit/'.format(username)) + functional.visit(browser, + '/freedombox/sys/users/{}/edit/'.format(username)) if status == 'inactive': browser.find_by_id('id_is_active').uncheck() elif status == 'active': @@ -376,7 +379,8 @@ def _change_password(browser, new_password, current_password=None, browser, browser.find_by_id('id_change_password_menu')) else: functional.visit( - browser, '/plinth/sys/users/{}/change_password/'.format(username)) + browser, + '/freedombox/sys/users/{}/change_password/'.format(username)) current_user = browser.find_by_id('id_user_menu_link').text auth_password = current_password or functional.get_password(current_user) diff --git a/plinth/modules/wireguard/tests/test_functional.py b/plinth/modules/wireguard/tests/test_functional.py index bc2714440..b9ed811fa 100644 --- a/plinth/modules/wireguard/tests/test_functional.py +++ b/plinth/modules/wireguard/tests/test_functional.py @@ -44,7 +44,7 @@ class TestWireguardApp(functional.BaseAppTests): def _get_client_href(key): """Return the href for client show page.""" key = urllib.parse.quote(urllib.parse.quote(key, safe='')) - return f'/plinth/apps/wireguard/client/{key}/show/' + return f'/freedombox/apps/wireguard/client/{key}/show/' def _client_exists(self, browser, key): """Check whether a client key exists.""" diff --git a/plinth/settings.py b/plinth/settings.py index b15b2190c..436e5f277 100644 --- a/plinth/settings.py +++ b/plinth/settings.py @@ -114,7 +114,7 @@ FILE_UPLOAD_HANDLERS = [ ] # Overridden based on the configuration key server_dir -FORCE_SCRIPT_NAME = '/plinth' +FORCE_SCRIPT_NAME = '/freedombox' # FreedomBox apps are appended to this list INSTALLED_APPS = [ @@ -190,7 +190,7 @@ SESSION_ENGINE = 'django.contrib.sessions.backends.file' SESSION_FILE_PATH = '/var/lib/plinth/sessions' # Overridden based on configuration key server_dir -STATIC_URL = '/plinth/static/' +STATIC_URL = '/freedombox/static/' # STRONGHOLD_PUBLIC_URLS=(r'^captcha/', ) diff --git a/plinth/tests/data/configs/freedombox.config b/plinth/tests/data/configs/freedombox.config index 30cfb0aad..99bb30bd3 100644 --- a/plinth/tests/data/configs/freedombox.config +++ b/plinth/tests/data/configs/freedombox.config @@ -1,7 +1,7 @@ [Path] file_root = %(parent_dir)s data_dir = %(file_root)s/data/var/lib/plinth -server_dir = /plinth +server_dir = /freedombox doc_dir = %(file_root)s/doc custom_static_dir = %(file_root)s/data/var/www/plinth/custom/static store_file = %(data_dir)s/plinth.sqlite3 diff --git a/plinth/tests/data/shortcuts/dotd.json b/plinth/tests/data/shortcuts/dotd.json index 1a07b2293..1a5ee1392 100644 --- a/plinth/tests/data/shortcuts/dotd.json +++ b/plinth/tests/data/shortcuts/dotd.json @@ -1,7 +1,7 @@ {"shortcuts": [{ "name": "NextCloud", "description": [ "Nextcloud is a suite of client-server software for creating and using file hosting services." ], - "icon_url": "/plinth/custom/static/themes/default/icons/nextcloud.png", + "icon_url": "/freedombox/custom/static/themes/default/icons/nextcloud.png", "clients": [{ "name": "nextcloud", "platforms": [{ diff --git a/plinth/tests/data/shortcuts/dotd.json.d/01_extra.json b/plinth/tests/data/shortcuts/dotd.json.d/01_extra.json index 9fd03a0c7..34342e2dd 100644 --- a/plinth/tests/data/shortcuts/dotd.json.d/01_extra.json +++ b/plinth/tests/data/shortcuts/dotd.json.d/01_extra.json @@ -1,7 +1,7 @@ {"shortcuts": [{ "name": "NextCloud2", "description": [ "Nextcloud is a suite of client-server software for creating and using file hosting services." ], - "icon_url": "/plinth/custom/static/themes/default/icons/nextcloud.png", + "icon_url": "/freedombox/custom/static/themes/default/icons/nextcloud.png", "clients": [{ "name": "nextcloud", "platforms": [{ diff --git a/plinth/tests/data/shortcuts/nextcloud.json b/plinth/tests/data/shortcuts/nextcloud.json index 1258460e0..f14959f32 100644 --- a/plinth/tests/data/shortcuts/nextcloud.json +++ b/plinth/tests/data/shortcuts/nextcloud.json @@ -1,7 +1,7 @@ {"shortcuts": [{ "name": "NextCloud", "description": [ "Nextcloud is a suite of client-server software for creating and using file hosting services." ], - "icon_url": "/plinth/custom/static/themes/default/icons/nextcloud.png", + "icon_url": "/freedombox/custom/static/themes/default/icons/nextcloud.png", "clients": [{ "name": "nextcloud", "platforms": [{ diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index 2b89ed6e3..85300f5c2 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -48,7 +48,7 @@ base_url = config['DEFAULT']['url'] # unlisted sites just use '/' + site_name as url _site_url = { 'wiki': '/ikiwiki', - 'jsxc': '/plinth/apps/jsxc/jsxc/', + 'jsxc': '/freedombox/apps/jsxc/jsxc/', 'cockpit': '/_cockpit/', 'syncthing': '/syncthing/', 'rssbridge': '/rss-bridge/', @@ -377,7 +377,7 @@ def _run_first_wizard(browser): username = config['DEFAULT']['username'], password = config['DEFAULT']['password'] - welcome_url = base_url + '/plinth/firstboot/welcome/' + welcome_url = base_url + '/freedombox/firstboot/welcome/' browser.visit(welcome_url) if browser.url != welcome_url: # We got redirected because first wizard is already complete. Don't @@ -398,7 +398,7 @@ def login_with_account(browser, url, username, password=None): if password is None: password = get_password(username) # XXX: Find a way to remove the hardcoded jsxc URL - if '/plinth/' not in browser.url or '/jsxc/jsxc' in browser.url: + if '/freedombox/' not in browser.url or '/jsxc/jsxc' in browser.url: browser.visit(url) user_menu = browser.find_by_id('id_user_menu') @@ -409,7 +409,7 @@ def login_with_account(browser, url, username, password=None): logout(browser) - login_button = browser.links.find_by_href('/plinth/accounts/login/') + login_button = browser.links.find_by_href('/freedombox/accounts/login/') if login_button: click_and_wait(browser, login_button.first) browser.fill('username', username) @@ -423,7 +423,7 @@ def logout(browser): """Log out of the FreedomBox interface.""" # Navigate to the home page if logout form is not found if not browser.find_by_css('.form-logout'): - visit(browser, '/plinth/') + visit(browser, '/freedombox/') # We are not logged in if the home page does not contain logout form if browser.find_by_css('.form-logout'): @@ -436,13 +436,13 @@ def logout(browser): ################# def nav_to_module(browser, module): sys_or_apps = 'sys' if module in _sys_modules else 'apps' - required_url = base_url + f'/plinth/{sys_or_apps}/{module}/' + required_url = base_url + f'/freedombox/{sys_or_apps}/{module}/' if browser.url != required_url: browser.visit(required_url) def app_select_domain_name(browser, app_name, domain_name): - browser.visit('{}/plinth/apps/{}/setup/'.format(base_url, app_name)) + browser.visit('{}/freedombox/apps/{}/setup/'.format(base_url, app_name)) drop_down = browser.find_by_id('id_domain_name') drop_down.select(domain_name) submit(browser, form_class='form-configuration') @@ -603,7 +603,7 @@ def running_inside_container(): ############################# def set_hostname(browser, hostname: str): """Configure the system hostname.""" - visit(browser, '/plinth/sys/names/hostname/') + visit(browser, '/freedombox/sys/names/hostname/') browser.find_by_id('id_hostname-hostname').fill(hostname) submit(browser, form_class='form-hostname') @@ -613,8 +613,8 @@ def domain_add(browser, domain_name: str): if domain_name in domain_list(browser): return - visit(browser, '/plinth/sys/names/') - click_link_by_href(browser, '/plinth/sys/names/domains/') + visit(browser, '/freedombox/sys/names/') + click_link_by_href(browser, '/freedombox/sys/names/domains/') browser.find_by_id('id_domain-add-domain_name').fill(domain_name) submit(browser, form_class='form-domain-add') @@ -624,15 +624,15 @@ def domain_remove(browser, domain_name: str): if domain_name not in domain_list(browser): return - visit(browser, '/plinth/sys/names/') + visit(browser, '/freedombox/sys/names/') click_link_by_href(browser, - f'/plinth/sys/names/domains/{domain_name}/delete/') + f'/freedombox/sys/names/domains/{domain_name}/delete/') submit(browser, form_class='form-delete') def domain_list(browser) -> list[str]: """Return a list of domains configured.""" - visit(browser, '/plinth/sys/names/') + visit(browser, '/freedombox/sys/names/') elements = browser.find_by_css('td.names-domain-column') return [element.text for element in elements] @@ -659,12 +659,12 @@ def _click_button_and_confirm(browser, href, form_class): if buttons: submit(browser, element=buttons.first) submit(browser, form_class=form_class, - expected_url='/plinth/sys/backups/') + expected_url='/freedombox/sys/backups/') def _backup_delete_archive_by_name(browser, archive_name): nav_to_module(browser, 'backups') - href = f'/plinth/sys/backups/root/delete/{archive_name}/' + href = f'/freedombox/sys/backups/root/delete/{archive_name}/' _click_button_and_confirm(browser, href, 'form-delete') @@ -674,7 +674,7 @@ def backup_create(browser, app_name, archive_name=None): if archive_name: _backup_delete_archive_by_name(browser, archive_name) - buttons = browser.links.find_by_href('/plinth/sys/backups/create/') + buttons = browser.links.find_by_href('/freedombox/sys/backups/create/') submit(browser, element=buttons.first) eventually(browser.find_by_css, args=['.select-all']) browser.find_by_css('.select-all').first.uncheck() @@ -690,7 +690,7 @@ def backup_create(browser, app_name, archive_name=None): def backup_restore(browser, app_name, archive_name=None): """Restore a given app from a backup archive.""" nav_to_module(browser, 'backups') - href = f'/plinth/sys/backups/root/restore-archive/{archive_name}/' + href = f'/freedombox/sys/backups/root/restore-archive/{archive_name}/' _click_button_and_confirm(browser, href, 'form-restore') @@ -708,7 +708,7 @@ def networks_set_firewall_zone(browser, zone): 'and contains(@class, "connection-status-label")]/following::a').first network_id = device['href'].split('/')[-3] device.click() - edit_url = '/plinth/sys/networks/{}/edit/'.format(network_id) + edit_url = '/freedombox/sys/networks/{}/edit/'.format(network_id) click_link_by_href(browser, edit_url) browser.select('zone', zone) submit(browser, form_class='form-connection-edit') @@ -742,7 +742,7 @@ def create_user(browser, name, password=None, groups=[], email=None): if password is None: password = get_password(name) - click_link_by_href(browser, '/plinth/sys/users/create/') + click_link_by_href(browser, '/freedombox/sys/users/create/') browser.find_by_id('id_username').fill(name) browser.find_by_id('id_password1').fill(password) @@ -763,7 +763,7 @@ def create_user(browser, name, password=None, groups=[], email=None): def delete_user(browser, name): """Delete a user.""" nav_to_module(browser, 'users') - click_link_by_href(browser, f'/plinth/sys/users/{name}/edit/') + click_link_by_href(browser, f'/freedombox/sys/users/{name}/edit/') browser.find_by_id('id_delete').check() browser.find_by_id('id_confirm_password').fill( @@ -775,13 +775,14 @@ def delete_user(browser, name): '#user-delete-confirm-dialog button.confirm').first eventually(lambda: confirm_button.visible) assert confirm_button.visible - click_and_wait(browser, confirm_button, expected_url='/plinth/sys/users/') + click_and_wait(browser, confirm_button, + expected_url='/freedombox/sys/users/') def user_exists(browser, name): """Check if a user with a given name exists.""" nav_to_module(browser, 'users') - links = browser.links.find_by_href(f'/plinth/sys/users/{name}/edit/') + links = browser.links.find_by_href(f'/freedombox/sys/users/{name}/edit/') return len(links) == 1 @@ -789,7 +790,7 @@ def user_set_language(browser, language_code): """Change user's preferred UI language.""" username = config['DEFAULT']['username'] admin_password = config['DEFAULT']['password'] - visit(browser, '/plinth/sys/users/{}/edit/'.format(username)) + visit(browser, '/freedombox/sys/users/{}/edit/'.format(username)) browser.find_by_xpath('//select[@id="id_language"]//option[@value="' + language_code + '"]').first.click() browser.find_by_id('id_confirm_password').fill(admin_password) diff --git a/plinth/tests/tags/test_functional.py b/plinth/tests/tags/test_functional.py index 806413457..66cda787b 100644 --- a/plinth/tests/tags/test_functional.py +++ b/plinth/tests/tags/test_functional.py @@ -13,14 +13,14 @@ pytestmark = [pytest.mark.tags] def _is_app_listed(session_browser, app): """Assert that the specified app is listed on the page.""" - app_links = session_browser.links.find_by_href(f'/plinth/apps/{app}/') + app_links = session_browser.links.find_by_href(f'/freedombox/apps/{app}/') assert len(app_links) == 1 @pytest.fixture(name='bittorrent_tag') def fixture_bittorrent_tag(session_browser): """Click on the BitTorrent tag.""" - bittorrent_tag = '/plinth/apps/?tag=BitTorrent' + bittorrent_tag = '/freedombox/apps/?tag=BitTorrent' functional.login(session_browser) functional.nav_to_module(session_browser, 'transmission') with functional.wait_for_page_update(session_browser, timeout=10, @@ -50,7 +50,7 @@ def test_search_for_tag(session_browser, bittorrent_tag): search_input = session_browser.find_by_id('add-tag-input').first with functional.wait_for_page_update( session_browser, timeout=10, - expected_url='/plinth/apps/?tag=BitTorrent&tag=File+sharing'): + expected_url='/freedombox/apps/?tag=BitTorrent&tag=File+sharing'): search_input.click() search_input.type('file sharing') search_input.type(Keys.ENTER) @@ -64,7 +64,7 @@ def test_click_on_tag(session_browser, bittorrent_tag): search_input = session_browser.find_by_id('add-tag-input').first with functional.wait_for_page_update( session_browser, timeout=10, - expected_url='/plinth/apps/?tag=BitTorrent&tag=File+sync'): + expected_url='/freedombox/apps/?tag=BitTorrent&tag=File+sync'): search_input.click() session_browser.find_by_css( ".dropdown-item[data-tag='File sync']").click() @@ -75,14 +75,14 @@ def test_click_on_tag(session_browser, bittorrent_tag): def test_tag_localization(session_browser, locale): """Test that tags are localized and tests in done localized.""" - functional.visit(session_browser, '/plinth/apps/?tag=Sharing') + functional.visit(session_browser, '/freedombox/apps/?tag=Sharing') badge = session_browser.find_by_css('.tag[data-tag="Sharing"]').first assert 'Compartir' in badge.text search_input = session_browser.find_by_id('add-tag-input').first with functional.wait_for_page_update( session_browser, timeout=10, - expected_url='/plinth/apps/?tag=Sharing&tag=Bookmarks'): + expected_url='/freedombox/apps/?tag=Sharing&tag=Bookmarks'): search_input.click() search_input.type('Marcadores') search_input.type(Keys.ENTER) diff --git a/plinth/tests/test_middleware.py b/plinth/tests/test_middleware.py index 1c57b74f5..47d46ab24 100644 --- a/plinth/tests/test_middleware.py +++ b/plinth/tests/test_middleware.py @@ -63,7 +63,7 @@ class TestSetupMiddleware: @patch('django.urls.reverse', return_value='users:login') def test_404_urls(reverse, middleware, kwargs): """Test how middleware deals with 404 URLs.""" - request = RequestFactory().get('/plinth/non-existing-url') + request = RequestFactory().get('/freedombox/non-existing-url') response = middleware.process_view(request, **kwargs) assert response is None @@ -71,7 +71,7 @@ class TestSetupMiddleware: @patch('django.urls.reverse', return_value='users:login') def test_url_not_an_application(reverse, middleware, kwargs): """Test that none is returned for URLs that are not applications.""" - request = RequestFactory().get('/plinth/') + request = RequestFactory().get('/freedombox/') response = middleware.process_view(request, **kwargs) assert response is None @@ -83,7 +83,7 @@ class TestSetupMiddleware: resolve.return_value.namespaces = ['mockapp'] app.get_setup_state = lambda: app_module.App.SetupState.UP_TO_DATE - request = RequestFactory().get('/plinth/mockapp') + request = RequestFactory().get('/freedombox/mockapp') request.user = AnonymousUser() response = middleware.process_view(request, **kwargs) assert response is None @@ -99,7 +99,7 @@ class TestSetupMiddleware: resolve.return_value.namespaces = ['mockapp'] view = Mock() setup_view.as_view.return_value = view - request = RequestFactory().get('/plinth/mockapp') + request = RequestFactory().get('/freedombox/mockapp') request.session = MagicMock() # Verify that anonymous users cannot access the setup page @@ -152,7 +152,7 @@ class TestSetupMiddleware: app.get_setup_state = lambda: app_module.App.SetupState.UP_TO_DATE # Admin user can collect result - request = RequestFactory().get('/plinth/mockapp') + request = RequestFactory().get('/freedombox/mockapp') request.resolver_match = Mock() user = User(username='adminuser') user.save() @@ -175,7 +175,7 @@ class TestSetupMiddleware: messages_success.reset_mock() messages_error.reset_mock() operation_manager.collect_results.reset_mock() - request = RequestFactory().get('/plinth/mockapp') + request = RequestFactory().get('/freedombox/mockapp') user = User(username='johndoe') user.save() request.user = user @@ -201,7 +201,7 @@ class TestAdminMiddleware: @pytest.fixture(name='web_request') def fixture_web_request(): """Fixture for returning kwargs.""" - web_request = RequestFactory().get('/plinth/mockapp') + web_request = RequestFactory().get('/freedombox/mockapp') web_request.user = Mock() return web_request diff --git a/plinth/tests/test_notification.py b/plinth/tests/test_notification.py index 5e1c3f6d7..c8f9abbb1 100644 --- a/plinth/tests/test_notification.py +++ b/plinth/tests/test_notification.py @@ -337,7 +337,7 @@ def test_list_filter_user_and_group(note, user): @patch('plinth.notification.gettext') def test_display_context(gettext, note, user, rf): """Test display context for a notification.""" - request = rf.get('/plinth/help/about/') + request = rf.get('/freedombox/help/about/') data = { 'test-key1': 'test-value1', @@ -396,7 +396,7 @@ def test_display_context(gettext, note, user, rf): def test_display_context_body_template(note, user, load_cfg, rf): """Test display context for a notification with body template.""" - request = rf.get('/plinth/help/about/') + request = rf.get('/freedombox/help/about/') note.body_template = 'invalid-template.html' note.save() @@ -412,7 +412,7 @@ def test_display_context_body_template(note, user, load_cfg, rf): context = Notification.get_display_context(request, user) context_note = context['notifications'][0] assert context_note['body'].content == \ - b'Test notification body /plinth/help/about/\n' + b'Test notification body /freedombox/help/about/\n' @pytest.mark.django_db diff --git a/plinth/tests/test_utils.py b/plinth/tests/test_utils.py index ac87f1624..8f0a612db 100644 --- a/plinth/tests/test_utils.py +++ b/plinth/tests/test_utils.py @@ -36,7 +36,7 @@ class TestIsAdminUser: @pytest.fixture(name='web_request') def fixture_web_request(): """Setup each test case before execution.""" - web_request = RequestFactory().get('/plinth/mockapp') + web_request = RequestFactory().get('/freedombox/mockapp') web_request.user = Mock() web_request.session = MagicMock() return web_request diff --git a/plinth/tests/test_views.py b/plinth/tests/test_views.py index 618a35e5a..87dcfc8b9 100644 --- a/plinth/tests/test_views.py +++ b/plinth/tests/test_views.py @@ -57,7 +57,7 @@ def test_get_breadcrumbs(rf, test_menu): @pytest.mark.parametrize('url', [ - '/plinth/login/', + '/freedombox/login/', '/', 'safe', ]) @@ -71,11 +71,11 @@ def test_is_safe_url_valid_url(url): [ '', None, - '\\plinth', - '///plinth', - 'https://example.com/plinth/login/', + '\\freedombox', + '///freedombox', + 'https://example.com/freedombox/login/', 'https:///example.com', - 'https:///plinth/login', + 'https:///freedombox/login', 'ftp://example.com', 'https://[aabb::ccdd', # Invalid IPv6 ]) diff --git a/plinth/tests/test_web_server.py b/plinth/tests/test_web_server.py index e6e5d5237..7cb7fcbde 100644 --- a/plinth/tests/test_web_server.py +++ b/plinth/tests/test_web_server.py @@ -44,7 +44,7 @@ def test_static_files_mount(mount, load_cfg): calls = [ call( - None, '/plinth/a', { + None, '/freedombox/a', { '/': { 'tools.staticdir.root': '/b', 'tools.staticdir.on': True, @@ -52,7 +52,7 @@ def test_static_files_mount(mount, load_cfg): } }), call( - None, '/plinth/c', { + None, '/freedombox/c', { '/': { 'tools.staticdir.root': '/d', 'tools.staticdir.on': True, diff --git a/plinth/web_server.py b/plinth/web_server.py index d22f11f51..70ebe617a 100644 --- a/plinth/web_server.py +++ b/plinth/web_server.py @@ -162,8 +162,8 @@ class StaticFiles(app_module.FollowerComponent): static files from the directory are served over the given web path. The web path will be prepended with the FreedomBox's configured base web path. For example, {'/foo': '/usr/share/foo'} means that - '/usr/share/foo/bar.png' will be served over '/plinth/foo/bar.png' if - FreedomBox is configured to be served on '/plinth'. + '/usr/share/foo/bar.png' will be served over '/freedombox/foo/bar.png' + if FreedomBox is configured to be served on '/freedombox'. """ super().__init__(component_id) diff --git a/static/jslicense.html b/static/jslicense.html index 00ffac34e..0fcf1aa76 100644 --- a/static/jslicense.html +++ b/static/jslicense.html @@ -26,7 +26,7 @@ twitter-bootstap3 - jsxc-plinth.js + jsxc-plinth.js GNU Affero General Public License, version 3 or later diff --git a/static/themes/default/js/main.js b/static/themes/default/js/main.js index 31d4bd1c9..94aa8862a 100644 --- a/static/themes/default/js/main.js +++ b/static/themes/default/js/main.js @@ -227,7 +227,7 @@ document.addEventListener('DOMContentLoaded', async () => { try { setInstallButtonState(false); - const response = await fetch(`/plinth/is-available/${appId}/`, { + const response = await fetch(`/freedombox/is-available/${appId}/`, { timeout: 2 * 60 * 1000 // 2 minutes });