Compare commits

...

286 Commits
v25.14 ... main

Author SHA1 Message Date
Sunil Mohan Adapa
31925252cb
tests: functional: Drop undefined 'sso' pytest mark
Remove the following warnings when running functional tests.

plinth/modules/calibre/tests/test_functional.py:13: PytestUnknownMarkWarning: Unknown pytest.mark.sso - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    pytestmark = [pytest.mark.apps, pytest.mark.sso, pytest.mark.calibre]

plinth/modules/kiwix/tests/test_functional.py:15: PytestUnknownMarkWarning: Unknown pytest.mark.sso - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    pytestmark = [pytest.mark.apps, pytest.mark.sso, pytest.mark.kiwix]

plinth/modules/searx/tests/test_functional.py:9: PytestUnknownMarkWarning: Unknown pytest.mark.sso - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    pytestmark = [pytest.mark.apps, pytest.mark.searx, pytest.mark.sso]

plinth/modules/syncthing/tests/test_functional.py:11: PytestUnknownMarkWarning: Unknown pytest.mark.sso - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    pytestmark = [pytest.mark.apps, pytest.mark.syncthing, pytest.mark.sso]

plinth/modules/transmission/tests/test_functional.py:13: PytestUnknownMarkWarning: Unknown pytest.mark.sso - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    pytestmark = [pytest.mark.apps, pytest.mark.transmission, pytest.mark.sso]

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-17 12:11:55 -07:00
Sunil Mohan Adapa
009e07b232
letsencrypt: Don't perform operations on apps that are not installed
Fixes: #2568.

When Let's Encrypts events are fired for all applications, they happen on apps
that install as well. They have not been a problem so far because seem to
succeed always. However, ejabberd recently changed to having '*' for list of
domains accepted and also has non-root account for certificate ownership. This
combination causes a certificate operation to fail as the package 'ejabberd' is
not installed and 'ejabberd' user is not available. Fix this by making limiting
certificate operations to apps that have been installed.

Tests:

- Add a new domain name to a production FreedomBox using the Dynamic DNS
'tester' account. 'ejabberd' app should not be installed. LE events fire and a
log message showing failure is noticed. All the events after the failure for
other apps also succeed. The failure is a minor and contained to ejabberd.

- Apply the patch and revoke the certificate. LE event is fired on all other
installed apps but not on ejabberd. No error is logged.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-16 20:30:58 -04:00
Sunil Mohan Adapa
b4c6748837
apache: Minor improvement to getting the request host
- Django's request.get_host() use X_FORWARDED_HOST when appropriate and falls
back to HTTP_HOST. In case of FreedomBox due to 'ProxyPreserveHost On' in Apache
configuration, both the values are the same. So, it makes no difference.

- Also document the need for 'ProxyPreserveHost On' in another validation.

Tests:

- Log the value of request_host, request.META['HTTP_HOST'], and
request.META['X_FORWARDED_HOST'] in DiscoverIDPView:get(). All the values are
same when accessing with IP address value not starting with 127.0.0.1.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-16 19:44:10 -04:00
OwlGale
b765e9b9c6
Translated using Weblate (Russian)
Currently translated at 98.5% (1882 of 1910 strings)
2026-03-15 19:09:48 +01:00
Frederico Gomes
6ce258152f
wireguard: Fix freedombox VPN IP for services
Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-13 17:21:28 -07:00
Daniel Wiik
4e928fe58e
Translated using Weblate (Swedish)
Currently translated at 100.0% (1910 of 1910 strings)
2026-03-11 22:09:50 +00:00
Sunil Mohan Adapa
0e773e7ad0
clients: Fix show empty clients in Desktop section
When a client has a package but no desktop package, an empty client entry
appears in the Desktop section.

Tests:

- For MiniDLNA, in the Desktop section, there is not empty entry for totem
anymore.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-09 15:26:17 -07:00
Frederico Gomes
f99f3bd382
clients: Fix formatting of package row in table
Adjust row so that package entries are evenly distributed

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
[sunil: Fix indentation]
[sunil: Convert tabs to spaces]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-09 15:25:23 -07:00
Frederico Gomes
15b7a34072
wireguard: Add entries for Homebrew and RPM packages
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-09 15:25:20 -07:00
Frederico Gomes
0ba4cbe259
wireguard: Add button for direct APK download
**clients.py**
- allow download type for mobile os

**manifest.py**
- add entry for apk download

**plinth/templates/clients.html**
- add logic to show button for apk download

**themes > icons**
- add icon for android

source: https://www.wireguard.com/install/

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
[sunil: Minor indentation]
[sunil: Refactor logic to eliminate packages from Desktop clients list]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-09 15:25:17 -07:00
Frederico Gomes
176bb97c88
wireguard: Update windows client link
Update download link to .exe provided by WireGuard.
A utility that downloads, verifies and executes provided MSIs.

source: https://www.wireguard.com/install/

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-09 15:16:39 -07:00
Frederico Gomes
bd6780b81d
wireguard: Remove client entry for F-Droid which is not available
Link to the F-Droid WireGuard package returns 404 Not Found.
WireGuard seems to no longer be packaged by F-Droid.

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-09 15:15:55 -07:00
OwlGale
831a18847e
Translated using Weblate (Russian)
Currently translated at 98.1% (1875 of 1910 strings)
2026-03-09 19:09:48 +00:00
James Valleroy
4db977ff4e
Release v26.4.2 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-08 15:28:08 -04:00
James Valleroy
448d5d84ed
Merge remote-tracking branch 'freedombox-team/main' 2026-03-08 15:26:43 -04:00
James Valleroy
41640f5d3c
Release v26.4.1 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-08 15:10:35 -04:00
James Valleroy
5381990e02
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-08 15:09:08 -04:00
OwlGale
5a2e8ddc16
Translated using Weblate (Russian)
Currently translated at 97.9% (1870 of 1910 strings)
2026-03-08 19:48:32 +01:00
Jiří Podhorecký
4d6ddcdcdb
Translated using Weblate (Czech)
Currently translated at 100.0% (1910 of 1910 strings)
2026-03-08 19:48:32 +01:00
Sunil Mohan Adapa
97a2d68ac6
apache2: Disable pubtkt authentication module
- Since FreedomBox does not depend on the package anymore, unattended-upgrades
will remove the package. This causes Apache2 to fail to start. Disable the
module from Apache2 configuration.

Tests:

- Remove the libapache2-mod-auth-pubtkt package. Re-run apache app setup by
incrementing it version number. Apache will fail to start. Apply the patch and
increment the version number. auth_pubtkt module will be disabled and Apache is
automatically running again.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-08 14:41:14 -04:00
Sunil Mohan Adapa
6128d3be16
d/control: Trim deps for nocheck build profile (Closes: #1129521)
Closes: #1129521

Tests:

- Build package successfully with the following command: gbp buildpackage
--git-debian-branch=debian-nocheck-build-profile --git-pbuilder
--git-pbuilder-options="--profiles=nocheck

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-08 09:14:09 -04:00
James Valleroy
bce25f465f
Vagrantfile: Enable public network for bridged networking
When testing OpenID Connect, I found that it wasn't working in a VM
with NAT port forwarding. However, vagrant can use bridged networking
instead. When the vagrant box is brought up, the user will be prompted
for which network interface to bridge.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-07 13:12:36 -08:00
James Valleroy
71913580db
container: Hold freedombox packages during test setup
Fixes: #2567

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-07 13:10:19 -08:00
Jiří Podhorecký
eb709f8687
Translated using Weblate (Czech)
Currently translated at 99.7% (1906 of 1910 strings)
2026-03-06 22:09:48 +01:00
Burak Yavuz
cfc5d3acab
Translated using Weblate (Turkish)
Currently translated at 100.0% (1910 of 1910 strings)
2026-03-04 06:09:53 +01:00
Besnik Bleta
212d865b43
Translated using Weblate (Albanian)
Currently translated at 99.5% (1902 of 1910 strings)
2026-03-04 06:09:51 +01:00
大王叫我来巡山
9a55902f37
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 61.0% (1167 of 1910 strings)
2026-03-04 06:09:48 +01:00
James Valleroy
07845bc960
apache: Fix check_url test
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 21:49:41 -05:00
James Valleroy
abbc4e7557
Release v26.4 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 21:36:08 -05:00
James Valleroy
af70c73f24
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 21:35:03 -05:00
James Valleroy
5ccb332ce6
locale: Update translation strings
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 21:01:26 -05:00
Sunil Mohan Adapa
e2047ec3a0
apache: Fix diagnosing URLs protected by OpenID Connect
Tests:

- Clear out the directory /var/cache/apache2/mod_auth_openidc/metadata/. Then
run diagnostics on Calibre app without the patch. Several URLs fail because 404
has been returned on <domain>/calibre URL. With the patch the diagnostics
succeed.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:46 -05:00
Sunil Mohan Adapa
a7584b465d
sso: Merge into users module, drop pubtkt related code
Tests:

- 'make install' removes enabled sso module

- Already logged in users stay logged in after update

- Apps need to re-authenticate of update (but this is transparent)

- Login and logout work as expected

- Failed login attempts lead to CAPTCHA form

- CAPTCHA form can't be skipped

- Answering CAPTCHA form will lead back to login page

- Users functional tests work

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:41 -05:00
Sunil Mohan Adapa
6fd85e3e46
sharing: Use OpenID Connect instead of pubtkt based SSO
- Migrate old configuration file to new format.

Tests:

- Admin user is able to access a share.

- User belonging to a group allowed to access the share is able to access the
application.

- Regular user is not able to access the application.

- Anonymous user is not able to access the application.

- Setup is run after applying patches.

- Old shares are migrated from old style auth from authpubtkt to oidc. Name,
path, is_public, groups are presevered

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:39 -05:00
Sunil Mohan Adapa
31e7997d2b
doc/dev: Use OpenID Connect instead of pubtkt based SSO
Tests:

- The built documentation has been updated as expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:36 -05:00
Sunil Mohan Adapa
68126c3ec6
transmission: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Functional tests work.

- Admin user is able to access the application

- User belonging to special group is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:34 -05:00
Sunil Mohan Adapa
29ef56b51e
wordpress: Use OpenID Connect instead of pubtkt based SSO when private
Tests:

- Functional tests work.

- Admin user is able to access the application

- User belonging to special group is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:32 -05:00
Sunil Mohan Adapa
efe2bccb11
tiddlywiki: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Functional tests work.

- Admin user is able to access the application

- User belonging to special group is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:29 -05:00
Sunil Mohan Adapa
64272a2bef
gitweb: Use OpenID Connect instead of pubtkt based SSO
- Regression: Users who to don't have git-access permission can't access the
public repositories.

Tests:

- Functional tests work.

- Admin user is able to view and access the repos when there are some public
repos and when there no public repos.

- User belonging to git-access are regular usrs are unable to access private
repos. But they are also not able to access the public repos. They have to
logout to be able to do that.

- Anonymous user is not able to access the application if all repos are private.
If there is at least one public repo, the repo listing can be accessed and
public repos can be seen and accessed.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:27 -05:00
Sunil Mohan Adapa
af892adb5e
deluge: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Functional tests work.

- Admin user is able to access the application

- User belonging to special group is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:25 -05:00
Sunil Mohan Adapa
4ab2007c99
calibre: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Functional tests work.

- Admin user is able to access the application

- User belonging to special group is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:22 -05:00
Sunil Mohan Adapa
3c1d801e15
email: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Functional tests work.

- Admin user is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:20 -05:00
Sunil Mohan Adapa
e2da29cf25
rssbridge: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Functional tests work.

- Admin user is able to access the application

- User belonging to special group is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:18 -05:00
Sunil Mohan Adapa
ce62fdb142
searx: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Application is not installable in stable and testing. It is not functional in
unstable.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:15 -05:00
Sunil Mohan Adapa
cad6bc8ca0
syncthing: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Functional tests work.

- Admin user is able to access the application

- User belonging to special group is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:13 -05:00
Sunil Mohan Adapa
483f28de83
featherwiki: Use OpenID Connect instead of pubtkt based SSO
Tests:

- Functional tests work.

- Admin user is able to access the application

- User belonging to special group is able to access the application

- Regular user is not able to access the application

- Anonymous user is not able to access the application

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:10 -05:00
Sunil Mohan Adapa
64f1a1c918
apache: Implement protecting apps using OpenID Connect
- Use the excellent Apache module auth_openidc.

- Implement macros that can be easily used to configure OpenID Connect.

Tests:

- Accessing /freedombox/apache/discover-idp/ shows

  - 'method' other than 'get' throw a 'bad request' error

  - oidc_callback should match host. Otherwise 'bad request' error is raised.

  - Mismatched host header is not allowed

  - Invalid domain setup is not allowed

  - target_link_uri is returned as is

  - method is returned as is and only 'get' is allowed.

  - x_csrf is returned as is

  - oidc_scopes is returned as 'email freedombox_groups'

  - HTTP request is answered and not redirected to https

- When logging in with OIDC, authorization is skipped. When authorization is
shown, it is shown as 'Web app protected by FreedomBox'.

- libapache2-mod-auth-openidc is added a dependency for freedombox package. It
is installable in stable, testing, and unstable distributions.

- On applying patches, Apache setup configuration is run and OpenIDC component
is created.

- When patches are applied and setup install is run, auth_openidc module,
10-freedombox, freedombox-openidc config is enabled in Apache.

- When setup is rerun, passphrase is not changed

- metadata directory and parent are created when apache setup is run. Mode is
0o700 and ownership is www-data.

- freedombox-openidc is created when apache setup is run and has 0o700
permissions.

- Metadata directory will contain the client id and client passphrase when
discovery happens for a particular domain.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:06 -05:00
Sunil Mohan Adapa
cdfbff0b6b
oidc: Style the page for authorizing an OIDC app
Tests:

- Appearance is acceptable: top margin, width of the readable text, heading
centering, list top/bottom margins, SVG icon for application, md mode icon size,
submit button width, margins.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:51:00 -05:00
Sunil Mohan Adapa
45076cc603
oidc: New app to implement OpenID Connect Provider
- Add a component to easily manage registration of client applications.

Tests:

- Package build is successful has dependency on python3-django-auto-toolkit

- python3-django-oauth-toolkit can be installed on stable, testing and unstable
containers

- /.well-known/openid-configuration and /.well-known/jwks.json are servered
properly.

- /o/ URLs don't require login to access

- When logging in list of claims includes 'sub', email, freedombox_groups.

- Logging in using IP address works. Also works with a port.

- Logging in using 127.0.0.1 address works. Also works with a port.

- Logging in using localhost works. Also works with a port.

- Logging in with IPv6 address works. Also works with a port.

- Logging in with IPv6 [::1] address works. Also works with a port.

- Logging in with IPv6 link-local address with zone ID is not possible (as
browsers don't support them).

- When authorization page is enabled, scopes show description as expected.

- When domain name is added/removed, all OIDC components are updated with
expected domains

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:46 -05:00
Sunil Mohan Adapa
f0b1aa34ac
apache: Preserve host header when proxying to service
- This allows us to perform some checks before redirecting for OpenID Connect.

Tests:

- Functional tests of many apps pass with the patch.

- OIDC related changes introduced later work due to this change.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:43 -05:00
Sunil Mohan Adapa
bced133d90
templates: Allow building pages without navigation bar and footer
Tests:

- Functional tests of many apps pass with the patch.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:41 -05:00
Sunil Mohan Adapa
a8e2d4cd69
web_framework: Allow FreedomBox apps to override templates
Tests:

- Functional tests of many apps pass with this change.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:38 -05:00
Sunil Mohan Adapa
bbbe2cf950
tests: functional: Fix expecting FreedomBox to be home page
In some cases, we are visiting / and expecting to reach the home page of
FreedomBox UI. When due to failed tests in config app, the home page is set to
something other than FreedomBox UI, these tests fail. Fix this by visiting
/freedombox explicitly instead.

Tests:

- When hope page is set to Syncthing, kiwix functional tests pass.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:36 -05:00
Sunil Mohan Adapa
168f662a17
*: 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 <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:30 -05:00
Sunil Mohan Adapa
0d579012d7
web_server: Log requests to WSGI app
- This is quite useful for debugging even on production machines.

- CherryPy can't be used for logging as grafting a WSGI application bypasses the
usual mechanisms of logging.

- Keep requests for static files turned off in CherryPy as these are not very
useful.

Tests:

- Making a request print an INFO message on the log with method and path after
the /freedombox part. Logs can be seen in systemd journal.

- Requests for static files are not logged.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:28 -05:00
Sunil Mohan Adapa
854916c54c
syncthing: tests: Fix tests by allowing rapid restarts
Tests:

- Functional tests for syncthing pass.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:25 -05:00
Sunil Mohan Adapa
fde0a620f9
debian: Ensure that gbp creates a clean tarball prior to build
- Without the --git-export-dir option, gbp builds from the current directory
which contains .container and many other large files. All of these files will
get included into the tarball by default when 'gbp buildpackage' is executed in
an unclean folder.

- With the --git-export-dir option set, 'git export' is first executed to a
temporary directory and this git operation respects patterns in .gitignore. Thus
only expected files end up in the freedombox package source tarball.

Tests:

- When the source directory contains files in ./container, running 'gbp
buildpackage' results in freedombox*.tar.xz containing the disk images of the
containers.  With this change, the tarball is clean and none of the files in
.gitignore endup in the tarball.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:23 -05:00
Sunil Mohan Adapa
185559b43f
action_utils: Drop support for link-local IPv6 addresses
Tests:

- Diagnostics page for Calibre app does not show a test for link-local IPv6
address anymore.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:20 -05:00
Sunil Mohan Adapa
82d7cd0e8f
pyproject: Use new format to specify licenses
See:
https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license

This eliminates the following warning messages when building the package:

********************************************************************************
Please use a simple string containing a SPDX expression for `project.license`.
You can also use `project.license-files`. (Both options available on
setuptools>=77.0.0).

By 2026-Feb-18, you need to update your project and remove deprecated calls
or your builds will no longer be supported.

See
https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license
for details.
********************************************************************************

Tests:

- Debian package can be built successfully. Two fewer warning during python
package build step were noticed.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:17 -05:00
Sunil Mohan Adapa
0eca1394c0
Vagrantfile: Drop unnecessary sudo configuration for actions
- Actions have been completed removed due to implementation of privileged
daemon.

Tests:

- None

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:14 -05:00
Sunil Mohan Adapa
4371e2475d
cfg: Drop unused actions_dir option
Tests:

- Unit tests pass

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:11 -05:00
Sunil Mohan Adapa
a7ec37dbce
cfg: Drop unused config_dir option
Tests:

- Unit tests pass.

- When file /usr/share/freedombox/freedombox.conf is created, we can see log
message 'Configuration loaded from file - /usr/share/freedombox/freedombox.conf'

- When running in develop mode, we can see log message 'Configuration loaded
from file - /freedombox/plinth/develop.conf'

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:08 -05:00
Sunil Mohan Adapa
778c35f2bc
matrixsynapse: Update apache config to proxy Synapse client API
- Use the recommended configuration from Matrix Synapse documentation.

  - Preserve Host: header.

  - Set the X-Forwarded-Proto header.

  - Don't decode encoded slashes in the URLs during proxying.

- Also proxy Synapse client API.

Tests:

- Web app at app.element.io is able to connect to a local server using browser.
Two client can chat with each other.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:04 -05:00
Sunil Mohan Adapa
bf83cb5a5b
*: Remove some absolute file paths in SVGs
- They are not useful.

Tests:

- All the modified SVG files load and show as expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:50:01 -05:00
Sunil Mohan Adapa
284a384d3a
README/HACKING: Update weblate project path to /freedombox
Tests:

- The news links work.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 20:49:56 -05:00
Frederico Gomes
af6d1d9a4c
miniflux: Get credentials from dbconfig-common directly
Fixes: #2562

Newer miniflux package does not create a separate file called
/etc/miniflux/database. Instead it write the database URL directly into
/etc/miniflux/miniflux.conf. It is easier to create the database settings from
dbconfig-common that to read them from miniflux.conf.

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-02 12:56:24 -08:00
Frederico Gomes
9a524b331b
db: Create a utility to get credentials from dbconfig
Create helper function that uses Augeas Shellvars to parse dbconfig-common
files.

Signed-off-by: Frederico Gomes fredericojfgomes@gmail.com
[sunil: Fix quotes not getting removed from values]
[sunil: Add test case]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-02 12:55:54 -08:00
Frederico Gomes
72005d6205
miniflux: Revert workaround for a packaging bug with DB connection
This reverts commit 9af9a504e09b8021041a7d8fe4540574f42edc1c.

This workaround is no longer needed as the file is no longer used.
Reverted as per:
https://salsa.debian.org/freedombox-team/freedombox/-/merge_requests/2752#note_728315

**plinth/modules/miniflux/__init__.py**

- Keep version bump

**plinth/modules/miniflux/privileged.py**

- Keep docstring fix

Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-02 12:54:39 -08:00
Sunil Mohan Adapa
4b24fda3f5
wireguard: Accept/use netmask with IP address for server connection
- Currently, the value is hard-coded as /24. Instead take this as input and use
that value.

Tests:

- Entering invalid IPv4 address results in 'Enter a valid IPv4 address' error
message during form submission.

- Entering invalid prefix such as /33 results in 'Enter a valid network prefix
or net mask.' error during form submission.

- Both /32 and /255.255.255.255 formats are accepted.

- The description text for the form field 'IP address' is as expected.

- Changing the value of default route and IP address + netmask reflects in the
status page. Correct values is shown in the edit server and server status page.

- Not providing a netmask results in /32 being assigned.

- Unit and functional tests for wireguard pass. There are some intermittent
failures with functional tests that are unrelated to the patch.

- Setting the /32 prefix results in correct routing table as shown by 'ip route
show table all'. No default routes are network routes are present. 'traceroute
1.1.1.1' shows route taken via regular network.

- Setting the /24 prefix results in correct routing table. No default routes are
present. However, for the /24 network a route is present with device wg1.
'traceroute 1.1.1.1' shows route taken via regular network.

- Enabling the default route results in correct routing table. Default route is
shown for device wg1 with high priority. 'traceroute 1.1.1.1' shows route taken
via WireGuard network.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 15:22:36 -05:00
Sunil Mohan Adapa
ad9ebe2301
wireguard: Show status of default route in server information page
Tests:

- Create a server connection with default route setting 'on'. See that the
server status page reflects the value correctly. Repeat for 'off'.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 15:22:33 -05:00
Sunil Mohan Adapa
7e7e7a6ccf
wireguard: Fix showing default route setting in server edit form
- The default route is not decided by the subnet on the IP address assigned. It
is to be decided using the list of allowed peers in the wireguard settings.

Tests:

- Set the default route setting to 'on' while creating the connection. In the
edit server page, the value is shown correctly. Repeat with 'off' value.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 15:22:29 -05:00
Sunil Mohan Adapa
643a06c7cd
wireguard: Fix format when showing multiple endpoints of the server
- Show them in multiple lines using <pre> like before.

Tests:

- Multiple endpoints are shown in the one line each using <pre> tag.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 15:22:26 -05:00
Sunil Mohan Adapa
8a7e70aab2
gitweb: Fix issue with running post init due to missing method
Fixes: #2563.

Also see
https://salsa.debian.org/freedombox-team/freedombox/-/merge_requests/2740

Test:

- Functional tests for gitweb pass.

- Without the patch, install gitweb and enable it. Restart FreedomBox service.
The error message in #2563 is reproduced. With the patch, the error disappears.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-02 14:58:16 -05:00
James Valleroy
11d58134e5
Translated using Weblate (Tamil)
Currently translated at 100.0% (1885 of 1885 strings)
2026-03-02 20:53:52 +01:00
தமிழ்நேரம்
bc257af638
Translated using Weblate (Tamil)
Currently translated at 100.0% (1885 of 1885 strings)
2026-03-02 17:10:01 +01:00
Sunil Mohan Adapa
6ba35df665
ejabberd: Fix setting up certificates for multiple domains
Fixes: #2566.

Thanks to joeDoe for helping with identifying the bug and confirming a fix.

- Currently, when multiple domains are configured, only one certificate is
setup. One domains properly and other domains will end up using the certificate
for the configured domain. This leads to domain validation errors on the
client-side.

- Copy certificates for all domains to /etc/ejabberd/letsencrypt directory
whether they are configured for ejabberd or not.

- Use the new certfiles: directive to provide multiple certificates. Don't use
and remove the old s2s_certfile: directive. Migrate old configuration.

Tests:

- Functional tests for ejabberd work.

- Installing ejabberd freshly works. s2s_certfile: is not present in the
configuration file. certfiles: is present with wildcard for LE certs.

- Install ejabberd without the patch. s2s_certfile: is present and certfiles:
does not contain the wildcard for LE certificates. Apply the patch. Setup is
re-run for ejabberd app and succeeds. s2s_certfile: is removed from
configuration file. certfiles: contains wildcard for LE certificates.
/etc/ejabberd/letsencrypt/ contains certificates for all the configured domains
on the system.

- Adding domain works. Certificate for newly configured domain is copied into
the ejabberd LE cert directory. ejabberd daemon is reloaded. hosts: list is updated.

- Removing domain works. Certificate for the old domain is retained in the
ejabberd LE directory. ejabberd daemon is not reloaded.

- Setting the list of domains works. Old certificates are retained in the
ejabberd LE directory. ejabberd daemon is reloaded. hosts: list is updated.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-28 13:25:00 -05:00
Sunil Mohan Adapa
e4ee756918
bin: Add tool to change FreedomBox password in Django database
Tests:

- Run 'make build install'. The new binary is available as
/usr/bin/freedombox-change-password. Running 'freedombox-change-password
tester2' works as expected.

- Providing wrong username show proper error message.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-28 07:48:48 -05:00
Sunil Mohan Adapa
7f2b49f70c
locale/bg: Fix several translations with HTML links (Bulgarian)
The HTML attributes of the translation must be the same as English string. Newly
inserted characters lead to 404 page not found errors.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-27 08:38:30 -08:00
Sunil Mohan Adapa
36fb92a953
locale/de: Fix several translations with HTML links (German)
Fixes: #2560.

The HTML attributes of the translation must be the same as English string. Newly
inserted characters lead to 404 page not found errors.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-27 08:33:14 -08:00
Frederico Gomes
57816029e5
wireguard: Fix split tunneling
- Currently, when adding a server, we have an option for 'default route' but
unchecking it does not work. This is due to allowed_peers always containing
::0/0 and 0.0.0.0/0. Fix this by setting the allowed_peers to a value containing
only the IP of the WireGuard network.

Tests:

- When default routing it checked, routing table shows default route for
wireguard device. Traceroute confirms routing through WireGuard network.

- When default routing it unchecked, routing table does not show default route
for wireguard device. Traceroute confirms routing through regular network.

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-26 23:06:30 -08:00
Sunil Mohan Adapa
3be73bad59
tests: functional: Fix reloading error page during install/uninstall
- When an error page is shown during installation/uninstallation, no automatic
refresh of the page happens. Fix this by reloading the page when error is shown.

- When error page is shown, the document.readyState is "interactive" (meaning
that page load is completed but other resources such as images are being
loaded). So, checking for error page is never happening.

- Also when reloading an error page, WebDriverException may happen so use the
wait_for_page_update() utility to perform the page reloads.

Tests:

- Run functional tests for bepasty. When installing the app, stop apache web
server. Let an error page be shown. Then start the server again. Without the
patch, the error page is never reloaded. With the patch, the error page is
reloaded and tests succeed.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-25 17:51:11 -05:00
Sunil Mohan Adapa
5e112bd8bf
js: When page load fails during install, show it to user
- Currently when HTMX tries to fetch a page and fails, it silently fails and
does not perform any further operations. So, the installation page is stuck.
This is also leading to functional test case failures.

- Handle errors in page response and errors while making requests and reload the
entire page. This will result in browser showing appropriate error page. User
will understand that the operation has failed.

- Also add HTMX event listeners on the body as shown in HTMX documentation.

Tests:

- Press install. After installation process has started, stop Apache web server.
Without the patch, HTMX fails silently and the installation progress is shown
indefinitely.

- With the patch applied, the connection error page is properly shown.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-25 17:51:08 -05:00
Sunil Mohan Adapa
68ccb46ecf
tests: functional: Increase systemd rate limits for starting units
- If functional tests run fast, daemon will be stopped and started many times.
This is hitting rate limit for some daemons.

Tests:

- Configuration file is created as expected. systemd read the value as shown by
'systemctl show'.

- Mumble functional tests pass without having to insert sleeps.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-24 12:52:13 -08:00
James Valleroy
2044fa3e84
mumble: murmurd renamed to mumble-server
- Update backup manifest config file location.

Fixes #2518

Tests:

- mumble functional tests are passed.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-24 12:28:16 -08:00
Sunil Mohan Adapa
bc4730c33c
action_utils: Fix issue with type checking a generator
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-24 10:58:00 -08:00
Sunil Mohan Adapa
365c1c3484
doc/dev: Set new theme for developer documentation
- Change theme to 'Book' based on Sphinx pydata theme. It supports dark/light
modes. Looks more modern and better defaults/options.

- Add logo on the top left corner.

- Add menu to go to repository, view page source, edit page source, and report
issue on current page.

- Don't repeat 'FreedomBox Authors' in authors text and copyright text. Show
only once as suggested by the theme.

- Use theme option to show license link instead of overriding the template.

Tests:

- After building the theme, all options work as expected.

- Footer appears as expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-23 13:41:54 -08:00
Benedek Nagy
32fae4c3d3
doc/dev: always have an up-to-date copyright year
Signed-off-by: Benedek Nagy <contact@nbenedek.me>
2026-02-22 17:11:36 -08:00
Sunil Mohan Adapa
9a16e20fa9
letsencrypt: When copying certificate reset the umask reliably
- When there is an error writing to certificate files, the umask is not reset
properly. Fix this my using umask context manager from action utils. This could
be core reason behind: #2564.

Tests:

- Changing the domain name creates the file /var/lib/quassel/quasselCert.pem
with the proper permissions of 0o600. If in Quassel app's Let's Encrypt component
the certificate file path is changed, then two files are created on domain name
change. Private key is created with 0o600 permissions and certificate file is
created with 0o644 permissions.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-22 14:17:51 -05:00
Sunil Mohan Adapa
03b4a78fd0
quassel: Explicitly set permissions on the domain configuration file
Closes: #2564

Tests:

- Changing the domain name in quassel app page set the expected file
permissions. Changing the value in the code results in file getting created with
changed permissions.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-22 14:17:47 -05:00
Sunil Mohan Adapa
ac83de6635
action_utils: Implement utility to change umask temporarily
- When we set umask we typically want to change it back to original value after
the operation. Implement a context manager to help with this.

Tests:

- Unit tests pass.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-22 14:17:44 -05:00
James Valleroy
b1177a82f8
Translated using Weblate (Greek)
Currently translated at 46.1% (869 of 1885 strings)
2026-02-22 14:17:00 +01:00
Βασίλης Χατζηκαμάρης
77112e9faf
Translated using Weblate (Greek)
Currently translated at 45.5% (858 of 1885 strings)
2026-02-18 15:09:50 +00:00
Coucouf
d9f20b205b
Translated using Weblate (French)
Currently translated at 100.0% (1885 of 1885 strings)
2026-02-18 15:09:48 +00:00
Daniel Wiik
c0bd1c8280
Translated using Weblate (Swedish)
Currently translated at 100.0% (1885 of 1885 strings)
2026-02-16 13:09:55 +01:00
Frederico Gomes
f0a36f11ba
wireguard: show server vpn ip in show client page
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-15 10:00:00 -05:00
Frederico Gomes
b18c37a5f6
wireguard: improved server section UX flow
Originally aimed to show server info (public key, endpoints) in a table.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
[jvalleroy: Remove trailing spaces]
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-15 09:38:40 -05:00
Isak
ccf5231569
Translated using Weblate (Swedish)
Currently translated at 80.0% (1508 of 1885 strings)
2026-02-15 05:09:45 +01:00
Jiří Podhorecký
020ef6ae0c
Translated using Weblate (Czech)
Currently translated at 100.0% (1885 of 1885 strings)
2026-02-09 20:09:44 +01:00
kosagi
cc8fa47efe
Translated using Weblate (Catalan)
Currently translated at 55.2% (1042 of 1885 strings)
2026-02-07 00:02:02 +01:00
Daniel Wiik
59c3b49d8b
Translated using Weblate (Swedish)
Currently translated at 79.9% (1507 of 1885 strings)
2026-02-07 00:01:55 +01:00
Pierfrancesco Passerini
a4cfb824e8
Translated using Weblate (Italian)
Currently translated at 100.0% (1885 of 1885 strings)
2026-02-07 00:01:50 +01:00
Frederico Gomes
59329169e4
wireguard: filter .local addresses from showClient view
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-06 12:50:05 -08:00
Sunil Mohan Adapa
df7793916c
backups: Fix type checking errors
- Use the passed in argument for copy_ssh_client_public_key instead of
overwriting it.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-06 11:39:04 -08:00
Frederico Gomes
0c8cba3a13
container: Align terminology with !2731 in printed banner
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-06 08:16:53 -08:00
Sunil Mohan Adapa
5da5ef5f96
backups: Create a better comment in the generated SSH key file
Tests:

- When /var/lib/plinth/.ssh is deleted and add remote repository form is
visited, the directory along with SSH key files are created. The .pub file has
the expected comment freedombox@configured_domain.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:49 -08:00
Sunil Mohan Adapa
4ae66c034c
backups: Fix showing proper error for incorrect passphrase
Tests:

- Provide incorrect passphrase when adding a remote repository. Should show a
message that passphrase is incorrect and redirect back to add remote repository
form.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:46 -08:00
Sunil Mohan Adapa
e21ab91b21
backups: Create .ssh folder before creating SSH key
- As a safe guard although it should exist because of a prior verification of
SSH key.

- Minor refactor to make the method flatter.

Tests:

- Remove /var/lib/plinth/.ssh and visit add remote repository form. The public
key is displayed in the form. The files in /var/lib/plinth/.ssh are created with
expected permissions.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:42 -08:00
Sunil Mohan Adapa
dd0a0f56a6
backups: Simplify handling of migration to SSH keys
- Integrate SSH error handling into borg error handling.

- Move logic to migrate SSH keys into lower levels (Repository class) so that it
can performed at more instances such as when initializing repository. It also
provides better abstraction keeping the view logic simpler.

- Drop ability to mount repository using password. This is important next step
for mounting using systemd unit files.

- Use exceptions to eliminate return value checking.

- Create a special exception for exceptions raised during SSH operations. Raise
this at lower levels and handle these using the common error handler.

Tests:

- Adding a remote repository with key and password authentication works with and
without encryption. Adding works with SSH host key pre-verified works too.

- Trying to add a remote repository with incorrect passpharse fails with the
simplified error message. Redirect happens to add remote repository page. Error
message with SSH host key pre-verified works too. Repository is removed.

- Trying to provide wrong SSH password fails with a simplified error message.
Redirect happens to add remote repository page. Repository is removed.

- Mounting a repository after unmounting it works.

- Mounting a repository with SSH password in its configuration works. Migration
is performed and SSH password is replaced with SSH key file path.

- A schedule for a repository with SSH password runs successfully. An archive is
created. Migration is performed and SSH password is replaced with SSH key file
path.

- SSH identity files are created with plinth:plinth ownership. Private key file
is created with 0o600 permissions and public key file is created with 0o644
permissions.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:39 -08:00
Sunil Mohan Adapa
a7ef60015c
backups: Minor refactoring
Tests:

- Adding a remote repository with key and password authentication works with and
without encryption.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:36 -08:00
Sunil Mohan Adapa
2208a7b210
backups: tests: Simplify functional test using more classes
- This makes the functional test focus more on the repository that is added
rather than all remote repositories.

Tests:

- Functional tests for backups app works.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:33 -08:00
Sunil Mohan Adapa
ff7c3a53a5
backups: Tweak appearance of add remote location form
- Use bootstrapform templates where possible to reduce code.

- Fix incorrect tag for radio button for password authentication.

- Drop borders and instead:

  - Style each group as a section. This includes encryption section and
  repository path section.

  - Utilize the simplicity as passwords fields are not displayed.

- Retain <label> tag so that clicking on it works and it also easier for
accessibility tools.

Tests:

- The option for password authentication works are expected. The fields for
encryption passphrase, ssh password work as before.

- Clicking on form labels focuses the form element.

- Adding a repository with key and password authentication works with and
without encryption.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:30 -08:00
Sunil Mohan Adapa
7d3d930137
backups: Show/hide form elements instead of disabling for simplicity
- Unlike the case of network forms, for example, there is nothing the user could
infer from a disabled form element. If they see a disabled DNS field, they would
understand that it is an editable value but has been disabled due to other
option values. It is important to allow users to discover this. However, in case
of password fields, they are not needed to be shown to the user unless the
appropriate option is selected.

Tests:

- In the add remote repository form, selecting the authentication type radio
options shows and hides the password field. Selecting the value for encryption
type shows and hides the encryption password field.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:26 -08:00
Sunil Mohan Adapa
ad40072267
backups: Fix issue with Javascript in add remote location form
Tests:

- In remote repository add form, selecting radio options for authentication
types does not throw an error. The password field is shown/hidden as expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:23 -08:00
Sunil Mohan Adapa
305b1f01f5
backups: Avoid some repeated text in form help text
Tests:

- The remote repository add form shows form elements are updated as expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:20 -08:00
Sunil Mohan Adapa
58ecf9d3e4
actions, privileged_daemon: Drop some unused global statements
Tests:

- Make a privileged method throw and exception after spewing output to stdout
and stderr. The exception caught on the service daemon contains the expected
stdout and stderr messages.

- Sending SIGTERM to privileged daemon shuts down the daemon.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-05 22:33:17 -08:00
James Valleroy
3cb5d1a936
backups: Migrate to SSH key auth when mounting
Tests:

- On main branch, add a remote repository with SSH password. Unmount
  the remote location.

- Switch to branch with this change. Mount the remote location. Logs
  show that it is migrated from password to key authentication. Plinth
  database no longer contains password for this remote.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-05 22:33:14 -08:00
James Valleroy
8b9413c719
backups: Arrange form for adding remote location
- Group together related fields with borders.

- Display errors on form and fields.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-05 22:33:11 -08:00
James Valleroy
451e582c07
backups: Test adding/removing remote location
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-05 22:33:07 -08:00
James Valleroy
043bd44dec
backups: Use selected SSH credential for remote
- Use javascript to disable or enable password fields.

- If SSH key auth is selected, then try the connection.

- If SSH password auth is selected, then copy the key.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-05 22:33:04 -08:00
James Valleroy
3558a26b2f
backups: Use SSH key instead of password
- After copying the SSH client public key to the remote host, replace
  the SSH password credential with keyfile.

- Also use SSH key when checking that remote directory exists.

Tests:

- Add remote backup location "tester@localhost:~backups". Test various
  operations like create backup, download backup, unmount and
  mount. Confirm that SSH password is no longer present in plinth
  sqlite database.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-05 22:33:01 -08:00
James Valleroy
f689e1b3cf
backups: Copy SSH client public key to remote
Tests:

- In development VM, add a remote backup location of "tester@localhost:~/backups".
  Verify the SSH host key. plinth@freedombox key is listed in
  /home/tester/.ssh/authorized_keys.

- Remove the remote backup location, and delete /home/tester/.ssh/authorized_keys.
  Add the same remote backup location again. plinth@freedombox key is again
  listed in /home/tester/.ssh/authorized_keys.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-05 22:32:58 -08:00
James Valleroy
7fb41313cd
backups: Display SSH public key when adding remote
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-05 22:32:55 -08:00
James Valleroy
156d0b761f
backups: Generate SSH client key if needed
Tests:

- Click on Add Remote Backup Location. Logs show that SSH client key is
  generated. The private key is readable only by plinth user.

- Go back, and click on Add Remote Backup Location again. Logs show that SSH
  client key already exists.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-05 22:32:52 -08:00
Dietmar
33d05ef5be
Translated using Weblate (German)
Currently translated at 99.2% (1870 of 1885 strings)
2026-02-05 11:01:51 +00:00
Besnik Bleta
a1bd01f0c1
Translated using Weblate (Albanian)
Currently translated at 99.6% (1879 of 1885 strings)
2026-02-04 07:01:54 +01:00
Coucouf
ea4172a4c2
Translated using Weblate (French)
Currently translated at 100.0% (1885 of 1885 strings)
2026-02-04 07:01:52 +01:00
Burak Yavuz
0ee977a6b0
Translated using Weblate (Turkish)
Currently translated at 100.0% (1885 of 1885 strings)
2026-02-04 07:01:51 +01:00
大王叫我来巡山
6b7e518eed
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 61.3% (1157 of 1885 strings)
2026-02-04 07:01:49 +01:00
Sunil Mohan Adapa
196fcea328
ui: Add animation for notification dismissal
Tests:

- When a notification dismiss button is clicked, first it fades and collapses
at the same time.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Joseph Nuthalapati <njoseph@riseup.net>
2026-02-04 08:41:37 +05:30
Sunil Mohan Adapa
e37d26abee
ui: Refactor notification delete buttons to avoid repeating code
Tests:

- Through code changes, ensure that dist upgrade notification, updated to new
release notification, privacy notification, and app installed notification show
up. Ensure that they have correct hx- attributes and URL property for dismiss
button. Clicking dismiss button works as expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Joseph Nuthalapati <njoseph@riseup.net>
2026-02-04 08:40:43 +05:30
Joseph Nuthalapati
13a575017c
ui: Dismiss notifications without page reload
- Delete only the <li> of the notification using HTMX.
- Notifications list stays open. User can dismiss another notification.
- Decrement notification counter using JavaScript after removing
  notification from the list.
- Added HTMX to every kind of notification.
- Tested dismissing notifications from the top, middle and bottom of the
  list.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
[sunil: Update comment format in .js file]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-03 14:16:55 -08:00
James Valleroy
4e668c8a98
Release v26.3 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-02 20:42:43 -05:00
James Valleroy
367b2d9f79
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-02 20:41:02 -05:00
James Valleroy
7eac69a1f8
locale: Update translation strings
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-02 20:14:26 -05:00
大王叫我来巡山
d0a73142ac
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 61.4% (1155 of 1880 strings)
2026-02-03 02:07:19 +01:00
Pierfrancesco Passerini
48929b9d75
Translated using Weblate (Italian)
Currently translated at 100.0% (1880 of 1880 strings)
2026-02-03 02:07:18 +01:00
Burak Yavuz
f5e487569f
Translated using Weblate (Turkish)
Currently translated at 100.0% (1880 of 1880 strings)
2026-02-03 02:07:18 +01:00
Sunil Mohan Adapa
04ba96a467
ui: Use HTMX to update notifications on partial page updates
Tests:

- When app install button is clicked, the new page shows that app is being
installed. However, when app installation is complete, the notification still
shows that app is being installed. With the patch, the issues is resolved.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-02 14:38:11 -08:00
Joseph Nuthalapati
01cafafcda
ui: Use HTMX to eliminate full page reloads
HTMX implementation is limited to HTML and JS files. No changes to Python files.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
2026-02-02 13:49:51 -08:00
Joseph Nuthalapati
3c5f81ab8c
ui: Add HTMX as a dependency
Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
[sunil: Sort dependency in list]
[sunil: Adjust spacing]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-02 13:43:15 -08:00
Frederico Gomes
57f5105fd0
wireguard: show server endpoint on main app page
Display the WireGuard server endpoint (ip_address:listen_port)
alongside the public key on the main WireGuard page,
so users configuring clients can copy both values directly.

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
[sunil: Keep the docstring]
[sunil: Adjust markup to eliminate <p> inside <p>]
[sunil: Produce a single <pre> tag instead of multiple for multiple domains]
[sunil: Minor refactoring for more concise code]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-02-02 13:07:53 -08:00
Sunil Mohan Adapa
f4b1eb23ac
wireguard: Remove NM connections when app is uninstalled
Tests:

- Install WireGuard and start the server. Uninstall the app and re-install.
Without the patch, the connection remain after uninstall. With the patch, the
connections are removed after uninstall and return to pristine state after
re-install.

- Functional tests succeed.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-02-01 08:37:18 -05:00
Frederico Gomes
b0a841c63a
wireguard: Show next available client IP in Add Client form
Display the next available IP address that will be
automatically assigned when adding a new client.

Helps admins know what client IP to provide when configuring client
connections back to this server.

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
[sunil: Turn the IP address styling into a form element]
[sunil: Update the comment style for consistency]
[sunil: Update the label for clarity]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-01-28 13:05:51 -08:00
Sunil Mohan Adapa
0fa77cbe30
debian: Ignore lintian warning: service file missing Install section
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-01-26 12:27:46 -08:00
James Valleroy
7988cc737b
debian: Update copyright years
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-26 12:27:43 -08:00
James Valleroy
2bb2eaa6ec
debian: Remove preinst script
- freedombox 20.7 and 20.9 are considered ancient versions.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-26 12:27:39 -08:00
James Valleroy
c19d2ab692
debian: Remove default Rules-Requires-Root
- As of dpkg version 1.22.13, this field is set to "no" by default.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-26 12:27:36 -08:00
James Valleroy
01da6934be
debian: Follows policy 4.7.3
- Priority is now optional by default.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-26 12:27:33 -08:00
James Valleroy
6960a57779
Makefile: Fix removing extra license file
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-26 12:27:30 -08:00
James Valleroy
2237d89745
lintian: Remove mismatched overrides
- The original lintian messages no longer appear.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-26 12:27:27 -08:00
Ettore Atalan
e3b893277c
Translated using Weblate (German)
Currently translated at 99.2% (1865 of 1880 strings)
2026-01-25 15:02:39 +01:00
Frederico Gomes
6bf95de3bc
docs: update container script usage
Container usage docs have been updated to be in line with
merged request !2731.

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-01-23 11:28:30 -08:00
James Valleroy
0614b5e509
wireguard: Update functional tests to handle Start Server button
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-21 20:47:21 -05:00
Frederico Gomes
53f7c75d8e
wireguard: add 'Start Server' button with confirmation page
Adds explicit UI flow to generate server keypair and interface.

- New EnableServerView
- Conditional 'Start Server' button on main page when no wg0
- Button switches to 'Add Client' after server setup

Solves circular dependency UX issue when connecting two FBs

EDIT: Following review feedback, I removed the intermediate
confirmation page.
The “Start WireGuard Server” button now sends a POST
directly from the main page.

Signed-off-by: Frederico Gomes <fredericojfgomes@gmail.com>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
[jvalleroy: Change from TemplateView to View]
[jvalleroy: Remove redundant import]
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-21 20:19:46 -05:00
James Valleroy
8276ab64ea
Release v26.2 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-20 20:27:13 -05:00
James Valleroy
c5595f2d00
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-20 20:25:54 -05:00
Pierfrancesco Passerini
935f5680fb
Translated using Weblate (Italian)
Currently translated at 100.0% (1880 of 1880 strings)
2026-01-16 22:32:25 +01:00
Pierfrancesco Passerini
d81bc9fdf2
Translated using Weblate (Italian)
Currently translated at 100.0% (1880 of 1880 strings)
2026-01-16 22:14:58 +01:00
Pierfrancesco Passerini
39634713be
Translated using Weblate (Italian)
Currently translated at 100.0% (1880 of 1880 strings)
2026-01-16 21:45:28 +01:00
Pierfrancesco Passerini
ca4ebf8c68
Translated using Weblate (Italian)
Currently translated at 100.0% (1880 of 1880 strings)
2026-01-16 19:38:33 +01:00
Pierfrancesco Passerini
251704fa7d
Translated using Weblate (Italian)
Currently translated at 97.3% (1830 of 1880 strings)
2026-01-15 21:49:10 +01:00
Pierfrancesco Passerini
56f8f6ed2a
Translated using Weblate (Italian)
Currently translated at 97.3% (1830 of 1880 strings)
2026-01-15 21:31:22 +01:00
Pierfrancesco Passerini
a0f7966ef4
Translated using Weblate (Italian)
Currently translated at 97.3% (1830 of 1880 strings)
2026-01-15 20:56:47 +01:00
Pierfrancesco Passerini
309791a1c4
Translated using Weblate (Italian)
Currently translated at 90.1% (1695 of 1880 strings)
2026-01-14 19:19:04 +01:00
Pierfrancesco Passerini
318a636ef1
Translated using Weblate (Italian)
Currently translated at 83.2% (1565 of 1880 strings)
2026-01-14 13:23:31 +01:00
Pierfrancesco Passerini
9621b40802
Translated using Weblate (Italian)
Currently translated at 82.3% (1548 of 1880 strings)
2026-01-14 11:28:34 +01:00
Pierfrancesco Passerini
04610a6e94
Translated using Weblate (Italian)
Currently translated at 80.0% (1505 of 1880 strings)
2026-01-14 09:58:43 +01:00
Pierfrancesco Passerini
f98479469e
Translated using Weblate (Italian)
Currently translated at 77.3% (1454 of 1880 strings)
2026-01-13 19:32:57 +01:00
Pierfrancesco Passerini
4135745e09
Translated using Weblate (Italian)
Currently translated at 74.5% (1402 of 1880 strings)
2026-01-13 09:32:30 +01:00
Pierfrancesco Passerini
017c660fa2
Translated using Weblate (Italian)
Currently translated at 73.6% (1384 of 1880 strings)
2026-01-12 18:01:52 +01:00
Joseph Nuthalapati
958ac2e0a5
gitweb: Fix deleting last repo disables app
GitWeb requires authenticated access if there are no public
repositories left.

1. Create a public repository
2. Delete the repository (i.e. delete the last/only repository)
3. GitWeb app shows as disabled, but is still usable
4. If another repository is created, the app becomes enabled again

Not considering the component GitwebWebserverAuth when determining
whether the app is enabled or disabled.

This commit fixes the status shown in the configuration page, but keeps
the authentication requirement if there are no public repositories.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
2026-01-12 11:10:14 +02:00
Pierfrancesco Passerini
54e0ead0e0
Translated using Weblate (Italian)
Currently translated at 68.3% (1285 of 1880 strings)
2026-01-11 17:30:12 +01:00
Pierfrancesco Passerini
bd42bae464
Translated using Weblate (Italian)
Currently translated at 67.8% (1275 of 1880 strings)
2026-01-11 16:41:28 +01:00
Pierfrancesco Passerini
72da938b8d
Translated using Weblate (Italian)
Currently translated at 61.0% (1148 of 1880 strings)
2026-01-11 09:53:00 +00:00
Joseph Nuthalapati
0f9fe4f111
notifications: Close dropdown when clicking outside
The notifications dropdown does not behave like the other 3 dropdowns in
the navigation bar, but a user would expect it to, since it is also
visually a dropdown like the others.

Added JavaScript for a click listener that would collapse the
notifications dropdown if the user clicks anywhere outside the dropdown
area.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-10 07:47:21 -05:00
Priit Jõerüüt
72c37e5209
Translated using Weblate (Estonian)
Currently translated at 19.7% (372 of 1880 strings)
2026-01-09 21:01:46 +01:00
Pierfrancesco Passerini
b377f94f77
Translated using Weblate (Italian)
Currently translated at 60.0% (1129 of 1880 strings)
2026-01-08 14:01:50 +00:00
Priit Jõerüüt
75e2c17089
Translated using Weblate (Estonian)
Currently translated at 18.4% (346 of 1880 strings)
2026-01-08 14:01:48 +00:00
Pierfrancesco Passerini
ae9b37d561
Translated using Weblate (Italian)
Currently translated at 59.3% (1115 of 1880 strings)
2026-01-07 13:01:51 +00:00
James Valleroy
fceb6967e6
Release v26.1 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-05 20:24:20 -05:00
Joseph Nuthalapati
88de2a9b50
container: Add aliases for start/stop commands
Add up/down commands as aliases for start/stop commands.

'stop' is not the opposite of 'up', so it can be confusing to new users
of the script.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-01-05 08:39:21 -05:00
Pierfrancesco Passerini
710b180ca1
Translated using Weblate (Italian)
Currently translated at 59.4% (1118 of 1880 strings)
2026-01-02 17:01:48 +01:00
Pierfrancesco Passerini
2e6265bc23
Translated using Weblate (Italian)
Currently translated at 59.4% (1117 of 1880 strings)
2025-12-26 16:00:20 +01:00
Priit Jõerüüt
2895afbd34
Translated using Weblate (Estonian)
Currently translated at 18.4% (346 of 1880 strings)
2025-12-22 17:03:28 +01:00
Pierfrancesco Passerini
d9ff6ba707
Translated using Weblate (Italian)
Currently translated at 59.4% (1118 of 1880 strings)
2025-12-22 17:03:26 +01:00
大王叫我来巡山
81d1249eae
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 61.4% (1155 of 1880 strings)
2025-12-21 10:00:25 +00:00
Priit Jõerüüt
8f31f38859
Translated using Weblate (Estonian)
Currently translated at 15.4% (290 of 1880 strings)
2025-12-21 10:00:23 +00:00
Ettore Atalan
ae00a0e17a
Translated using Weblate (German)
Currently translated at 98.8% (1859 of 1880 strings)
2025-12-21 10:00:20 +00:00
Coucouf
4b270ae57c
Translated using Weblate (French)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-19 21:00:25 +01:00
OwlGale
8c5410271e
Translated using Weblate (Russian)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-19 21:00:23 +01:00
Dietmar
670a7032b1
Translated using Weblate (German)
Currently translated at 98.7% (1857 of 1880 strings)
2025-12-19 21:00:22 +01:00
Priit Jõerüüt
87a8392be7
Translated using Weblate (Estonian)
Currently translated at 13.0% (245 of 1880 strings)
2025-12-19 21:00:20 +01:00
Dietmar
3861e0b272
Translated using Weblate (Italian)
Currently translated at 58.5% (1100 of 1880 strings)
2025-12-18 18:00:33 +01:00
Priit Jõerüüt
4223e48a01
Translated using Weblate (Estonian)
Currently translated at 12.9% (243 of 1880 strings)
2025-12-18 18:00:31 +01:00
Dietmar
dae222b20c
Translated using Weblate (German)
Currently translated at 98.6% (1855 of 1880 strings)
2025-12-18 18:00:28 +01:00
Roman Akimov
6f4cb22558
Translated using Weblate (Russian)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-17 08:00:39 +01:00
OwlGale
f38380d9f6
Translated using Weblate (Russian)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-17 08:00:38 +01:00
Jiří Podhorecký
527d36ede8
Translated using Weblate (Czech)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-17 08:00:37 +01:00
Priit Jõerüüt
56985dcc35
Translated using Weblate (Estonian)
Currently translated at 10.6% (201 of 1880 strings)
2025-12-17 08:00:35 +01:00
Burak Yavuz
b3e3498aba
Translated using Weblate (Turkish)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-17 08:00:30 +01:00
Максим Горпиніч
6d87e47a9b
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-17 08:00:29 +01:00
109247019824
38d61c823e
Translated using Weblate (Bulgarian)
Currently translated at 57.6% (1083 of 1880 strings)
2025-12-17 08:00:24 +01:00
Besnik Bleta
842cabee46
Translated using Weblate (Albanian)
Currently translated at 99.6% (1874 of 1880 strings)
2025-12-17 08:00:21 +01:00
James Valleroy
9924897d51
Release v25.17.1 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-15 20:35:47 -05:00
James Valleroy
f48770e12b
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-15 20:34:46 -05:00
James Valleroy
ead1b72251
locale: Update translation strings
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-15 20:18:52 -05:00
Sunil Mohan Adapa
8ba444990b
backups: Set proper permissions for backups-data directory
Fixes: #2554

- Update permissions on the backups-data directory so that files are only
accessible by root users.

- Ensure that the directory is created by the 'backups' app and not by each of
the apps that take the backup.

Tests:

- Run functional tests for miniflux, dynamicdns, wordpress, zoph, and nextlcoud.
There was an unrelated functional test case failure in nextcloud.

- On a fresh installation, apply patch. Service is restarted. The directory is
created with proper permissions and ownership.

- On a fresh installation, without the patch. Backup the dynamicdns app. The
directory is created with incorrect permissions. Apply the patch. Service is
restarted. Proper permissions are set on the directory.

- On a setup with incorrect permissions, re-run backups app's setup. The
permissions are updated correctly.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-15 20:16:36 -05:00
Pierfrancesco Passerini
1bd6e20a07
Translated using Weblate (Italian)
Currently translated at 56.9% (1070 of 1880 strings)
2025-12-16 02:16:00 +01:00
OwlGale
3ee9468c88
Translated using Weblate (Russian)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-16 02:15:55 +01:00
bsurajpatra
912d868146
Translated using Weblate (Hindi)
Currently translated at 45.1% (848 of 1880 strings)
2025-12-16 02:15:55 +01:00
Sunil Mohan Adapa
54bebd7269
transmission: Deal with changes in latest forky package
Fixes: #2555

- '-' in configuration keys changed to '_'. Write both old and new keys to the
configuration file so that same code works for both versions of transmission.
Extra keys are ignored and removed from the configuration by the transmission
daemon.

- When reading the configuration for download directory account for both old and
new keys.

- Update functional tests for change in ID for delete torrent button.

Tests:

- Run functional tests on trixie and forky VM.

- On trixie and forky VM, after the app is installed, the configuration values
are set as expected in the configuration file.  Transmission does not show its
own authentication dialog. FreedomBox SSO works as expected.

- On trixie and forky, updating the download dir in FreedomBox app changes the
values in the web UI.

- On forky, install transmission using old code and sources.list updated to
trixie. Change the download directory. Stop service. Then update the
sources.list to forky, apply patches and start service. Run unattended-upgrades.
Notice that the earlier set download directory persists. Two configuration
values for rpc also are as expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-15 20:12:20 -05:00
Sunil Mohan Adapa
0c6335b9df
minetest: Remove legacy code, use new name, conf, etc.
- Update link in copyright file to the logo.

- Update paths to configuration file. Drop hack to load old configuration path.
Migrate old configuration file to new path.

- Use newer package name instead of transitional package name.

- Use newer systemd unit name instead of aliased one.

- Update backup/restore paths.

- Drop code to handle configuration file update. This upgrade was done during
Bookworm cycle. It is not needed for upgrade from Bookworm to Trixie.

- Fix understanding of default values for keys not present in the configuration
file. These values are picked up from source code as the documentation does not
mention them.

Tests:

- Run unit and minetest functional tests.

- After the app is freshly installed. Max users is 15. PvP is enabled. Create
mode is disabled. Damaged is enabled.

- Changes in configuration are reflected.

- Play a game and make some changes. Update configuration. Backup. Uninstall and
restore. The player data is restored. Configuration is restored.

- Install without the changes. Make configuration changes. Apply changes and
remove obsolete files. Restart service. App is updated. Notice that
configuration file is migrated to new path. Configuration options are retained.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-15 19:43:08 -05:00
Pierfrancesco Passerini
ebdbd8cd69
Translated using Weblate (Italian)
Currently translated at 50.1% (943 of 1880 strings)
2025-12-14 09:00:27 +00:00
Diego Roversi
cad7d4412f
Translated using Weblate (Italian)
Currently translated at 50.1% (943 of 1880 strings)
2025-12-14 09:00:23 +00:00
OwlGale
f2980fa1b0
Translated using Weblate (Russian)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-14 09:00:22 +00:00
Priit Jõerüüt
57dea84e79
Translated using Weblate (Estonian)
Currently translated at 4.7% (89 of 1880 strings)
2025-12-14 09:00:19 +00:00
Priit Jõerüüt
fe496627d0
Translated using Weblate (Estonian)
Currently translated at 4.5% (85 of 1880 strings)
2025-12-12 08:00:20 +00:00
Benedek Nagy
044d99e367
minetest: Rename Minetest to Luanti
This is to follow up with the upstream change:
https://blog.luanti.org/2024/10/13/Introducing-Our-New-Name/.

Rename Minetest to Luanti in:
- App name
- App description
- Clients' name
- Docstrings

- Also update the donation and client download links to point to the new
  domain.
- Make the app button point to /apps/luanti while continuing to serve
  /apps/minetest in case somebody has it bookmarked.

Closes: #2521

Signed-off-by: Benedek Nagy <contact@nbenedek.me>
[sunil: Rename the old URL to index-old to avoid duplicates]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-12-12 11:16:37 +05:30
Benedek Nagy
959d1e2554
transmission: remove obsolete apache redirects
Tests:
- Install Transmission, apply the patch and confirm that the 409 conflict error,
  that the redirects were originally meant for, is not reproducible anymore.

Fixes: #2502

Signed-off-by: Benedek Nagy <contact@nbenedek.me>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-12-12 06:28:55 +05:30
109247019824
5407f9c89d
Translated using Weblate (Bulgarian)
Currently translated at 57.5% (1081 of 1880 strings)
2025-12-11 08:00:23 +01:00
Besnik Bleta
4cbbbed72b
Translated using Weblate (Albanian)
Currently translated at 99.6% (1874 of 1880 strings)
2025-12-11 08:00:21 +01:00
Jiří Podhorecký
f1248e9e1a
Translated using Weblate (Czech)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-11 08:00:19 +01:00
109247019824
afefa4010d
Translated using Weblate (Bulgarian)
Currently translated at 57.1% (1075 of 1880 strings)
2025-12-10 06:00:24 +00:00
Максим Горпиніч
f9c2bec79f
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-10 06:00:22 +00:00
Besnik Bleta
0f1276fbae
Translated using Weblate (Albanian)
Currently translated at 99.6% (1873 of 1880 strings)
2025-12-10 06:00:20 +00:00
Burak Yavuz
c0bbebd53b
Translated using Weblate (Turkish)
Currently translated at 100.0% (1880 of 1880 strings)
2025-12-10 06:00:19 +00:00
James Valleroy
d7e06348db
vagrant: Enable EFI firmware
Tests:

- Bring up vagrant box version 25.16. Able to access the web interface
  after setup is complete.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-12-10 10:11:06 +05:30
James Valleroy
f5e3bd3538
Release v25.17 to unstable 2025-12-08 20:51:47 -05:00
James Valleroy
d8650a4c6f
doc: Fetch latest manual 2025-12-08 20:50:37 -05:00
James Valleroy
3af2a8abeb
locale: Update translation strings 2025-12-08 20:27:27 -05:00
Joseph Nuthalapati
4cea13165a
l10n: Fix python-brace-format error in Estonian
Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
2025-12-06 16:14:03 +05:30
Priit Jõerüüt
49b646f016
Translated using Weblate (Estonian)
Currently translated at 2.2% (42 of 1875 strings)
2025-12-06 10:00:20 +01:00
Sunil Mohan Adapa
ef23ebedbc
privileged: Don't log exception that are expected
Fixes: #2551.

Tests:

- In a VM visit the storage page. Without the patch, an exception is logged when
there is no space to expand the partition. With the patch, the exception is not
logged.

- Raise an exception in the storage.usage_info() method and notice that the
exception is logged when visiting the Storage app page.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-03 14:23:03 -05:00
OwlGale
b66feb2cad
Translated using Weblate (Russian)
Currently translated at 100.0% (1875 of 1875 strings)
2025-12-03 14:00:19 +01:00
Sunil Mohan Adapa
37e40883e1
ui: Fix dark theme colors for app enable/disable toggle button
Tests:

- In the Calibre app page, the enable/disable toggle button has dark colors in
dark theme mode. The colors are proper when enabled, disabled, enabling,
disabling, hover.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:47 -05:00
Sunil Mohan Adapa
a0fe5e50eb
ui: Fix dark theme color for select-all button
Tests:

- Select-all button in create backup page has mostly unchanged color in light
mode and more consistent color in dark mode.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:42 -05:00
Sunil Mohan Adapa
6c7d77fd3b
ui: Minor CSS refactor to use variables
Tests:

- Main header's shadow is unchanged in light mode. In dark mode, it is still the
same and not really visible. This is better than casting a white shadow.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:39 -05:00
Sunil Mohan Adapa
85f04dde1a
ui: Fix dark theme colors for running status indicator
Tests:

- Insert event.preventDefault() in form submission code for submission buttons.

- For various button styles, submit the form. Running status indicator appears
on the form button. The styles for the indicator is appropriate in dark and
light themes.

  - Calibre delete library confirmation page has btn-danger.

  - Software Update, configuration update button has btn-primary.

  - Software Update, 'update now' button has btn-default.

  - Change a button from btn-primary to btn-link. Running status is not shown
  for this type of button.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:36 -05:00
Sunil Mohan Adapa
4bbe53e9ff
ui: Drop colors defined in Bootstrap 5.3
- They were only present for compatibility with Bootstrap 5.2. The values were
picked directly from Bootstrap 5.3. So, there is no change in output.

Tests:

- Go to user creation form and make errors. A form element with error has red
outline like more. The help text and error message are also in red like before.
In dark mode, they are more appropriate with the rest of the page and with
higher contrast.

- On default styled button, background color on hover is also improved
similarly.

- The border for select-all button in the create new backup page is also
improved similarly.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:33 -05:00
Sunil Mohan Adapa
c19fe296a4
ui: Dark theme color for tags text in an app card
Tests:

- In apps and system pages, the tags text in a card is unchanged in light theme.
In dark theme, it is more consistent with the rest of the page.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:30 -05:00
Sunil Mohan Adapa
499c6073a1
ui: Fix dark theme color for disabled form elements
Tests:

- In network connection editing page, find some form elements that are disabled
and their light mode color is mostly unchanged. In dark mode, it looks
consistent with the rest of the page.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:28 -05:00
Sunil Mohan Adapa
2ae78daebb
ui: Fix dark theme colors for default button style
- Use color variables provided by Bootstrap. These automatically adjust to light
and dark themes.

Tests:

- In light mode, the style for 'Update now' button in Software Update app is
close to what it was before. In dark mode, the styling is consistent with the
rest of the page.

- Same is true for Calibre app 'Delete Library' button and extra options button
in an app.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:25 -05:00
Sunil Mohan Adapa
d6b5b3bed2
ui: Fix dark theme color for form help text
- Use the right CSS variable.

Tests:

- In a form, the help text for an input is unchanged in light mode. And in dark
mode, it is more appropriate.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:21 -05:00
Sunil Mohan Adapa
b166404b0a
ui: Use default button style for tag buttons
- In the app header as well as tag search bar.

- De-emphasize the tag buttons in app header so that users won't see them as
sections of the page.

- Add a bullet Unicode character between the tags in app header to separate them
properly with new de-emphasized styling.

- Fix vertical alignment of text between tag buttons in app header and the close
button in tags in tag search bar.

Tests:

- In the app header, styling has been de-emphasized and tags now look more like
simple text. They are a separated with a bullet Unicode character. Vertical
alignment of bullets is accurate.

- In the tag search bar, tags continue to look like buttons but more like default
buttons. Vertical alignment of close button is accurate.

- In both areas tags look properly in dark and light color themes.

- In mobile view when there are a lot of tags, tags flow into second line.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:18 -05:00
Sunil Mohan Adapa
6c930a9f24
upgrades: Use bootstrap spinner button instead of custom styling
- This simplifies the implementation and gets it ready for dark/light mode.

Tests:

- In the upgrades main view, set is_busy = True and disable setting
refresh_page_sec. Load the upgrades app and notice that the 'Updating...' button
is showing proper styling in light anddark modes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:11 -05:00
Sunil Mohan Adapa
00a69108dd
ui: Implement a toggle menu for setting dark mode
- Add a toggle menu for selecting the color scheme. JS code largely taken from
Bootstrap documentation and slightly customized.

- Use local storage to store the setting for dark/light/auto. Default to auto
which means browser level preference is picked up (which could be system level
preference).

Tests:

- Appearance of the toggle menu is consistent. Check box is shown on the
currently selected value.

- Deleting the local storage value reverts the preference to browser set value.

- Menu is collapsed at smaller screen sizes. Appearance and functionality as
expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-12-02 20:17:06 -05:00
Coucouf
0419eb02cf
Translated using Weblate (French)
Currently translated at 100.0% (1875 of 1875 strings)
2025-12-02 13:00:25 +01:00
OwlGale
b2b581309e
Translated using Weblate (Russian)
Currently translated at 100.0% (1875 of 1875 strings)
2025-12-02 13:00:24 +01:00
Coucouf
d99161b4cc
Translated using Weblate (French)
Currently translated at 100.0% (1875 of 1875 strings)
2025-12-01 12:00:42 +01:00
kosagi
6ce4df4350
Translated using Weblate (Catalan)
Currently translated at 44.4% (833 of 1875 strings)
2025-12-01 12:00:39 +01:00
OwlGale
0d30193240
Translated using Weblate (Russian)
Currently translated at 100.0% (1875 of 1875 strings)
2025-12-01 12:00:20 +01:00
James Valleroy
7e9070e418
homeassistant: Fix spelling in tests
Tests:

- pytest runs the expected tests for Home Assistant.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-11-30 04:43:50 +05:30
James Valleroy
d63324160a
Release v25.16 to unstable 2025-11-24 20:44:22 -05:00
James Valleroy
d16c18be37
doc: Fetch latest manual 2025-11-24 20:44:09 -05:00
James Valleroy
3fe62bac0b
locale: Update translation strings 2025-11-24 20:22:18 -05:00
Sunil Mohan Adapa
ffecd1411b
jsxc: Update content security policy to prevent style errors
- Without the CSP, during loading there are no errors in the console. However,
during chatting, some styling related error show up.

Tests:

- Ensure that there are no CSP related errors in the browser console.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-21 22:31:27 -05:00
Sunil Mohan Adapa
a66c011f0b
jsxc: Fix missing dependencies
Fixes: #2547.

- Earlier, FreedomBox itself depended on Bootstrap 4 as needed by the room we
built for JSXC. Since FreedomBox moved to Bootstrap 5 this library is no longer
available for JSXC. libjs-jsxc itself depends on libjs-bootstrap which is of
version 3.

- Also fix the path for jquery-slimscroll. This is was likely updated for Trixie
cycle.

Tests:

- Connect to JSXC with two different browsers. Add contacts. Initiate chat and
send messages.

- Re-run app setup and it succeeds.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-21 22:31:14 -05:00
Sunil Mohan Adapa
a10ba40001
dynamicdns: Use only IPv4 for GnuDIP protocol
- The following messages was seen on the ddns.freedombox.org server:
"Unserviceable IP address from <ipv6_address>: user <username>.fbx.one - IP:
<ipv6_address>". This is due to code that checks for validity of incoming IP
address and fails. The current configuration only handles IPv4 address. Even if
this restriction is lifted, GnuDIP code does not contain code to add/remove AAAA
records.

- Fix this by forcing GnuDIP HTTP update requests to go on IPv4.

Tests:

- Copy the code for _request_get_ipv4() into a python3 console and run
_request_get_ipv4('https://ddns.freedombox.org/ip'). Do this on a dual stack
machine with both public IPv4 and IPv6 addresses. Only IPv4 address returned.
Changing the AF to AF_INET6 returns only the IPv6 address.

- Take a test DDNS account offline. Configure it in FreedomBox stable VM. The IP
address is properly updated.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-21 22:03:10 -05:00
Roman Akimov
7b93932868
Translated using Weblate (Russian)
Currently translated at 100.0% (1875 of 1875 strings)
2025-11-21 02:51:20 +00:00
Sunil Mohan Adapa
6c3b2e1f82
package: Prevent freedombox's deps from removal during app uninstall
- If an app declares dependency on package that is also a dependency for
freedombox, then during the app's uninstall, the dependency is attempt to be
removed and will fail (because freedombox package will be held state).

- Add freedombox (and thus its dependencies) to the list packages that should be
removed from list of packages to be removed during app uninstall.

- In test case, update list of packages attempted removal as the 'freedombox'
package is installed only in some environments.

Tests:

- Uninstall janus works. Log messages show that libjs-bootstrap5 and
node-popper2 are in the list of packages originally set to removed during app
uninstall but are later filtered out.

- Run pytest with 'freedombox' package installed and ensure all tests pass.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-17 13:03:06 -05:00
Sunil Mohan Adapa
b6bade7d06
janus: Update the video room code from latest upstream
- Bootswatch is a theme library for bootstrap. In Debian, only 3.x version of
the package is available. It is compatible with bootstrap 3.x but not bootstrap
5. Drop the theming altogether and use the basic bootstrap style (which is
already very close to the theme).

- Updated copyright year, mention the video room files in debian/copyright.

- Drop libjs-spin.js which is no longer used by the updated code.

- Change bootstrap version to 5.x from the earlier 4.x. Also add node-popper2
library (needed by bootstrap5 and video room code) as explicit dependency.

- Add missing style for btn-default class dropped in bootstrap 5.

- .simulcast-button CSS style is not longer needed as updated code used flex box
with .d-flex bootstrap class.

Tests:

- Compare the files in janus source code around Mar 2022 with the files in
FreedomBox source code before this patch. Compare latest janus source code with
the files after this patch. Both sets of changes are very similar.

- Connect to video room using two browser windows. Connection is successful and
2 video streams are shown in each of the browser windows.

- Styling looks close to the demo on janus website and is acceptable.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-17 13:03:02 -05:00
Sunil Mohan Adapa
94c344573b
janus: Relax content security policy for the video room
- Needed for the new video room code to run without CSP errors in the browser
console. JS error happens immediately after loading the page before Janus
initialization. Styling related errors happen after joining the room despite
eliminating use of'style=' attributes from JS code.

Tests:

- The video room works for a conference without showing any
Content-Security-Policy header related errors in the Firefox developer console.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-17 13:02:59 -05:00
Sunil Mohan Adapa
32520c7c89
janus: Allow app to be installed from Debian unstable
- Janus is currently not installable in Trixie because Janus was temporarily
removed during the release process of Trixie.

- Installing it from unstable, despite the instability is better than keeping
the app unavailable. Users have reported using the app.

Tests:

- Restarting the service after applying the patch leads to setup for upgrades
app to run. Apt preferences for janus packages are set. App is shown as
available. It can be installed.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-17 13:02:56 -05:00
Sunil Mohan Adapa
2467d6a033
middleware: Implement middleware for common headers such as CSP
- This allows overriding these headers in individual pages easily instead of
relaxing global policy.

- Drop the obsolete CSP directive "block-all-mixed-content" and avoid a console
warning in Firefox.

Tests:

- Load a page and notice in the browser developer tools that the three headers
referrer-policy, content-security-policy, and x-content-type-options are set as
before.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-17 13:02:52 -05:00
Dietmar
3eef1d9324
Translated using Weblate (Italian)
Currently translated at 47.5% (891 of 1875 strings)
2025-11-13 13:51:19 +00:00
Dietmar
7d38f49dd8
Translated using Weblate (German)
Currently translated at 98.9% (1856 of 1875 strings)
2025-11-13 13:51:16 +00:00
Besnik Bleta
601de6d0e3
Translated using Weblate (Albanian)
Currently translated at 99.7% (1871 of 1875 strings)
2025-11-12 07:51:36 +00:00
Максим Горпиніч
cdfdacabad
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1875 of 1875 strings)
2025-11-12 07:51:34 +00:00
Jiří Podhorecký
d4c4900b1d
Translated using Weblate (Czech)
Currently translated at 100.0% (1875 of 1875 strings)
2025-11-12 07:51:22 +00:00
大王叫我来巡山
8f87d658a6
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 61.5% (1154 of 1875 strings)
2025-11-12 07:51:19 +00:00
Burak Yavuz
117932e66f
Translated using Weblate (Turkish)
Currently translated at 100.0% (1875 of 1875 strings)
2025-11-12 07:51:17 +00:00
James Valleroy
91de3e6e3b
Release v25.15 to unstable 2025-11-10 20:49:27 -05:00
James Valleroy
b98e156bfe
doc: Fetch latest manual 2025-11-10 20:48:34 -05:00
James Valleroy
d7bdc73fb3
locale: Update translation strings 2025-11-10 20:21:09 -05:00
Dietmar
56762409d2
Translated using Weblate (Italian)
Currently translated at 47.3% (890 of 1879 strings)
2025-11-11 02:13:37 +01:00
Dietmar
9a8ddf326b
Translated using Weblate (German)
Currently translated at 99.0% (1861 of 1879 strings)
2025-11-11 02:13:37 +01:00
Sunil Mohan Adapa
743b7bd163
ttrss: Remove app not available in Trixie
Tests:

- Running 'make build install' remove the module loading include file for ttrss.

- TT-RSS is no longer available in apps page.

- Installing Tor works. Onion header is set correctly. Re-running app setup
works.

- RSS Bridge's description is updated as expected. Links work.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-10 19:20:33 -05:00
Sunil Mohan Adapa
76b360bb68
matrixsynapse: Explicitly set the trusted key server to matrix.org
The following message is shown when Matrix Synapse server is started.

"""
This server is configured to use 'matrix.org' as its trusted key server via the
'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
server since it is long-lived, stable and trusted. However, some admins may
wish to use another server for this purpose.

To suppress this warning and continue using 'matrix.org', admins should set
'suppress_key_server_warning' to 'true' in homeserver.yaml.
"""

Explicitly configure the server to use matrix.org as the trusted key server to
avoid the warning. The value can be set to empty list of servers, however, our
users are served best by this default.

Tests:

- On a testing container, when patch is applied after Matrix app installation,
the configuration file is updated.

- After the configuration is updated the warning is removed during Matrix
Synapse startup.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-10 18:54:46 -05:00
Sunil Mohan Adapa
084c9c5a47
matrixsynapse: Explain federation and link to testing tool
- Create a separate section for federation as it is so important.

Tests:

- Federation description and TLS warning are shown in a separate section on the
app's post-setup page.

- Clicking on the testing tool link takes the user to the testing tool and the
current server's domain is automatically tested.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-10 18:54:41 -05:00
Sunil Mohan Adapa
35cedd7923
matrixsynapse: Clarify how to change domain name in status section
- This has already been update in the pre-setup page.

Tests:

- View the post-setup page and notice that the message was updated.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-11-10 18:54:38 -05:00
Sunil Mohan Adapa
a74028a73f
help: Fix serving images from help pages
Tests:

- Images are shown in the pages /plinth/help/manual/en/bepasty and
/plinth/help/manual/en/. Before the patch, images are not shown and 404 errors
are raised.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Joseph Nuthalapati <njoseph@riseup.net>
2025-11-06 20:03:04 +05:30
Sunil Mohan Adapa
d5062ef5ea
README: Use the Weblate's language chart widget
- This shows status of each language rather than just a single number for all
the languages. This hopefully highlights languages needing more work.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
2025-11-03 13:58:50 +02:00
Sunil Mohan Adapa
24d2d92ab5
Run service using systemd even for development
- This means that systemd sandbox will be in effect even during development. We
won't miss out on bugs in sandbox configuration.

- We won't have disable systemd sandbox features just because we can test
properly on development setup. Such as JoinsNamespaceOf=.

- This also leads to significant reduction in hacky code for setting up for
development and functional tests.

- One disadvantage is that first setup is run before user gets a chance to
interact with the started container/VM. However, this is okay since first setup
can be re-run easily by removing the /var/lib/plinth/plinth.sqlite3 file and
also the need for doing this is rare.

Tests:

- Start a fresh container and run functional tests with './container run-tests'
on it. The tests run as expected (succeed or fail).

- While first setup is in progress, running the command 'make
wait-while-first-setup' waits while printing dots. After the first setup is
done, it exists.

- Running the command freedombox-logs shows FreedomBox logs for both the web and
privileged services.

- Changing a source code file in the /freedombox directory (or on the host)
leads to a restart of the Plinth web service.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
2025-11-03 13:54:00 +02:00
Sunil Mohan Adapa
e5026282fe
main: Allow setting development mode from environment
- Similar to freedombox-privileged daemon. It makes it easy to turn on
development mode from a systemd service override (without having to override the
entire command line).

Tests:

- With the changes to systemd service file in this patch series, changing source
code file leads to plinth getting restarted.

Reviewed-by: Veiko Aasa <veiko17@disroot.org>
2025-11-03 13:54:00 +02:00
Sunil Mohan Adapa
623604649e
views: Implement an API to retrieve the readiness status in JSON
- This can have may uses such as:

  - Waiting properly on the reboot page until the system has been restarted
  while showing the status.

  - Or, waiting for first setup to complete before running functional tests.

  - Or, monitoring for the health status of FreedomBox in general.

- The page is public as all the information conveyed there is also already
public. Should we introduce any sensitive information there such as
'operations_in_progress', we can provide that information only to
administrators.

Tests:

- Visiting /plinth/status/ shows the status in JSON. Using curl to retrieve the
information is also possible.

- During the first setup 'is_first_setup_running' is 'true'. After it has
completed, it is 'false'.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
2025-11-03 13:53:59 +02:00
Coucouf
8a4f03c58a
Translated using Weblate (French)
Currently translated at 100.0% (1879 of 1879 strings)
2025-10-30 04:24:25 +00:00
320 changed files with 32398 additions and 20372 deletions

View File

@ -16,7 +16,7 @@ RUN apt-get dist-upgrade -y
# Install freedombox package so that plint:plinth user/group are created etc.
RUN apt-get install -y freedombox/trixie-backports
RUN systemctl mask plinth.service
RUN systemctl disable plinth.service
# Don't ask for the secret in first wizard
RUN rm -f /var/lib/plinth/firstboot-wizard-secret

View File

@ -16,8 +16,7 @@
- apt-get update
- apt-get -y install make
- make provision-dev
- sudo -u plinth ./run --develop > plinth.log 2>&1 &
- while ! grep -q "Setup finished" plinth.log; do sleep 1; echo -n .; done
- make wait-while-first-setup
script:
- FREDOMBOX_URL=https://localhost FREEDOMBOX_SSH_PORT=22 FREEDOMBOX_SAMBA_PORT=445 pytest -v --durations=10 --include-functional --splinter-headless --instafail --template=html1/index.html --report=functional-tests.html
artifacts:

View File

@ -1,16 +0,0 @@
#!/usr/bin/python3
# -*- mode: python -*-
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Set required permissions for user "plinth" to run plinth in dev setup."""
import pathlib
content = '''
Cmnd_Alias FREEDOMBOX_ACTION_DEV = /usr/share/plinth/actions/actions, /freedombox/actions/actions
Defaults!FREEDOMBOX_ACTION_DEV closefrom_override
plinth ALL=(ALL:ALL) NOPASSWD:SETENV : FREEDOMBOX_ACTION_DEV
fbx ALL=(ALL:ALL) NOPASSWD : ALL
'''
sudoers_file = pathlib.Path('/etc/sudoers.d/01-freedombox-development')
sudoers_file.write_text(content)

View File

@ -66,7 +66,7 @@ development environment inside a systemd-nspawn container.
folder: (This step requires at least 16GB of free disk space)
```bash
host$ ./container up
host$ ./container start
```
1. To run unit tests:
@ -97,20 +97,20 @@ development environment inside a systemd-nspawn container.
1. Using an environment variable.
```bash
host$ DISTRIBUTION=stable ./container up
host$ DISTRIBUTION=stable ./container start
host$ DISTRIBUTION=stable ./container ssh
```
```bash
host$ export DISTRIBUTION=stable
host$ ./container up
host$ ./container start
host$ ./container ssh
```
2. Using the `--distribution` option for each command.
```bash
host$ ./container up --distribution=stable
host$ ./container start --distribution=stable
host$ ./container ssh --distribution=stable
```
@ -131,7 +131,7 @@ used simultaneously as they all use different disk images.
example, to bring up a virtual machine instead of a container run:
```bash
host$ ./container up --machine-type=vm
host$ ./container start --machine-type=vm
```
#### Using after Setup
@ -143,12 +143,12 @@ directory:
guest$ cd /freedombox
```
Run the development version of FreedomBox Service in the container using the
following command. This command continuously deploys your code changes into the
container providing a quick feedback cycle during development.
FreedomBox Service runs as plinth.service in the container. This service
restarts when it detects a change to the source code file. This provides a quick
feedback cycle during development. To watch service logs run:
```bash
guest$ freedombox-develop
guest$ sudo freedombox-logs
```
If you have changed any system configuration files during your development,
@ -156,16 +156,17 @@ you will need to run the following to install those files properly on to the
system and their changes to reflect properly.
```bash
guest$ sudo make build install
guest$ sudo make build install ;
guest$ sudo systemctl restart plinth.service
```
Note: This development container has automatic upgrades disabled by default.
#### Troubleshooting
* Sometimes `host$ ./container destroy && ./container up` doesn't work. In such
* Sometimes `host$ ./container destroy && ./container start` doesn't work. In such
cases, try to delete the hidden `.container` folder and then `host$
./container up`.
./container start`.
* Not all kinds of changes are automatically updated. Try `guest$ sudo mount -o
remount /freedombox`.
* I am getting an error that says `lo` is not managed by Network Manager
@ -177,7 +178,7 @@ Note: This development container has automatic upgrades disabled by default.
```bash
host$ sudo touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
host$ sudo service network-manager restart
host$ ./container destroy && ./container up
host$ ./container destroy && ./container start
```
* File/directory not found errors when running tests can be fixed by clearing `__pycache__` directories.
@ -373,13 +374,12 @@ After logging into the virtual machine (VM), the source code is available in
vm$ cd /freedombox
```
Run the development version of FreedomBox Service (Plinth) from your source
directory in the virtual machine using the following command. This command
continuously deploys your code changes into the virtual machine providing a
quick feedback cycle during development.
FreedomBox Service runs as plinth.service in the virtual machine. This service
restarts when it detects a change to the source code file. This provides a quick
feedback cycle during development. To watch service logs run:
```bash
vm$ freedombox-develop
vm$ sudo freedombox-logs
```
If you have changed any system configuration files during your development,
@ -416,7 +416,7 @@ for more details.
### Translating literals (contributing translations)
The easiest way to start translating is with your browser, by using
[Weblate](https://hosted.weblate.org/projects/freedombox/plinth/).
[Weblate](https://hosted.weblate.org/projects/freedombox/freedombox/).
Your changes will automatically get pushed to the code repository.
Alternatively, you can directly edit the `.po` file in your language directory

View File

@ -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.

View File

@ -20,7 +20,9 @@ DISABLED_APPS_TO_REMOVE := \
repro \
tahoe \
mldonkey \
i2p
i2p \
ttrss \
sso
APP_FILES_TO_REMOVE := $(foreach app,$(DISABLED_APPS_TO_REMOVE),$(ENABLED_APPS_PATH)/$(app))
@ -100,11 +102,12 @@ install:
$(INSTALL) -d $(DESTDIR)$${lib_dir} && \
rm -rf $(DESTDIR)$${lib_dir}/plinth $(DESTDIR)$${lib_dir}/plinth*.dist-info && \
mv $${temp}/plinth $${temp}/plinth*.dist-info $(DESTDIR)$${lib_dir} && \
rm -f $(DESTDIR)$${lib_dir}/plinth*.dist-info/COPYING.md && \
rm -f $(DESTDIR)$${lib_dir}/plinth*.dist-info/licenses/COPYING.md && \
rm -f $(DESTDIR)$${lib_dir}/plinth*.dist-info/direct_url.json && \
$(INSTALL) -D -t $(BIN_DIR) bin/plinth
$(INSTALL) -D -t $(LIB_DIR)/freedombox bin/freedombox-privileged
$(INSTALL) -D -t $(BIN_DIR) bin/freedombox-cmd
$(INSTALL) -D -t $(BIN_DIR) bin/freedombox-change-password
# Static web server files
rm -rf $(STATIC_FILES_DIRECTORY)
@ -161,6 +164,16 @@ Environment=PYTHONPATH=/freedombox/
endef
export DEVELOP_SERVICE_CONF
define DEVELOP_LOGS_SCRIPT
#!/usr/bin/bash
set -e
set -x
journalctl --follow --unit=plinth.service --unit=freedombox-privileged.service
endef
export DEVELOP_LOGS_SCRIPT
# Run basic setup for a developer environment (VM or container)
provision-dev:
# Install newer build dependencies if any
@ -170,9 +183,15 @@ provision-dev:
# Install latest code over .deb
$(MAKE) build install
# Configure privileged daemon for development setup
# Configure privileged and web daemon for development setup
mkdir -p /etc/systemd/system/freedombox-privileged.service.d/
echo "$$DEVELOP_SERVICE_CONF" > /etc/systemd/system/freedombox-privileged.service.d/develop.conf
mkdir -p /etc/systemd/system/plinth.service.d/
echo "$$DEVELOP_SERVICE_CONF" > /etc/systemd/system/plinth.service.d/develop.conf
# Create a command to easily watch service logs
echo "$$DEVELOP_LOGS_SCRIPT" > /usr/bin/freedombox-logs
chmod 755 /usr/bin/freedombox-logs
# Reload newer systemd units, ignore failure
-systemctl daemon-reload
@ -183,6 +202,10 @@ provision-dev:
-test -d /run/systemd/system && \
systemctl enable --now freedombox-privileged.socket
# Enable and restart plinth service if it is running
-systemctl enable plinth.service
-systemctl restart plinth.service
# Stop any ongoing upgrade, ignore failure
-killall -9 unattended-upgr
@ -207,6 +230,12 @@ provision-dev:
DEBIAN_FRONTEND=noninteractive apt-get install --yes ncurses-term \
sshpass bash-completion
wait-while-first-setup:
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
.PHONY: \
build \
check \
@ -219,4 +248,5 @@ provision-dev:
configure \
install \
provision \
update-translations
update-translations \
wait-while-first-setup

View File

@ -62,7 +62,7 @@ See the [HACKING.md](https://salsa.debian.org/freedombox-team/freedombox/blob/ma
# Localization
[![Translation status](https://hosted.weblate.org/widgets/freedombox/-/287x66-white.png)](https://hosted.weblate.org/engage/freedombox/?utm_source=widget)
[![Translation status](https://hosted.weblate.org/widget/freedombox/horizontal-auto.svg)](https://hosted.weblate.org/engage/freedombox/)
# License

24
Vagrantfile vendored
View File

@ -6,13 +6,13 @@ require 'etc'
Vagrant.configure(2) do |config|
config.vm.box = "freedombox/freedombox-testing-dev"
config.vm.network "forwarded_port", guest: 443, host: 4430
config.vm.network "forwarded_port", guest: 445, host: 4450
config.vm.network "public_network"
config.vm.synced_folder ".", "/freedombox", owner: "plinth", group: "plinth"
config.vm.provider "virtualbox" do |vb|
vb.cpus = Etc.nprocessors
vb.memory = 2048
vb.linked_clone = true
vb.customize ["modifyvm", :id, "--firmware", "efi"]
end
config.vm.provision "shell", run: 'always', inline: <<-SHELL
# Disable automatic upgrades
@ -24,24 +24,18 @@ Vagrant.configure(2) do |config|
config.vm.provision "shell", inline: <<-SHELL
cd /freedombox/
make provision-dev
echo 'alias freedombox-develop="cd /freedombox; sudo -u plinth /freedombox/run --develop"' >> /home/vagrant/.bashrc
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. You can run the development version of Plinth using
the following command.
for development. To get the IP address:
$ vagrant ssh
$ freedombox-develop
Plinth will be available at https://localhost:4430/plinth (with
an invalid SSL certificate).
$ ip address show
FreedomBox interface will be available at https://<ip address>/freedombox
(with an invalid SSL certificate). To watch logs:
$ vagrant ssh
$ sudo freedombox-logs
"
config.trigger.after [:up, :resume, :reload] do |trigger|
trigger.info = "Set plinth user permissions for development environment"
trigger.run_remote = {
path: ".vagrant-scripts/plinth-user-permissions.py"
}
end
config.vm.boot_timeout=1200
end

61
bin/freedombox-change-password Executable file
View File

@ -0,0 +1,61 @@
#!/usr/bin/python3
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Utility to change user password in FreedomBox's Django database.
Usage:
$ freedombox-change-password <username>
"""
import argparse
import getpass
import sys
import plinth.web_framework
from plinth.modules.users import privileged
def main():
"""Ask for new password, setup Django and update a user's password."""
try:
plinth.web_framework.init()
except Exception:
_print('Error initializing Django.')
return
parser = argparse.ArgumentParser()
parser.add_argument('username',
help='Username of the account to change password for')
args = parser.parse_args()
username = args.username
password = getpass.getpass('Enter new password: ')
try:
_change_password(username, password)
privileged._set_user_password(username, password)
privileged._set_samba_user(username, password)
_print('Password updated in web interface, LDAP, and samba databases.')
except Exception as exception:
_print('Error setting password:', str(exception))
def _print(*args, **kwargs):
"""Write to stderr."""
print(*args, **kwargs, file=sys.stderr)
def _change_password(username: str, password: str):
"""Update the password in SQLite database file."""
from django.contrib.auth.models import User
try:
user = User.objects.get(username=username)
user.set_password(password)
user.save()
except User.DoesNotExist:
_print('User account does not exist:', username)
raise
if __name__ == '__main__':
main()

View File

@ -196,9 +196,6 @@ cd /freedombox/
sudo apt-get -y install make
sudo make provision-dev
echo 'alias freedombox-develop="cd /freedombox; sudo -u plinth /freedombox/run --develop"' \
>> /home/fbx/.bashrc
# Make some pytest related files and directories writable to the fbx user
sudo touch geckodriver.log
sudo chmod a+rw geckodriver.log
@ -230,6 +227,7 @@ fi
echo "> In machine: Upgrade packages"
apt-get update
apt-mark hold freedombox freedombox-doc-en freedombox-doc-es
DEBIAN_FRONTEND=noninteractive apt-get -yq --with-new-pkgs upgrade
# Install requirements for tests if not already installed as root
@ -241,25 +239,7 @@ fi
# Run the plinth server if functional tests are requested
if [[ "{pytest_command}" =~ "--include-functional" ]]
then
is_plinth_running=0
ps -ax -o cmd | grep -q "^sudo -u plinth /freedombox/run" && \
is_plinth_running=1
ps -ax -o cmd | grep -q "^/usr/bin/python3 /usr/bin/plinth" && \
is_plinth_running=1
if [[ $is_plinth_running -eq 1 ]]
then
echo "> In machine: Plinth is already running"
else
echo -n "> In machine: Starting plinth ... "
sudo -u plinth /freedombox/run --develop > plinth.log 2>&1 &
while ! grep -q "Setup finished" plinth.log
do
sleep 1
echo -n .
done
echo
fi
make -C /freedombox wait-while-first-setup
if [[ "{pytest_command}" != *"--splinter-headless"* ]]
then
@ -495,9 +475,10 @@ def parse_arguments() -> argparse.Namespace:
help='Type of the machine, container to virtual machine, to run '
'operation on')
# Up
subparser = subparsers.add_parser('up', help='Bring up the container',
formatter_class=formatter_class)
# Start
subparser = subparsers.add_parser('start', help='Bring up the container',
formatter_class=formatter_class,
aliases=['up'])
_add_common_args(subparser)
subparser.add_argument('--image-size', default='16G',
help='Disk image size to resize to after download')
@ -526,7 +507,8 @@ def parse_arguments() -> argparse.Namespace:
# Stop
subparser = subparsers.add_parser('stop', help='Stop the container',
formatter_class=formatter_class)
formatter_class=formatter_class,
aliases=['down'])
_add_common_args(subparser)
# Destroy
@ -1074,7 +1056,7 @@ Folder overlay : (host, read-only){project_folder}
SSH easily : {script} ssh {options}
Run tests : {script} run-tests {options} [ --pytest-args ... ]
Run FreedomBox inside : freedombox-develop
Watch FreedomBox logs : sudo freedombox-logs
Web access : https://{ip_address}/
Ports access : Any port on {ip_address}
@ -1083,7 +1065,7 @@ Terminal login : sudo machinectl login fbx-{distribution}
Open a root shell : sudo machinectl shell fbx-{distribution}
Shutdown : {script} stop {options}
Destroy : {script} destroy {options}
Reset : {script} destroy {options}; {script} up {options}'''
Reset : {script} destroy {options}; {script} start {options}'''
logger.info(message)
@ -1480,7 +1462,7 @@ class VM(Machine):
qcow_image.unlink(missing_ok=True)
def subcommand_up(arguments: argparse.Namespace):
def subcommand_start(arguments: argparse.Namespace):
"""Download, setup and bring up the container."""
machine = Machine.get_instance(arguments.machine_type,
arguments.distribution)
@ -1584,7 +1566,13 @@ def main():
logging.basicConfig(level='INFO', format='> %(message)s')
arguments = parse_arguments()
subcommand = arguments.subcommand.replace('-', '_')
aliases = {
'up': 'start',
'down': 'stop',
}
subcommand: str = arguments.subcommand.replace('-', '_')
subcommand = aliases.get(subcommand, subcommand)
subcommand_method = globals()['subcommand_' + subcommand]
subcommand_method(arguments)

View File

@ -12,6 +12,7 @@
# Don't redirect for onion sites as it is not needed and leads to
# unnecessary warning.
RewriteCond %{HTTP_HOST} !^.*\.onion$ [NC]
RewriteCond %{REQUEST_URI} !^/freedombox/apache/discover-idp/$ [NC]
ReWriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</LocationMatch>

View File

@ -39,58 +39,16 @@
</If>
##
## 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.
##
<IfFile !/etc/apache2/conf-enabled/freedombox-apache-homepage.conf>
RedirectMatch "^/$" "/plinth"
RedirectMatch "^/$" "/freedombox"
</IfFile>
##
## Disable sending Referer (sic) header from FreedomBox web interface to
## external websites. This improves privacy by not disclosing FreedomBox
## domains/URLs to external domains. Apps such as blogs which want to popularize
## themselves with referrer header may still do so.
##
## A strict Content Security Policy.
## - @fonts are allowed only from FreedomBox itself.
## - <frame>/<iframe> sources are disabled.
## - <img> sources are allowed only from FreedomBox itself.
## - Manifest file is not allowed as there is none yet.
## - <audio>, <video>, <track> tags are not allowed yet.
## - <object>, <embed>, <applet> tags are not allowed yet.
## - Allow JS from FreedomBox itself (no inline and attribute scripts).
## - Allow inline CSS and CSS files from Freedombox itself.
## - Web worker sources are allowed only from FreedomBox itself (for JSXC).
## - All other fetch sources including Ajax are not allowed from FreedomBox
## itself.
## - <base> tag is not allowed.
## - No plugins types are alllowed since object-src is 'none'.
## - Form action should be to FreedomBox itself.
## - This interface may be not embedded in <frame>, <iframe>, etc. tags.
## - When serving HTTPS, don't allow HTTP assets.
##
## Enable strict sandboxing enabled with some exceptions:
## - Allow running Javascript.
## - Allow popups as sometimes we use <a target=_blank>
## - Allow popups to have different sandbox requirements as we launch apps' web
## clients.
## - Allow forms to support configuration forms.
## - Allow policies to treat same origin differently from other origins
## - Allow downloads such as backup tarballs.
##
## Disable browser guessing of MIME types. FreedoBox already sets good content
## types for all the common file types.
##
<LocationMatch "^/(plinth|freedombox)">
Header set Referrer-Policy 'same-origin'
Header set Content-Security-Policy "font-src 'self'; frame-src 'none'; img-src 'self' data:; manifest-src 'none'; media-src 'none'; object-src 'none'; script-src 'self'; style-src 'self'; worker-src 'self'; default-src 'self'; base-uri 'none'; sandbox allow-scripts allow-popups allow-popups-to-escape-sandbox allow-forms allow-same-origin allow-downloads; form-action 'self'; frame-ancestors 'none'; block-all-mixed-content;"
Header set X-Content-Type-Options 'nosniff'
</LocationMatch>
##
## 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
@ -98,7 +56,8 @@
## mod_proxy_http
##
<Location /freedombox>
ProxyPass http://127.0.0.1:8000/plinth
ProxyPass http://127.0.0.1:8000/freedombox
ProxyPreserveHost On
## 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
@ -112,7 +71,20 @@
RequestHeader unset X-Forwarded-For
</Location>
<Location /plinth>
ProxyPass http://127.0.0.1:8000/plinth
ProxyPass http://127.0.0.1:8000/freedombox
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS
RequestHeader unset X-Forwarded-For
</Location>
<Location /.well-known/openid-configuration>
ProxyPass http://127.0.0.1:8000/freedombox/o/.well-known/openid-configuration
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS
RequestHeader unset X-Forwarded-For
</Location>
<Location /.well-known/jwks.json>
ProxyPass http://127.0.0.1:8000/freedombox/o/.well-known/jwks.json
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS
RequestHeader unset X-Forwarded-For
</Location>
@ -124,7 +96,7 @@
<Location ~ ^/favicon\.ico$>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule /favicon\.ico$ "/plinth/static/theme/img/favicon.ico" [PT]
RewriteRule /favicon\.ico$ "/freedombox/static/theme/img/favicon.ico" [PT]
</IfModule>
</Location>

435
debian/changelog vendored
View File

@ -1,3 +1,438 @@
freedombox (26.4.2) unstable; urgency=medium
[ Jiří Podhorecký ]
* Translated using Weblate (Czech)
[ OwlGale ]
* Translated using Weblate (Russian)
-- James Valleroy <jvalleroy@mailbox.org> Sun, 08 Mar 2026 15:27:13 -0400
freedombox (26.4.1) unstable; urgency=high
[ 大王叫我来巡山 ]
* Translated using Weblate (Chinese (Simplified Han script))
[ Besnik Bleta ]
* Translated using Weblate (Albanian)
[ Burak Yavuz ]
* Translated using Weblate (Turkish)
[ Jiří Podhorecký ]
* Translated using Weblate (Czech)
[ James Valleroy ]
* container: Hold freedombox packages during test setup
* Vagrantfile: Enable public network for bridged networking
* doc: Fetch latest manual
[ Sunil Mohan Adapa ]
* d/control: Trim deps for nocheck build profile (Closes: #1129521)
* apache2: Disable pubtkt authentication module
-- James Valleroy <jvalleroy@mailbox.org> Sun, 08 Mar 2026 15:09:38 -0400
freedombox (26.4) unstable; urgency=medium
[ Joseph Nuthalapati ]
* ui: Dismiss notifications without page reload
[ Sunil Mohan Adapa ]
* ui: Refactor notification delete buttons to avoid repeating code
* ui: Add animation for notification dismissal
* actions, privileged_daemon: Drop some unused global statements
* backups: Avoid some repeated text in form help text
* backups: Fix issue with Javascript in add remote location form
* backups: Show/hide form elements instead of disabling for simplicity
* backups: Tweak appearance of add remote location form
* backups: tests: Simplify functional test using more classes
* backups: Minor refactoring
* backups: Simplify handling of migration to SSH keys
* backups: Create .ssh folder before creating SSH key
* backups: Fix showing proper error for incorrect passphrase
* backups: Create a better comment in the generated SSH key file
* backups: Fix type checking errors
* action_utils: Implement utility to change umask temporarily
* quassel: Explicitly set permissions on the domain configuration file
* letsencrypt: When copying certificate reset the umask reliably
* doc/dev: Set new theme for developer documentation
* action_utils: Fix issue with type checking a generator
* tests: functional: Increase systemd rate limits for starting units
* js: When page load fails during install, show it to user
* tests: functional: Fix reloading error page during install/uninstall
* locale/de: Fix several translations with HTML links (German)
* locale/bg: Fix several translations with HTML links (Bulgarian)
* bin: Add tool to change FreedomBox password in Django database
* ejabberd: Fix setting up certificates for multiple domains
* gitweb: Fix issue with running post init due to missing method
* wireguard: Fix format when showing multiple endpoints of the server
* wireguard: Fix showing default route setting in server edit form
* wireguard: Show status of default route in server information page
* wireguard: Accept/use netmask with IP address for server connection
* README/HACKING: Update weblate project path to /freedombox
* *: Remove some absolute file paths in SVGs
* matrixsynapse: Update apache config to proxy Synapse client API
* cfg: Drop unused config_dir option
* cfg: Drop unused actions_dir option
* Vagrantfile: Drop unnecessary sudo configuration for actions
* pyproject: Use new format to specify licenses
* action_utils: Drop support for link-local IPv6 addresses
* debian: Ensure that gbp creates a clean tarball prior to build
* syncthing: tests: Fix tests by allowing rapid restarts
* web_server: Log requests to WSGI app
* *: Update URL base from /plinth to /freedombox
* tests: functional: Fix expecting FreedomBox to be home page
* web_framework: Allow FreedomBox apps to override templates
* templates: Allow building pages without navigation bar and footer
* apache: Preserve host header when proxying to service
* oidc: New app to implement OpenID Connect Provider
* oidc: Style the page for authorizing an OIDC app
* apache: Implement protecting apps using OpenID Connect
* featherwiki: Use OpenID Connect instead of pubtkt based SSO
* syncthing: Use OpenID Connect instead of pubtkt based SSO
* searx: Use OpenID Connect instead of pubtkt based SSO
* rssbridge: Use OpenID Connect instead of pubtkt based SSO
* email: Use OpenID Connect instead of pubtkt based SSO
* calibre: Use OpenID Connect instead of pubtkt based SSO
* deluge: Use OpenID Connect instead of pubtkt based SSO
* gitweb: Use OpenID Connect instead of pubtkt based SSO
* tiddlywiki: Use OpenID Connect instead of pubtkt based SSO
* wordpress: Use OpenID Connect instead of pubtkt based SSO when private
* transmission: Use OpenID Connect instead of pubtkt based SSO
* doc/dev: Use OpenID Connect instead of pubtkt based SSO
* sharing: Use OpenID Connect instead of pubtkt based SSO
* sso: Merge into users module, drop pubtkt related code
* apache: Fix diagnosing URLs protected by OpenID Connect
[ 大王叫我来巡山 ]
* Translated using Weblate (Chinese (Simplified Han script))
[ Burak Yavuz ]
* Translated using Weblate (Turkish)
[ Coucouf ]
* Translated using Weblate (French)
* Translated using Weblate (French)
[ Besnik Bleta ]
* Translated using Weblate (Albanian)
[ Dietmar ]
* Translated using Weblate (German)
[ James Valleroy ]
* backups: Generate SSH client key if needed
* backups: Display SSH public key when adding remote
* backups: Copy SSH client public key to remote
* backups: Use SSH key instead of password
* backups: Use selected SSH credential for remote
* backups: Test adding/removing remote location
* backups: Arrange form for adding remote location
* backups: Migrate to SSH key auth when mounting
* Translated using Weblate (Greek)
* mumble: murmurd renamed to mumble-server
* Translated using Weblate (Tamil)
* locale: Update translation strings
* doc: Fetch latest manual
* apache: Fix check_url test
[ Frederico Gomes ]
* container: Align terminology in printed banner
* wireguard: filter .local addresses from showClient view
* wireguard: improved server section UX flow
* wireguard: show server vpn ip in show client page
* wireguard: Fix split tunneling
* miniflux: Revert workaround for a packaging bug with DB connection
* db: Create a utility to get credentials from dbconfig
* miniflux: Get credentials from dbconfig-common directly
[ Pierfrancesco Passerini ]
* Translated using Weblate (Italian)
[ Daniel Wiik ]
* Translated using Weblate (Swedish)
* Translated using Weblate (Swedish)
[ kosagi ]
* Translated using Weblate (Catalan)
[ Jiří Podhorecký ]
* Translated using Weblate (Czech)
[ Isak ]
* Translated using Weblate (Swedish)
[ Βασίλης Χατζηκαμάρης ]
* Translated using Weblate (Greek)
[ Benedek Nagy ]
* doc/dev: always have an up-to-date copyright year
[ தமிழ்நேரம் ]
* Translated using Weblate (Tamil)
-- James Valleroy <jvalleroy@mailbox.org> Mon, 02 Mar 2026 21:35:46 -0500
freedombox (26.3) unstable; urgency=medium
[ Frederico Gomes ]
* wireguard: Add 'Start Server' button
* docs: Update container script usage
* wireguard: Show next available client IP in Add Client form
* wireguard: Show server endpoint on main app page
[ James Valleroy ]
* wireguard: Update functional tests to handle Start Server button
* lintian: Remove mismatched overrides
* Makefile: Fix removing extra license file
* debian: Follows policy 4.7.3
* debian: Remove default Rules-Requires-Root
* debian: Remove preinst script
* debian: Update copyright years
* locale: Update translation strings
* doc: Fetch latest manual
[ Ettore Atalan ]
* Translated using Weblate (German)
[ Sunil Mohan Adapa ]
* debian: Ignore lintian warning: service file missing Install section
* wireguard: Remove NM connections when app is uninstalled
* ui: Use HTMX to update notifications on partial page updates
[ Joseph Nuthalapati ]
* ui: Add HTMX as a dependency
* ui: Use HTMX to eliminate full page reloads
[ Burak Yavuz ]
* Translated using Weblate (Turkish)
[ Pierfrancesco Passerini ]
* Translated using Weblate (Italian)
[ 大王叫我来巡山 ]
* Translated using Weblate (Chinese (Simplified Han script))
-- James Valleroy <jvalleroy@mailbox.org> Mon, 02 Feb 2026 20:41:30 -0500
freedombox (26.2) unstable; urgency=medium
[ Pierfrancesco Passerini ]
* Translated using Weblate (Italian)
[ Priit Jõerüüt ]
* Translated using Weblate (Estonian)
[ Joseph Nuthalapati ]
* notifications: Close dropdown when clicking outside
* gitweb: Fix deleting last repo disables app
[ James Valleroy ]
* doc: Fetch latest manual
-- James Valleroy <jvalleroy@mailbox.org> Tue, 20 Jan 2026 20:26:42 -0500
freedombox (26.1) unstable; urgency=medium
[ Besnik Bleta ]
* Translated using Weblate (Albanian)
[ 109247019824 ]
* Translated using Weblate (Bulgarian)
[ Максим Горпиніч ]
* Translated using Weblate (Ukrainian)
[ Burak Yavuz ]
* Translated using Weblate (Turkish)
[ Priit Jõerüüt ]
* Translated using Weblate (Estonian)
[ Jiří Podhorecký ]
* Translated using Weblate (Czech)
[ OwlGale ]
* Translated using Weblate (Russian)
[ Roman Akimov ]
* Translated using Weblate (Russian)
[ Dietmar ]
* Translated using Weblate (German)
* Translated using Weblate (Italian)
[ Coucouf ]
* Translated using Weblate (French)
[ Ettore Atalan ]
* Translated using Weblate (German)
[ 大王叫我来巡山 ]
* Translated using Weblate (Chinese (Simplified Han script))
[ Pierfrancesco Passerini ]
* Translated using Weblate (Italian)
[ Joseph Nuthalapati ]
* container: Add aliases for start/stop commands
-- James Valleroy <jvalleroy@mailbox.org> Mon, 05 Jan 2026 20:09:02 -0500
freedombox (25.17.1) unstable; urgency=medium
[ James Valleroy ]
* vagrant: Enable EFI firmware
* locale: Update translation strings
* doc: Fetch latest manual
[ Burak Yavuz ]
* Translated using Weblate (Turkish)
[ Besnik Bleta ]
* Translated using Weblate (Albanian)
[ Максим Горпиніч ]
* Translated using Weblate (Ukrainian)
[ 109247019824 ]
* Translated using Weblate (Bulgarian)
[ Jiří Podhorecký ]
* Translated using Weblate (Czech)
[ Benedek Nagy ]
* transmission: remove obsolete apache redirects
* minetest: Rename Minetest to Luanti
[ Priit Jõerüüt ]
* Translated using Weblate (Estonian)
[ OwlGale ]
* Translated using Weblate (Russian)
[ Diego Roversi ]
* Translated using Weblate (Italian)
[ Pierfrancesco Passerini ]
* Translated using Weblate (Italian)
[ Sunil Mohan Adapa ]
* minetest: Remove legacy code, use new name, conf, etc.
* transmission: Deal with changes in latest forky package
* backups: Set proper permissions for backups-data directory
[ bsurajpatra ]
* Translated using Weblate (Hindi)
-- James Valleroy <jvalleroy@mailbox.org> Mon, 15 Dec 2025 20:35:00 -0500
freedombox (25.17) unstable; urgency=medium
[ James Valleroy ]
* homeassistant: Fix spelling in tests
* locale: Update translation strings
* doc: Fetch latest manual
[ OwlGale ]
* Translated using Weblate (Russian)
[ kosagi ]
* Translated using Weblate (Catalan)
[ Coucouf ]
* Translated using Weblate (French)
[ Sunil Mohan Adapa ]
* ui: Implement a toggle menu for setting dark mode
* upgrades: Use bootstrap spinner button instead of custom styling
* ui: Use default button style for tag buttons
* ui: Fix dark theme color for form help text
* ui: Fix dark theme colors for default button style
* ui: Fix dark theme color for disabled form elements
* ui: Dark theme color for tags text in an app card
* ui: Drop colors defined in Bootstrap 5.3
* ui: Fix dark theme colors for running status indicator
* ui: Minor CSS refactor to use variables
* ui: Fix dark theme color for select-all button
* ui: Fix dark theme colors for app enable/disable toggle button
* privileged: Don't log exception that are expected
[ Priit Jõerüüt ]
* Translated using Weblate (Estonian)
[ Joseph Nuthalapati ]
* l10n: Fix python-brace-format error in Estonian
-- James Valleroy <jvalleroy@mailbox.org> Mon, 08 Dec 2025 20:50:56 -0500
freedombox (25.16) unstable; urgency=medium
[ Burak Yavuz ]
* Translated using Weblate (Turkish)
[ 大王叫我来巡山 ]
* Translated using Weblate (Chinese (Simplified Han script))
[ Jiří Podhorecký ]
* Translated using Weblate (Czech)
[ Максим Горпиніч ]
* Translated using Weblate (Ukrainian)
[ Besnik Bleta ]
* Translated using Weblate (Albanian)
[ Dietmar ]
* Translated using Weblate (German)
* Translated using Weblate (Italian)
[ Sunil Mohan Adapa ]
* middleware: Implement middleware for common headers such as CSP
* janus: Allow app to be installed from Debian unstable
* janus: Relax content security policy for the video room
* janus: Update the video room code from latest upstream
* package: Prevent freedombox's deps from removal during app uninstall
* dynamicdns: Use only IPv4 for GnuDIP protocol
* jsxc: Fix missing dependencies
* jsxc: Update content security policy to prevent style errors
[ Roman Akimov ]
* Translated using Weblate (Russian)
[ James Valleroy ]
* locale: Update translation strings
* doc: Fetch latest manual
-- James Valleroy <jvalleroy@mailbox.org> Mon, 24 Nov 2025 20:30:35 -0500
freedombox (25.15) unstable; urgency=medium
[ Coucouf ]
* Translated using Weblate (French)
[ Sunil Mohan Adapa ]
* views: Implement an API to retrieve the readiness status in JSON
* main: Allow setting development mode from environment
* Run service using systemd even for development
* README: Use the Weblate's language chart widget
* help: Fix serving images from help pages
* matrixsynapse: Clarify how to change domain name in status section
* matrixsynapse: Explain federation and link to testing tool
* matrixsynapse: Explicitly set the trusted key server to matrix.org
* ttrss: Remove app not available in Trixie
[ Dietmar ]
* Translated using Weblate (German)
* Translated using Weblate (Italian)
[ James Valleroy ]
* locale: Update translation strings
* doc: Fetch latest manual
-- James Valleroy <jvalleroy@mailbox.org> Mon, 10 Nov 2025 20:48:49 -0500
freedombox (25.14) unstable; urgency=medium
[ Coucouf ]

48
debian/control vendored
View File

@ -1,6 +1,5 @@
Source: freedombox
Section: web
Priority: optional
Maintainer: FreedomBox packaging team <freedombox-pkg-team@lists.alioth.debian.org>
Uploaders:
Tzafrir Cohen <tzafrir@debian.org>,
@ -15,52 +14,53 @@ Build-Depends:
dblatex,
dh-python,
docbook-xsl,
e2fsprogs,
e2fsprogs <!nocheck>,
gir1.2-nm-1.0,
libjs-bootstrap5,
libjs-bootstrap5 <!nocheck>,
libjs-htmx <!nocheck>,
# Older libjs-bootstrap5 does not have proper dependency on popper.js >= 2.0
node-popper2,
node-popper2 <!nocheck>,
pybuild-plugin-pyproject,
python3-all:any,
python3-apt,
python3-apt <!nocheck>,
python3-augeas,
python3-bootstrapform,
python3-bootstrapform <!nocheck>,
python3-build,
python3-cherrypy3,
python3-configobj,
python3-cryptography,
python3-configobj <!nocheck>,
python3-cryptography <!nocheck>,
python3-dbus,
python3-django,
python3-django-axes,
python3-django-captcha,
python3-django <!nocheck>,
python3-django-axes <!nocheck>,
python3-django-captcha <!nocheck>,
# Explictly depend on ipware as it is optional dependecy of django-axes
python3-django-ipware,
python3-django-stronghold,
python3-django-ipware <!nocheck>,
python3-django-oauth-toolkit <!nocheck>,
python3-django-stronghold <!nocheck>,
python3-gi,
python3-markupsafe,
python3-mypy,
python3-pampy,
python3-mypy <!nocheck>,
python3-pampy <!nocheck>,
python3-pexpect,
python3-pip,
python3-psutil,
python3-pytest,
python3-pytest-cov,
python3-pytest-django,
python3-pytest-runner,
python3-pytest <!nocheck>,
python3-pytest-cov <!nocheck>,
python3-pytest-django <!nocheck>,
python3-pytest-runner <!nocheck>,
python3-requests,
python3-ruamel.yaml,
python3-setuptools,
python3-systemd,
python3-typeshed,
python3-typeshed <!nocheck>,
python3-yaml,
sshpass,
sshpass <!nocheck>,
xmlto,
xsltproc
Standards-Version: 4.6.2
Standards-Version: 4.7.3
Homepage: https://salsa.debian.org/freedombox-team/freedombox
Vcs-Git: https://salsa.debian.org/freedombox-team/freedombox.git
Vcs-Browser: https://salsa.debian.org/freedombox-team/freedombox
Rules-Requires-Root: no
Package: freedombox
Breaks:
@ -89,6 +89,7 @@ Depends:
# For gdbus used to call hooks into service
libglib2.0-bin,
libjs-bootstrap5,
libjs-htmx,
lsof,
netcat-openbsd,
network-manager,
@ -108,6 +109,7 @@ Depends:
python3-django-captcha,
# Explictly depend on ipware as it is optional dependecy of django-axes
python3-django-ipware,
python3-django-oauth-toolkit,
python3-django-stronghold,
python3-gi,
python3-markupsafe,

26
debian/copyright vendored
View File

@ -2,7 +2,7 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Source: https://salsa.debian.org/freedombox-team/freedombox
Files: *
Copyright: 2011-2025 FreedomBox Authors
Copyright: 2011-2026 FreedomBox Authors
License: AGPL-3+
Files: plinth/modules/jsxc/static/icons/jsxc.png
@ -38,6 +38,11 @@ Copyright: Marie Van den Broeck (https://thenounproject.com/marie49/)
Comment: https://thenounproject.com/icon/162372/
License: CC-BY-SA-3.0
Files: static/themes/default/js/color-modes.js
Copyright: 2011-2025 The Bootstrap Authors
Comment: https://getbootstrap.com/docs/5.3/customize/color-modes/
License: CC-BY-3.0
Files: plinth/modules/bepasty/static/icons/bepasty.svg
Copyright: (c) 2014 by the Bepasty Team, see the AUTHORS file.
Comment: https://github.com/bepasty/bepasty-server/blob/master/src/bepasty/static/app/bepasty.svg
@ -74,6 +79,7 @@ Files: plinth/modules/ejabberd/static/icons/ejabberd.png
plinth/modules/rssbridge/static/icons/rssbridge.svg
plinth/modules/zoph/static/icons/zoph.png
plinth/modules/zoph/static/icons/zoph.svg
static/themes/default/img/application.svg
static/themes/default/img/network-connection.svg
static/themes/default/img/network-connection-vertical.svg
static/themes/default/img/network-ethernet.svg
@ -143,7 +149,10 @@ License: ISC
Files: plinth/modules/janus/static/icons/janus.png
plinth/modules/janus/static/icons/janus.svg
Copyright: 2014-2022 Meetecho
plinth/modules/janus/static/janus-video-room.css
plinth/modules/janus/static/janus-video-room.js
plinth/modules/janus/templates/janus_video_room.html
Copyright: 2014-2025 Meetecho
License: GPL-3 with OpenSSL exception
Files: plinth/modules/kiwix/static/icons/kiwix.png
@ -175,7 +184,7 @@ License: CC-BY-SA-3.0
Files: plinth/modules/minetest/static/icons/minetest.svg
Copyright: 2015 Calinou, Nils Dagsson Moskopp
Comment: https://github.com/minetest/minetest/blob/master/misc/minetest.svg
Comment: https://github.com/luanti-org/luanti/blob/master/misc/luanti.svg
License: CC-BY-SA-3.0
Files: plinth/modules/miniflux/static/icons/miniflux.png
@ -318,15 +327,6 @@ Copyright: Transmission Authors
Comment: https://github.com/transmission/transmission/blob/master/gtk/icons/hicolor_apps_scalable_transmission.svg
License: GPL-3
Files: plinth/modules/ttrss/static/icons/ttrss.png
Copyright: Mark James <mjames@gmail.com>
License: CC-BY-3.0
Files: plinth/modules/ttrss/static/icons/ttrss.svg
Copyright: 2005 Andrew Dolgov
Comment: https://git.tt-rss.org/fox/tt-rss/src/master/images/favicon-72px.png
License: GPL-3+
Files: plinth/modules/upgrades/data/usr/share/augeas/lenses/aptsources.aug
plinth/modules/upgrades/data/usr/share/augeas/lenses/tests/test_aptsources.aug
Copyright: 2007-2025 David Lutterkort
@ -359,7 +359,7 @@ License: LGPL-3+ or CC-BY-SA-3.0
Files: debian/*
Copyright: 2013 Tzafrir Cohen
2013-2024 FreedomBox Authors
2013-2026 FreedomBox Authors
License: GPL-2+
License: AGPL-3+

View File

@ -24,3 +24,7 @@ freedombox: package-contains-documentation-outside-usr-share-doc [usr/lib/python
# meant for user. However, don't install to /usr/libexec and follow systemd
# convention instead.
freedombox: executable-in-usr-lib [usr/lib/freedombox/freedombox-privileged]
# [Install] section is missing for the privileged daemon service because it is
# socket activated.
freedombox: systemd-service-file-missing-install-key [usr/lib/systemd/system/freedombox-privileged.service]

View File

@ -1,43 +0,0 @@
#!/bin/sh
set -e
case "$1" in
upgrade)
# Handle removing freedombox-setup-repositories.timer from 20.5.
if dpkg --compare-versions "$2" le 20.7; then
if [ -x "/usr/bin/deb-systemd-invoke" ]; then
deb-systemd-invoke stop freedombox-setup-repositories.timer >/dev/null 2>/dev/null || true
fi
if [ -x "/usr/bin/deb-systemd-helper" ]; then
deb-systemd-helper purge freedombox-setup-repositories.timer >/dev/null || true
deb-systemd-helper unmask freedombox-setup-repositories.timer >/dev/null || true
fi
if [ -d /run/systemd/system ]; then
systemctl daemon-reload
fi
fi
# Handle removing freedombox-udiskie.service from 20.9.
if dpkg --compare-versions "$2" le 20.9; then
if [ -x "/usr/bin/deb-systemd-invoke" ]; then
deb-systemd-invoke stop freedombox-udiskie.service >/dev/null 2>/dev/null || true
fi
if [ -x "/usr/bin/deb-systemd-helper" ]; then
deb-systemd-helper purge freedombox-udiskie.service >/dev/null || true
deb-systemd-helper unmask freedombox-udiskie.service >/dev/null || true
fi
if [ -d /run/systemd/system ]; then
systemctl daemon-reload
fi
fi
;;
esac
#DEBHELPER#
exit 0

3
debian/gbp.conf vendored
View File

@ -1,6 +1,9 @@
[DEFAULT]
debian-branch = main
[buildpackage]
export-dir = ../build-area/
[dch]
git-log = --no-merges
multimaint-merge = True

View File

@ -5,7 +5,4 @@
very-long-line-length-in-source-file * [doc/manual/*.raw.wiki:*]
# Misc. files which can't be fixed to have short line lengths.
very-long-line-length-in-source-file * [plinth/modules/deluge/tests/data/sample.torrent:*]
very-long-line-length-in-source-file * [plinth/modules/transmission/tests/data/sample.torrent:*]
very-long-line-length-in-source-file * [doc/visual_design/FreedomBox-Logo.7z:*]
very-long-line-length-in-source-file * [COPYING.md:*]

View File

@ -19,6 +19,7 @@ Install the following Debian packages:
* python3-sphinx
* python3-sphinx-autobuild
* python3-sphinx-book-theme
* python3-django
* python3-django-axes
* python3-django-captcha

122
doc/dev/_static/logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,15 +0,0 @@
{%- extends "alabaster/layout.html" %}
{%- block footer %}
<div class="footer">
{% if show_copyright %}&copy;{{ copyright }} | {% endif %}
Licensed under the <a href="https://creativecommons.org/licenses/by-sa/4.0/">
CC BY-SA 4.0</a> license
{%- if show_source and has_source and sourcename %}
{% if show_copyright or theme_show_powered_by %}|{% endif %}
<a href="{{ pathto('_sources/' + sourcename, true)|e }}"
rel="nofollow">{{ _('Page source') }}</a>
{%- endif %}
</div>
{% endblock %}

View File

@ -15,6 +15,7 @@ list see the documentation: http://www.sphinx-doc.org/en/master/config
#
import os
import sys
from datetime import datetime
import django
@ -26,7 +27,7 @@ django.setup()
# pylint: disable=invalid-name
project = 'FreedomBox'
copyright = '2021-2025, FreedomBox Authors'
copyright = f'2021-{datetime.now().year}'
author = 'FreedomBox Authors'
# The short X.Y version
@ -82,15 +83,23 @@ pygments_style = None
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
html_theme = 'sphinx_book_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
html_theme_options = {
'fixed_sidebar': True,
'show_related': True,
'home_page_in_toc': True,
'repository_provider': 'gitlab',
'repository_url': 'https://salsa.debian.org/freedombox-team/freedombox/',
'use_edit_page_button': True,
'use_source_button': True,
'use_repository_button': True,
'use_issues_button': True,
'path_to_docs': 'doc/dev/',
'extra_footer': 'Licensed under the <a href="https://creativecommons.org/'
'licenses/by-sa/4.0/">CC BY-SA 4.0</a> license.',
}
# Add any paths that contain custom static files (such as style sheets) here,
@ -221,3 +230,4 @@ autodoc_mock_imports = [
]
html_favicon = './_static/favicon.ico'
html_logo = './_static/logo.svg'

View File

@ -291,10 +291,8 @@ file ``transmission-plinth.conf``, add the following.
<Location /transmission>
...
Include includes/freedombox-single-sign-on.conf
<IfModule mod_auth_pubtkt.c>
TKTAuthToken "admin" "bit-torrent"
</IfModule>
Use AuthOpenIDConnect
Use RequireGroup bit-torrent
</Location>
Showing a shortcut in the front page

View File

@ -2,7 +2,7 @@
{{attachment:apu1d.jpg|PC Engines APU 1D|width=632,height=319}}
[[http://www.pcengines.ch/apu1d.htm|PC Engines APU 1D]] is a single board computer with 3 Gigabit ethernet ports, a powerful AMD APU and Coreboot firmware. !FreedomBox images built for AMD64 machines are tested to work well for it.
[[https://www.pcengines.ch/apu.htm|PC Engines APU]] boards are single board computers with 3 Gigabit ethernet ports, a powerful AMD64 APU and Coreboot firmware. !FreedomBox images built for AMD64 machines are tested to work well for [[http://www.pcengines.ch/apu1d.htm|APU1D]] and [[http://www.pcengines.ch/apu3b2.htm|APU3B ]] models and are expected to work also well on the other, very similar versions.
'''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this single board computer.
@ -21,21 +21,26 @@ Although untested, the following similar hardware is also likely to work well wi
* [[http://www.pcengines.ch/apu2c4.htm|apu2c4]]
* [[http://www.pcengines.ch/apu3a2.htm|apu3a2]]
* [[http://www.pcengines.ch/apu3a4.htm|apu3a4]]
* [[http://www.pcengines.ch/apu3b2.htm|apu3b2]]
* [[http://www.pcengines.ch/apu3b4.htm|apu3b4]]
=== Download ===
=== Installation ===
!FreedomBox disk [[FreedomBox/Download|images]] for this hardware are available. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card, USB disk, SSD or hard drive and boot into !FreedomBox. Pick the image meant for all amd64 machines.
An alternative to downloading these images is to [[InstallingDebianOn/Alix3d2|install Debian]] on the APU and then [[FreedomBox/Hardware/Debian|install FreedomBox]] on it.
An [[https://github.com/huubsch/APU-Installation-HomeAssistant-Freedombox|installation manual]] tested on the APU3B is available on GitHub, including flashing with UEFI-BIOS
=== Networking ===
The first network port, the left most one in the above picture, is configured by !FreedomBox to be an upstream Internet link and the remaining 2 ports are configured for local computers to connect to.
=== Availability ===
PCEngines announced the [[https://www.pcengines.ch/eol.htm|phase-out]] of these boards in June 2023.
In 2024 [[https://pcengines.github.io/|Dasharo announced the support of APU-boards]] : coreboot + SeaBIOS and coreboot+UEFI.
* Price: 110 - 170 USD (depending on the board and supplier)
* [[http://www.pcengines.ch/order.htm|PC Engines]]
* [[http://www.pcengines.ch/order.htm|Full list of suppliers]]
@ -43,18 +48,17 @@ The first network port, the left most one in the above picture, is configured by
=== Hardware ===
* Open Hardware: No
* CPU: [[http://www.amd.com/en-gb/products/embedded/processors/g-series|AMD G series T40E]]
* RAM: 2 GB DDR3-1066 DRAM
* Storage: SD card, External USB
* CPU: [[http://www.amd.com/en-gb/products/embedded/processors/g-series|AMD G series T40E]]; [[https://teklager.se/en/amd-gx-412tc-cpu-specification/|GX-412TC]], 1 GHz quad core (depending on model)
* RAM: 2 GB DDR3-1066 DRAM - 4 GB (depending on model)
* Storage: SD card, External USB, mSATA module
* Architecture: amd64
* Ethernet: 3 Gigabit Ethernet ports
* !WiFi: None, use a [[FreedomBox/Hardware/USBWiFi|USB WiFi device]]
* SATA: 1 m-SATA and 1 SATA
* WiFi: wle200nx / wle600vx / wle900vx miniPCI express wireless modules
* SATA: 1 mSATA-module and 1 SATA
=== Non-Free Status ===
* Non-free blobs required: No
* !WiFi: Not available
* Boot firmware: [[http://www.pcengines.ch/apu1d.htm|Coreboot]]
## END_INCLUDE
@ -62,4 +66,4 @@ The first network port, the left most one in the above picture, is configured by
<<Include(FreedomBox/Portal)>>
----
CategoryFreedomBox
CategoryFreedomBox CategoryFreedomBox

View File

@ -12,7 +12,17 @@ In addition to supporting various single board computers and other devices, any
== Recommended Hardware ==
On April 22nd, 2019, the !FreedomBox Foundation announced the [[https://freedomboxfoundation.org/buy/|sales]] of the Pioneer Edition !FreedomBox Home Server Kits. This is the recommended pre-installed hardware for all users who don't wish to build their own !FreedomBox by choosing the right components, downloading the image and preparing an SD card with !FreedomBox.
=== Libre Crafts FreedomBox ===
Libre Crafts in an endeavor from the !FreedomBox developers themselves to bring you a powerful !FreedomBox device capable of hosting even the most demanding home server needs. The device is crafted, tested, and delivered to you by !FreedomBox developers. Your purchase helps !FreedomBox development.
This hardware features a powerful CPU, plenty of main memory, a fast OS disk, ability to add two high capacity hard disk drives, dual multi-gigabit Ethernet ports, all with a low power consumption. Use it to host all your photos, to backup all home devices, as a NAS, as home automation hub, as a desktop computer, and more all at once.
||<style="text-align: center;"> [[FreedomBox/Hardware/LibreCrafts|{{attachment:libre-crafts.png|Libre Crafts FreedomBox|height=300}}]]<<BR>> [[FreedomBox/Hardware/LibreCrafts|Libre Crafts FreedomBox]] ||
=== Olimex's FreedomBox Pioneer Edition ===
On April 22nd, 2019, the !FreedomBox Foundation announced the [[https://freedomboxfoundation.org/buy/|sales]] of the Pioneer Edition !FreedomBox Home Server Kits. This pre-installed hardware is for all users who don't wish to build their own !FreedomBox by choosing the right components, downloading the image and preparing an SD card with !FreedomBox.
The kit includes all the hardware needed for launching a !FreedomBox home server on an Olimex A20-OLinuXino-LIME2 board. This product provides the perfect combination of open source hardware and free and open source software. By purchasing this product, you also support the !FreedomBox Foundation's efforts to create and promote its free and open source server software.

View File

@ -21,7 +21,7 @@ Home Assistant app is considered experimental in !FreedomBox as it is fairly new
=== Hardware ===
Home Assistant can detect, configure, and use various devices on the local network. For example, if a device is connected using Wi-Fi or LAN to the same network as !FreedomBox, Home Assistant can detect, configure, and use the device. Other home automation protocols such as Thread, !ZigBee, and Z-Wave are also supported but require additional hardware to be connected to your !FreedomBox. For example, if you have a door sensor that speaks !ZigBee, you need to attach a !ZigBee USB dongle to your !FreedomBox. Home Assistant can then detect and use the door sensor on the !ZigBee network.
Home Assistant can detect, configure, and use various devices on the local network. For example, if a device is connected using Wi-Fi or LAN to the same network as !FreedomBox, Home Assistant can detect, configure, and use the device. Other home automation protocols such as Thread, !ZigBee, and Z-Wave are also supported but require additional hardware to be connected to your !FreedomBox. For example, if you have a door sensor that speaks !ZigBee, you need to attach a !ZigBee USB dongle to your !FreedomBox. Home Assistant can then detect and use the door sensor on the !ZigBee network. '''Note:''' if you attach any such hardware to FreedomBox after you install the Home Assistant app, then you need to disable and re-enable the Home Assistant app before the hardware can be discovered and used by Home Assistant.
Home Assistant is a comprehensive solution for your home automation needs supporting thousands of devices. You can check whether a device is supported by Home Assistant by visiting the [[https://www.home-assistant.io/integrations/|integrations]] page. Other devices which are not listed may also be supported when they are similar to supported devices. It is recommended that you purchase hardware that advertises support for Home Assistant.

View File

@ -25,7 +25,8 @@ The [[https://www.olimex.com/Products/OLinuXino/Home-Server/Pioneer-FreedomBox-H
* an optional storage add-on for hard disk (HDD) or solid-state drive (SSD)
=== Recommended Hardware ===
This is the hardware recommended for all users who just want a turn-key !FreedomBox, and '''don't''' want to '''build''' their own one.
This is a hardware recommended for all users who just want a turn-key !FreedomBox, and '''don't''' want to '''build''' their own one.
(Building your own !FreedomBox means some technical stuff like choosing and buying the right components, downloading the image and preparing the SD card).

View File

@ -8,6 +8,223 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== FreedomBox 26.4.1 (2026-03-08) ==
=== Highlights ===
* apache2: Disable pubtkt authentication module
=== Other Changes ===
* container: Hold freedombox packages during test setup
* d/control: Trim deps for nocheck build profile
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Turkish
* Vagrantfile: Enable public network for bridged networking
== FreedomBox 26.4 (2026-03-02) ==
=== Highlights ===
* backups: Enable key-based SSH authentication for remote backups
* oidc: New app to implement OpenID Connect Provider
* apache: Implement protecting apps using OpenID Connect
* wireguard: Improve server section user experience flow
=== Other Changes ===
* *: Remove some absolute file paths in SVGs
* *: Update URL base from /plinth to /freedombox
* README/HACKING: Update weblate project path to /freedombox
* Vagrantfile: Drop unnecessary sudo configuration for actions
* action_utils: Drop support for link-local IPv6 addresses
* action_utils: Fix issue with type checking a generator
* action_utils: Implement utility to change umask temporarily
* actions, privileged_daemon: Drop some unused global statements
* apache: Fix diagnosing URLs protected by OpenID Connect
* apache: Preserve host header when proxying to service
* backups: Arrange form for adding remote location
* backups: Avoid some repeated text in form help text
* backups: Copy SSH client public key to remote
* backups: Create .ssh folder before creating SSH key
* backups: Create a better comment in the generated SSH key file
* backups: Display SSH public key when adding remote
* backups: Fix issue with Javascript in add remote location form
* backups: Fix showing proper error for incorrect passphrase
* backups: Fix type checking errors
* backups: Generate SSH client key if needed
* backups: Migrate to SSH key auth when mounting
* backups: Minor refactoring
* backups: Show/hide form elements instead of disabling for simplicity
* backups: Simplify handling of migration to SSH keys
* backups: Test adding/removing remote location
* backups: Tweak appearance of add remote location form
* backups: Use SSH key instead of password
* backups: Use selected SSH credential for remote
* backups: tests: Simplify functional test using more classes
* bin: Add tool to change !FreedomBox password in Django database
* calibre: Use OpenID Connect instead of pubtkt based SSO
* cfg: Drop unused actions_dir option
* cfg: Drop unused config_dir option
* container: Align terminology in printed banner
* db: Create a utility to get credentials from dbconfig
* debian: Ensure that gbp creates a clean tarball prior to build
* deluge: Use OpenID Connect instead of pubtkt based SSO
* doc/dev: Set new theme for developer documentation
* doc/dev: Use OpenID Connect instead of pubtkt based SSO
* doc/dev: always have an up-to-date copyright year
* ejabberd: Fix setting up certificates for multiple domains
* email: Use OpenID Connect instead of pubtkt based SSO
* featherwiki: Use OpenID Connect instead of pubtkt based SSO
* gitweb: Fix issue with running post init due to missing method
* gitweb: Use OpenID Connect instead of pubtkt based SSO
* js: When page load fails during install, show it to user
* letsencrypt: When copying certificate reset the umask reliably
* locale/bg: Fix several translations with HTML links (Bulgarian)
* locale/de: Fix several translations with HTML links (German)
* locale: Update translations for Albanian, Catalan, Chinese (Simplified Han script), Czech, French, German, Greek, Italian, Swedish, Tamil, Turkish
* matrixsynapse: Update apache config to proxy Synapse client API
* miniflux: Get credentials from dbconfig-common directly
* miniflux: Revert workaround for a packaging bug with DB connection
* mumble: murmurd renamed to mumble-server
* oidc: Style the page for authorizing an OIDC app
* pyproject: Use new format to specify licenses
* quassel: Explicitly set permissions on the domain configuration file
* rssbridge: Use OpenID Connect instead of pubtkt based SSO
* searx: Use OpenID Connect instead of pubtkt based SSO
* sharing: Use OpenID Connect instead of pubtkt based SSO
* sso: Merge into users module, drop pubtkt related code
* syncthing: Use OpenID Connect instead of pubtkt based SSO
* syncthing: tests: Fix tests by allowing rapid restarts
* templates: Allow building pages without navigation bar and footer
* tests: functional: Fix expecting !FreedomBox to be home page
* tests: functional: Fix reloading error page during install/uninstall
* tests: functional: Increase systemd rate limits for starting units
* tiddlywiki: Use OpenID Connect instead of pubtkt based SSO
* transmission: Use OpenID Connect instead of pubtkt based SSO
* ui: Add animation for notification dismissal
* ui: Dismiss notifications without page reload
* ui: Refactor notification delete buttons to avoid repeating code
* web_framework: Allow !FreedomBox apps to override templates
* web_server: Log requests to WSGI app
* wireguard: Accept/use netmask with IP address for server connection
* wireguard: Fix format when showing multiple endpoints of the server
* wireguard: Fix showing default route setting in server edit form
* wireguard: Fix split tunneling
* wireguard: Show status of default route in server information page
* wireguard: filter .local addresses from showClient view
* wireguard: show server vpn ip in show client page
* wordpress: Use OpenID Connect instead of pubtkt based SSO when private
== FreedomBox 26.3 (2026-02-02) ==
=== Highlights ===
* ui: Use HTMX to eliminate full page reloads
* wireguard: Add 'Start Server' button to help with client setup
=== Other Changes ===
* debian: Follows policy 4.7.3
* debian: Ignore lintian warning: service file missing Install section
* debian: Remove default Rules-Requires-Root
* debian: Remove preinst script
* debian: Update copyright years
* docs: Update container script usage
* lintian: Remove mismatched overrides
* locale: Update translations for Chinese (Simplified Han script), German, Italian, Turkish
* Makefile: Fix removing extra license file
* ui: Add HTMX as a dependency
* ui: Use HTMX to update notifications on partial page updates
* wireguard: Remove NM connections when app is uninstalled
* wireguard: Show next available client IP in Add Client form
* wireguard: Update functional tests to handle Start Server button
* wireguard: Show server endpoint on main app page
== FreedomBox 26.2 (2026-01-20) ==
* gitweb: Fix deleting last repo disables app
* locale: Update translations for Estonian, Italian
* notifications: Close dropdown when clicking outside
== FreedomBox 26.1 (2026-01-05) ==
* container: Add aliases for start/stop commands
* locale: Update translations for Albanian, Bulgarian, Chinese (Simplified Han script), Czech, Estonian, French, German, Italian, Russian, Turkish, Ukrainian
== FreedomBox 25.17.1 (2025-12-15) ==
=== Highlights ===
* backups: Set proper permissions for backups-data directory
* minetest: Rename Minetest to Luanti
=== Other Changes ===
* locale: Update translations for Albanian, Bulgarian, Czech, Estonian, Hindi, Italian, Russian, Turkish, Ukrainian
* minetest: Remove legacy code, use new name, conf, etc.
* transmission: Deal with changes in latest forky package
* transmission: Remove obsolete apache redirects
* vagrant: Enable EFI firmware
== FreedomBox 25.17 (2025-12-08) ==
=== Highlights ===
* ui: Implement a toggle menu for setting dark mode
=== Other Changes ===
* homeassistant: Fix spelling in tests
* locale: Fix python-brace-format error in Estonian
* locale: Update translations for Catalan, Estonian, French, Russian
* privileged: Don't log exception that are expected
* ui: Dark theme color for tags text in an app card
* ui: Drop colors defined in Bootstrap 5.3
* ui: Fix dark theme color for disabled form elements
* ui: Fix dark theme color for form help text
* ui: Fix dark theme color for select-all button
* ui: Fix dark theme colors for app enable/disable toggle button
* ui: Fix dark theme colors for default button style
* ui: Fix dark theme colors for running status indicator
* ui: Minor CSS refactor to use variables
* ui: Use default button style for tag buttons
* upgrades: Use bootstrap spinner button instead of custom styling
== FreedomBox 25.16 (2025-11-24) ==
=== Highlights ===
* dynamicdns: Use only IPv4 for GnuDIP protocol
* janus: Allow app to be installed from Debian unstable
* jsxc: Fix missing dependencies
=== Other Changes ===
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, German, Italian, Russian, Turkish, Ukrainian
* janus: Relax content security policy for the video room
* janus: Update the video room code from latest upstream
* jsxc: Update content security policy to prevent style errors
* middleware: Implement middleware for common headers such as CSP
* package: Prevent freedombox's deps from removal during app uninstall
== FreedomBox 25.15 (2025-11-10) ==
=== Highlights ===
* help: Fix serving images from help pages
* matrixsynapse: Explain federation and link to testing tool
=== Other Changes ===
* locale: Update translations for French, German, Italian
* main: Allow setting development mode from environment
* matrixsynapse: Clarify how to change domain name in status section
* matrixsynapse: Explicitly set the trusted key server to matrix.org
* README: Use the Weblate's language chart widget
* Run service using systemd even for development
* ttrss: Remove app not available in Trixie
* views: Implement an API to retrieve the readiness status in JSON
== FreedomBox 25.14 (2025-10-27) ==
* Enable private tmp and join namespaces for the two daemons

View File

@ -20,15 +20,13 @@ The content can be shared publicly or restricted to the users of listed allowed
=== Setting Up Shares ===
For the users to access the content through their browser it must exist and have a share. A share is an entry in the Sharing app relating:
* the Name (an thereby the URL) with which the users will ask for the content,
* the Disk Path of the content to be served and
* the sharing mode. On restricted mode, it also has the list of allowed groups.
Many shares can coexist in the same server.
Only admins can create, edit or remove shares. They'll find the Sharing app in the Apps section of !FreedomBox web interface. Sharing app is an easy to use web application with an evident interface.
Each share has its own sharing mode (public or restricted) setting. Only groups recognized by !FreedomBox service can be combined in the list of allowed groups. Groups created in the CLI won't be offered by the Sharing app.
* In !FreedomBox web interface, enable the Sharing App. Only admins can create, edit or remove shares. They'll find the Sharing app in the Apps section of the !FreedomBox web interface. Many shares can coexist in the same server.
* Add a new share
* Give it a name (an thereby the URL) with which the users will ask for the content. In the example above it would be called ''content_name''.
* The Disk Path of the content to be served. This path is relative to ''root'' on your !FreedomBox. For instance ''/var/lib/freedombox/sharing/content_name'' might be a choice.
* Sharing mode. On restricted mode, it also has the list of allowed groups. Only groups recognized by !FreedomBox service can be combined in the list of allowed groups. Groups created in the CLI won't be offered by the Sharing app.
* Create the directory specified under ''Disk Path'' on your !FreedomBox through ''Cockpit'', ''Nautilus'' or remote login.
* Make sure the user, who will provide the content, has write access to that directory for instance by making him the owner of that directory.
=== Providing/Updating Content ===

View File

@ -11,7 +11,7 @@
== Tiny Tiny RSS (News Feed Reader) ==
||<tablestyle="float: right;"> {{attachment:TinyTinyRSS-icon_en_V01.png|Tiny Tiny RSS icon}} ||
'''Available since''': version 0.9
'''Available since''': This app is no longer available since Debian Trixie. Please migrate to [[FreedomBox/Manual/Miniflux|Miniflux]] or [[FreedomBox/Manual/Nextcloud|Nextcloud News]].
Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, designed to allow reading news from any location, while feeling as close to a real desktop application as possible.

View File

@ -89,7 +89,7 @@ Here are some tips before you begin manual update to next stable release:
* Radicale
* Some packages may not be available after upgrade to next release. Please migrate to a similar application before or after the upgrade process. For upgrade to Debian 13 "trixie", the following apps are no longer available:
* Janus. Use audio/video calling over Matrix or XMPP or audio calling over Mumble. This app will likely become available in future again.
* TT-RSS. Migrate to Miniflux.
* TT-RSS. Migrate to Miniflux or Nextcloud News.
* Searx.
To initiate the distribution update process, go to ''Software Update'' in ''System'' section. Then ''Enable auto-update'' and ''Enable auto-update to next stable release'' option. Then click on the ''Distribution Update'' button. Then click the ''Start Distribution Update'' button. The process may take several hours if your OS is on a slow disk such as an SD card. !FreedomBox web UI may not be available during upgrade. Refresh the page if the page errors out. Finally, allow more time for post-upgrade processes and restart the machine.

View File

@ -22,12 +22,11 @@ Follow the instructions on the [[FreedomBox/Download|download]] page to download
1. Decompress the downloaded VDI image (tool for [[http://www.7-zip.org/|Windows]], [[http://unarchiver.c3.cx/unarchiver|Mac]]).
1. Create a new VM in the !VirtualBox UI with OS type ''Linux'' and Version ''Debian'' (32/64-bit according to the downloaded image).
{{attachment:virtualbox_os_type.png|VirtualBox Name and OS dialog}}
1. Create a new VM in the !VirtualBox UI with OS type ''Linux'' and Version ''Debian'' (32/64-bit according to the downloaded image). {{attachment:virtualbox-create-1.png|VirtualBox Name and OS dialog}}
1. In the ''Hard disk'' dialog choose ''Use an existing virtual hard disk file'' and select the .vdi file you extracted in step 1.
1. In the ''Hardware'' dialog choose ''Enable EFI (special OSes only)''. You may increase the Base Memory and Processors if desired. {{attachment:virtualbox-create-2.png|VirtualBox Hardware dialog}}
{{attachment:virtualbox_harddisk_file.png|VirtualBox Hard disk dialog}}
1. In the ''Hard disk'' dialog choose ''Use an existing virtual hard disk file'' and select the .vdi file you extracted in step 1. {{attachment:virtualbox-create-3.png|VirtualBox Hard disk selector}} {{attachment:virtualbox-create-4.png|VirtualBox Hard disk dialog}}
1. When created, go to the virtual machine's Settings -> [Network] -> [Adapter 1]->[Attached to:] and choose the network type your want the machine to use according to the explanation in Network Configuration below. The recommended type is the ''Bridged adapter'' option, but be aware that this exposes the !FreedomBox's services to your entire local network.

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

View File

@ -2,7 +2,7 @@
{{attachment:apu1d.jpg|PC Engines APU 1D|width=632,height=319}}
[[http://www.pcengines.ch/apu1d.htm|PC Engines APU 1D]] is a single board computer with 3 Gigabit ethernet ports, a powerful AMD APU and Coreboot firmware. !FreedomBox images built for AMD64 machines are tested to work well for it.
[[https://www.pcengines.ch/apu.htm|PC Engines APU]] boards are single board computers with 3 Gigabit ethernet ports, a powerful AMD64 APU and Coreboot firmware. !FreedomBox images built for AMD64 machines are tested to work well for [[http://www.pcengines.ch/apu1d.htm|APU1D]] and [[http://www.pcengines.ch/apu3b2.htm|APU3B ]] models and are expected to work also well on the other, very similar versions.
'''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this single board computer.
@ -21,21 +21,26 @@ Although untested, the following similar hardware is also likely to work well wi
* [[http://www.pcengines.ch/apu2c4.htm|apu2c4]]
* [[http://www.pcengines.ch/apu3a2.htm|apu3a2]]
* [[http://www.pcengines.ch/apu3a4.htm|apu3a4]]
* [[http://www.pcengines.ch/apu3b2.htm|apu3b2]]
* [[http://www.pcengines.ch/apu3b4.htm|apu3b4]]
=== Download ===
=== Installation ===
!FreedomBox disk [[FreedomBox/Download|images]] for this hardware are available. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card, USB disk, SSD or hard drive and boot into !FreedomBox. Pick the image meant for all amd64 machines.
An alternative to downloading these images is to [[InstallingDebianOn/Alix3d2|install Debian]] on the APU and then [[FreedomBox/Hardware/Debian|install FreedomBox]] on it.
An [[https://github.com/huubsch/APU-Installation-HomeAssistant-Freedombox|installation manual]] tested on the APU3B is available on GitHub, including flashing with UEFI-BIOS
=== Networking ===
The first network port, the left most one in the above picture, is configured by !FreedomBox to be an upstream Internet link and the remaining 2 ports are configured for local computers to connect to.
=== Availability ===
PCEngines announced the [[https://www.pcengines.ch/eol.htm|phase-out]] of these boards in June 2023.
In 2024 [[https://pcengines.github.io/|Dasharo announced the support of APU-boards]] : coreboot + SeaBIOS and coreboot+UEFI.
* Price: 110 - 170 USD (depending on the board and supplier)
* [[http://www.pcengines.ch/order.htm|PC Engines]]
* [[http://www.pcengines.ch/order.htm|Full list of suppliers]]
@ -43,18 +48,17 @@ The first network port, the left most one in the above picture, is configured by
=== Hardware ===
* Open Hardware: No
* CPU: [[http://www.amd.com/en-gb/products/embedded/processors/g-series|AMD G series T40E]]
* RAM: 2 GB DDR3-1066 DRAM
* Storage: SD card, External USB
* CPU: [[http://www.amd.com/en-gb/products/embedded/processors/g-series|AMD G series T40E]]; [[https://teklager.se/en/amd-gx-412tc-cpu-specification/|GX-412TC]], 1 GHz quad core (depending on model)
* RAM: 2 GB DDR3-1066 DRAM - 4 GB (depending on model)
* Storage: SD card, External USB, mSATA module
* Architecture: amd64
* Ethernet: 3 Gigabit Ethernet ports
* !WiFi: None, use a [[FreedomBox/Hardware/USBWiFi|USB WiFi device]]
* SATA: 1 m-SATA and 1 SATA
* WiFi: wle200nx / wle600vx / wle900vx miniPCI express wireless modules
* SATA: 1 mSATA-module and 1 SATA
=== Non-Free Status ===
* Non-free blobs required: No
* !WiFi: Not available
* Boot firmware: [[http://www.pcengines.ch/apu1d.htm|Coreboot]]
## END_INCLUDE
@ -62,4 +66,4 @@ The first network port, the left most one in the above picture, is configured by
<<Include(FreedomBox/Portal)>>
----
CategoryFreedomBox
CategoryFreedomBox CategoryFreedomBox

View File

@ -11,8 +11,19 @@ Además de soportar varios SBC's (single board computers) y otros dispositivos,
== Hardware Recomendado ==
El 22 de Abril de 2019, la ''!FreedomBox Foundation'' anunció que los kits ''Pioneer Edition !FreedomBox Home Server'' salían a la [[https://freedomboxfoundation.org/buy/|venta]]. Este es el hardware preinstalado recomendado para todos los usuarios que no quieran construirse su propia (máquina) !FreedomBox eligiendo los componentes adecuados, descargando la imagen y preparando una tarjeta SD con (el software) !FreedomBox.
=== Libre Crafts FreedomBox ===
Libre Crafts es una iniviativa de los propios desarrolladores de !FreedomBox para proporcionar una !FreedomBox potente capaz de alojar las necesidades más exigentes de un servidor casero.
Los propios desarrolladores de !FreedomBox la montan. prueban y entregan. Tu compra ayuda al desarrollo de !FreedomBox.
Esta máquina lleva un procesador potente, mucha memoria, CPU, un disco de sitema operativo rápido, posibilidad de añador discos duros de alta capacidad, puertos Ethernet multi-gigabit duales, todo ello con bajo consumo.
Úsalo para alojar todas tus fotos, las copias de respaldo de tus otros dispositivos, como NAS, como centro de control de domótica, como ordenador de sobremesa, y más, todo a la vez.
||<style="text-align: center;"> [[FreedomBox/Hardware/LibreCrafts|{{attachment:FreedomBox/libre-crafts.png|FreedomBox de Libre Crafts|height=300}}]]<<BR>> [[FreedomBox/Hardware/LibreCrafts|FreedomBox de Libre Crafts]] ||
=== Olimex's FreedomBox Pioneer Edition ===
On April 22nd, 2019, the !FreedomBox Foundation announced the [[https://freedomboxfoundation.org/buy/|sales]] of the Pioneer Edition !FreedomBox Home Server Kits. This pre-installed hardware is for all users who don't wish to build their own !FreedomBox by choosing the right components, downloading the image and preparing an SD card with !FreedomBox.
El kit incluye todo el hardware necesario para arrancar un servidor casero !FreedomBox sobre una placa ''Olimex A20-OLinuXino-LIME2''. Este producto proporciona la combinación perfecta de hardware de fuentes abiertas y software libre. Al comprar este producto, soportas también los esfuerzos de la ''!FreedomBox Foundation'' para crear y promover su software de servidor libre.
||<style="text-align: center;"> [[es/FreedomBox/Hardware/PioneerEdition|{{attachment:FreedomBox/Hardware/pioneer-edition_thumb.jpg|Kits de servidor doméstico FreedomBox edición Pioneer|width=320,height=257}}]]<<BR>> [[es/FreedomBox/Hardware/PioneerEdition|Kits de servidor doméstico FreedomBox edición Pioneer]] ||

View File

@ -20,7 +20,7 @@ La app Home Assistant se considera experimental en !FreedomBox, ya que es nueva
=== Hardware ===
Home Assistant puede detectar, configurar, y usar varios dispositivos de la red local. Por ejemplo, si un dispositivo se conecta mediante Wi-Fi o LAN a la misma red que !FreedomBox, Home Assistant puede detectarlo, configurarlo, y usarlo. También se soportan otros protocolos de automatización como Thread, !ZigBee, y Z-Wave, pero requieren hardware adicional para conectarlos a tu !FreedomBox. Por ejemplo, si tienes un sensor de puerta que habla !ZigBee, necesitas conectar un adaptador !ZigBee USB a tu !FreedomBox. Home Assistant podrá entonces detectar y usar el sensor de puerta en la red de !ZigBee.
Home Assistant puede detectar, configurar, y usar varios dispositivos de la red local. Por ejemplo, si un dispositivo se conecta mediante Wi-Fi o LAN a la misma red que !FreedomBox, Home Assistant puede detectarlo, configurarlo, y usarlo. También se soportan otros protocolos de automatización como Thread, !ZigBee, y Z-Wave, pero requieren hardware adicional para conectarlos a tu !FreedomBox. Por ejemplo, si tienes un sensor de puerta que habla !ZigBee, necesitas conectar un adaptador !ZigBee USB a tu !FreedomBox. Home Assistant podrá entonces detectar y usar el sensor de puerta en la red de !ZigBee. '''Nota:''' Si conectas hardware como este a tu FreedomBox después de instalar la aplicación Home Assistant tendrás que deshabilitarla y volverla a habilitar para que lo detecte y lo use.
Home Assistant es una solución completa si tu automatización del hogar necesita soportar miles de dispositivos. Puedes consultar si Home Assistant soporta un dispositivo visitando su página de [[https://www.home-assistant.io/integrations/|integraciones]]. Otros dispositivos similares a los soportados podrían estarlo aunque no figuren en la lista. Se recomienda comprar hardware etiquetado como compatible con Home Assistant.

View File

@ -16,7 +16,7 @@ Los servidores caseros !FreedomBox Pioneer Edition los fabrica y vende Olimex, u
== Características del Producto ==
=== HW Recomendado ===
Éste es el hardware recomendado para los usuarios que quieran simplemente una !FreedomBox llave en mano, y '''no''' quieran '''construirse''' una.
Éste es un hardware recomendado para los usuarios que quieran simplemente una !FreedomBox llave en mano, y '''no''' quieran '''construirse''' una.
(Construir tu propia !FreedomBox implica algunos tecnicismos como elegir y comprar los componentes adecuados, descargar la imágen y preparar una tarjeta SD).

View File

@ -22,8 +22,25 @@ Alternativamente podrías optar por montarlo tu mismo reuniendo todas las piezas
* '''Nota:''' En la mayoría de computadoras monoplaca no esperes un efecto de salida en un monitor si lo conectas por HDMI porque el núcleo (kernel) del sistema podría no reconocerlo. Mira más abajo para aprender cómo acceder y controlar tu !FreedomBox desde la red.
1. En el primer arranque !FreedomBox ejecutará su configuración inicial (las versiones más antiguas de !FreedomBox se reinician tras este paso). Este proceso podría llevar varios minutos en algunas máquinas. Después de darle unos 10 minutos aproximadamente, sigue con el siguiente paso.
1. Después de que tu !FreedomBox haya finalizado su configuración inicial puedes acceder a su interfaz web mediante tu navegador web.
* Si tu ordenador está conectado directamente a tu !FreedomBox a través de un segundo puerto ''Ethernet'' de la red local, puedes navegar a http://freedombox/ o a http://10.42.0.1/.
* Si tu ordenador soporta mDNS (GNU/Linux, Mac OSX o Windows con software mDNS instalado), puedes navegar a: http://freedombox.local/ (o a http://<el-hostname-que-estableciste-durante-la-instalación>.local/)
* Si tu ordenador está conectado a un monitor y !FreedomBox puede escribir en él, la petición de credenciales muestra la dirección de la web:
{{{
Debian GNU/Linux 13 freedombox tty1
FreedomBox
To start using FreedomBox and to create an account, access using a web browser
one of the following URLs.
http://freedombox.local/
http://192.168.0.2/
http://[fe80::7207:12ff:fe34:5678]/
...
freedombox login:
}}}
* Si tu ordenador está conectado directamente a tu !FreedomBox a través de un segundo puerto ''Ethernet'' de la red local, puedes navegar a http://freedombox/ o a http://10.42.0.1/.
* Si te manejas con el interfaz web de tu router, puedes buscar allí la dirección IP de tu !FreedomBox y navegar a ella.
* Si no están disponibles ninguno de estos métodos necesitarás averiguar la dirección IP de tu !FreedomBox. Puedes usar el programa "nmap" de tu ordenador para encontrar su dirección IP:
{{{

View File

@ -8,6 +8,223 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== FreedomBox 26.4.1 (2026-03-08) ==
=== Highlights ===
* apache2: Disable pubtkt authentication module
=== Other Changes ===
* container: Hold freedombox packages during test setup
* d/control: Trim deps for nocheck build profile
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Turkish
* Vagrantfile: Enable public network for bridged networking
== FreedomBox 26.4 (2026-03-02) ==
=== Highlights ===
* backups: Enable key-based SSH authentication for remote backups
* oidc: New app to implement OpenID Connect Provider
* apache: Implement protecting apps using OpenID Connect
* wireguard: Improve server section user experience flow
=== Other Changes ===
* *: Remove some absolute file paths in SVGs
* *: Update URL base from /plinth to /freedombox
* README/HACKING: Update weblate project path to /freedombox
* Vagrantfile: Drop unnecessary sudo configuration for actions
* action_utils: Drop support for link-local IPv6 addresses
* action_utils: Fix issue with type checking a generator
* action_utils: Implement utility to change umask temporarily
* actions, privileged_daemon: Drop some unused global statements
* apache: Fix diagnosing URLs protected by OpenID Connect
* apache: Preserve host header when proxying to service
* backups: Arrange form for adding remote location
* backups: Avoid some repeated text in form help text
* backups: Copy SSH client public key to remote
* backups: Create .ssh folder before creating SSH key
* backups: Create a better comment in the generated SSH key file
* backups: Display SSH public key when adding remote
* backups: Fix issue with Javascript in add remote location form
* backups: Fix showing proper error for incorrect passphrase
* backups: Fix type checking errors
* backups: Generate SSH client key if needed
* backups: Migrate to SSH key auth when mounting
* backups: Minor refactoring
* backups: Show/hide form elements instead of disabling for simplicity
* backups: Simplify handling of migration to SSH keys
* backups: Test adding/removing remote location
* backups: Tweak appearance of add remote location form
* backups: Use SSH key instead of password
* backups: Use selected SSH credential for remote
* backups: tests: Simplify functional test using more classes
* bin: Add tool to change !FreedomBox password in Django database
* calibre: Use OpenID Connect instead of pubtkt based SSO
* cfg: Drop unused actions_dir option
* cfg: Drop unused config_dir option
* container: Align terminology in printed banner
* db: Create a utility to get credentials from dbconfig
* debian: Ensure that gbp creates a clean tarball prior to build
* deluge: Use OpenID Connect instead of pubtkt based SSO
* doc/dev: Set new theme for developer documentation
* doc/dev: Use OpenID Connect instead of pubtkt based SSO
* doc/dev: always have an up-to-date copyright year
* ejabberd: Fix setting up certificates for multiple domains
* email: Use OpenID Connect instead of pubtkt based SSO
* featherwiki: Use OpenID Connect instead of pubtkt based SSO
* gitweb: Fix issue with running post init due to missing method
* gitweb: Use OpenID Connect instead of pubtkt based SSO
* js: When page load fails during install, show it to user
* letsencrypt: When copying certificate reset the umask reliably
* locale/bg: Fix several translations with HTML links (Bulgarian)
* locale/de: Fix several translations with HTML links (German)
* locale: Update translations for Albanian, Catalan, Chinese (Simplified Han script), Czech, French, German, Greek, Italian, Swedish, Tamil, Turkish
* matrixsynapse: Update apache config to proxy Synapse client API
* miniflux: Get credentials from dbconfig-common directly
* miniflux: Revert workaround for a packaging bug with DB connection
* mumble: murmurd renamed to mumble-server
* oidc: Style the page for authorizing an OIDC app
* pyproject: Use new format to specify licenses
* quassel: Explicitly set permissions on the domain configuration file
* rssbridge: Use OpenID Connect instead of pubtkt based SSO
* searx: Use OpenID Connect instead of pubtkt based SSO
* sharing: Use OpenID Connect instead of pubtkt based SSO
* sso: Merge into users module, drop pubtkt related code
* syncthing: Use OpenID Connect instead of pubtkt based SSO
* syncthing: tests: Fix tests by allowing rapid restarts
* templates: Allow building pages without navigation bar and footer
* tests: functional: Fix expecting !FreedomBox to be home page
* tests: functional: Fix reloading error page during install/uninstall
* tests: functional: Increase systemd rate limits for starting units
* tiddlywiki: Use OpenID Connect instead of pubtkt based SSO
* transmission: Use OpenID Connect instead of pubtkt based SSO
* ui: Add animation for notification dismissal
* ui: Dismiss notifications without page reload
* ui: Refactor notification delete buttons to avoid repeating code
* web_framework: Allow !FreedomBox apps to override templates
* web_server: Log requests to WSGI app
* wireguard: Accept/use netmask with IP address for server connection
* wireguard: Fix format when showing multiple endpoints of the server
* wireguard: Fix showing default route setting in server edit form
* wireguard: Fix split tunneling
* wireguard: Show status of default route in server information page
* wireguard: filter .local addresses from showClient view
* wireguard: show server vpn ip in show client page
* wordpress: Use OpenID Connect instead of pubtkt based SSO when private
== FreedomBox 26.3 (2026-02-02) ==
=== Highlights ===
* ui: Use HTMX to eliminate full page reloads
* wireguard: Add 'Start Server' button to help with client setup
=== Other Changes ===
* debian: Follows policy 4.7.3
* debian: Ignore lintian warning: service file missing Install section
* debian: Remove default Rules-Requires-Root
* debian: Remove preinst script
* debian: Update copyright years
* docs: Update container script usage
* lintian: Remove mismatched overrides
* locale: Update translations for Chinese (Simplified Han script), German, Italian, Turkish
* Makefile: Fix removing extra license file
* ui: Add HTMX as a dependency
* ui: Use HTMX to update notifications on partial page updates
* wireguard: Remove NM connections when app is uninstalled
* wireguard: Show next available client IP in Add Client form
* wireguard: Update functional tests to handle Start Server button
* wireguard: Show server endpoint on main app page
== FreedomBox 26.2 (2026-01-20) ==
* gitweb: Fix deleting last repo disables app
* locale: Update translations for Estonian, Italian
* notifications: Close dropdown when clicking outside
== FreedomBox 26.1 (2026-01-05) ==
* container: Add aliases for start/stop commands
* locale: Update translations for Albanian, Bulgarian, Chinese (Simplified Han script), Czech, Estonian, French, German, Italian, Russian, Turkish, Ukrainian
== FreedomBox 25.17.1 (2025-12-15) ==
=== Highlights ===
* backups: Set proper permissions for backups-data directory
* minetest: Rename Minetest to Luanti
=== Other Changes ===
* locale: Update translations for Albanian, Bulgarian, Czech, Estonian, Hindi, Italian, Russian, Turkish, Ukrainian
* minetest: Remove legacy code, use new name, conf, etc.
* transmission: Deal with changes in latest forky package
* transmission: Remove obsolete apache redirects
* vagrant: Enable EFI firmware
== FreedomBox 25.17 (2025-12-08) ==
=== Highlights ===
* ui: Implement a toggle menu for setting dark mode
=== Other Changes ===
* homeassistant: Fix spelling in tests
* locale: Fix python-brace-format error in Estonian
* locale: Update translations for Catalan, Estonian, French, Russian
* privileged: Don't log exception that are expected
* ui: Dark theme color for tags text in an app card
* ui: Drop colors defined in Bootstrap 5.3
* ui: Fix dark theme color for disabled form elements
* ui: Fix dark theme color for form help text
* ui: Fix dark theme color for select-all button
* ui: Fix dark theme colors for app enable/disable toggle button
* ui: Fix dark theme colors for default button style
* ui: Fix dark theme colors for running status indicator
* ui: Minor CSS refactor to use variables
* ui: Use default button style for tag buttons
* upgrades: Use bootstrap spinner button instead of custom styling
== FreedomBox 25.16 (2025-11-24) ==
=== Highlights ===
* dynamicdns: Use only IPv4 for GnuDIP protocol
* janus: Allow app to be installed from Debian unstable
* jsxc: Fix missing dependencies
=== Other Changes ===
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, German, Italian, Russian, Turkish, Ukrainian
* janus: Relax content security policy for the video room
* janus: Update the video room code from latest upstream
* jsxc: Update content security policy to prevent style errors
* middleware: Implement middleware for common headers such as CSP
* package: Prevent freedombox's deps from removal during app uninstall
== FreedomBox 25.15 (2025-11-10) ==
=== Highlights ===
* help: Fix serving images from help pages
* matrixsynapse: Explain federation and link to testing tool
=== Other Changes ===
* locale: Update translations for French, German, Italian
* main: Allow setting development mode from environment
* matrixsynapse: Clarify how to change domain name in status section
* matrixsynapse: Explicitly set the trusted key server to matrix.org
* README: Use the Weblate's language chart widget
* Run service using systemd even for development
* ttrss: Remove app not available in Trixie
* views: Implement an API to retrieve the readiness status in JSON
== FreedomBox 25.14 (2025-10-27) ==
* Enable private tmp and join namespaces for the two daemons

View File

@ -19,15 +19,15 @@ El contenido se puede compartir públicamente o restringido a usuarios de una li
=== Editando comparticiones ===
Para que los usuarios accedan al contenido mediante su navegador debe existir y tener una compartición. Una compartición es una entrada en la aplicación Sharing que relaciona:
* El Nombre (y por tanto la URL) que usarán los usuarios para solicitar el contenido,
* el Ruta de acceso al contenido a servir y
* el modo de compartición. Si es restringido, también contendrá la lista de grupos autorizados.
En el mismo servidor pueden coexistir múltiples comparticiones.
Cada compartición tiene su propio ajuste de modo de compartición (pública o restringida). Sólo los grupos que reconoce el servicio !FreedomBox se pueden combinar en la lista de grupos autorizados. La aplicación ''Sharing'' no ofrecerá los grupos creados en el interfaz de línea de órdenes.
Sólo los administradores pueden crear, editar o eliminar comparticiones. Encontrarán la aplicación ''Sharing'' en la sección Aplicacions del interfaz web de !FreedomBox. La aplicación ''Sharing'' es una aplicación web fácil de usar y con un interfaz evidente.
Cada compartición tiene su priopio ajuste de modo de compartición (pública o restrigida). Sólo los grupos que reconoce el servicio !FreedomBox se pueden combinar en la lista de grupos autorizados. La aplicación ''Sharing'' no ofrecerá los grupos creados en el interfaz de línea de órdenes.
* In el interfaz web de !FreedomBox, habilita la App ''Sharing''. Sólo los administradores pueden crear, editar o eliminar comparticiones. Encontrarán la aplicación ''Sharing'' en la sección Aplicaciones del interfaz web de !FreedomBox. En el mismo servidor pueden coexistir múltiples comparticiones.
* Añadir una nueva compartición:
* Dale un nombre (y por tanto la URL) que usarán los usuarios para solicitar el contenido, En el ejemplo anterior se llamaría ''nombre del contenido''.
* La Ruta completa de acceso al contenido a servir. Por ejemplo ''/var/lib/freedombox/sharing/nombre_del_contenido''.
* El modo de compartición. Si es restringido, también contendrá la lista de grupos autorizados. Solo los grupos reconocidos por el servicio !FreedomBox se pueden combinar en la lista de grupos autorizados. La app no ofrecerá los grupos creados sólo en la línea de órdenes.
* Crea el directorio especificado en ''Ruta de Disco'' en !FreedomBox mediante ''Cockpit'', ''Nautilus'' o ingreso remoto.
* Asegúrate de que el usuario que proporcione el contenido tiene permiso para escribir en el directorio, por ejemplo, haciéndole dueño del directorio.
=== Provisionar/actualizar el contenido ===

View File

@ -9,7 +9,7 @@
== Tiny Tiny RSS (Lector de Feeds de Noticias) ==
||<tablestyle="float: right;"> {{attachment:FreedomBox/Manual/TinyTinyRSS/TinyTinyRSS-icon_en_V01.png|Tiny Tiny RSS icon}} ||
'''Disponible desde''': versión 0.9
'''Disponible desde''': Desde Debian Trixie esta aplicación ya no está disponible. Por favor, migra a [[es/FreedomBox/Manual/Miniflux|Miniflux]] or [[es/FreedomBox/Manual/Nextcloud|Nextcloud News]].
''Tiny Tiny RSS'' es un lector y agregador de ''feeds'' de noticias (RSS/Atom) diseñado para leer noticias desde cualquier lugar con una experiencia lo más parecida posible a una aplicación de escritorio.

View File

@ -86,7 +86,7 @@ Para la mayoría de los usuarios se recomienda la autoactualización. Si no obst
Algunos paquetes podrían no estar disponibles tras una actualización de publicación. Por favor, migra a una aplicación similar. Al actualizar a Debian 13 "trixie", las siguentes aplicaciones dejan de estar disponibles:
* Janus. Usa Matrix o XMPP para llamadas de video o Mumble para audio. Esta app probáblemente vuelva a estar disponible en el futuro.
* TT-RSS. Migra a Miniflux.
* TT-RSS. Migra a Miniflux o a Nextcloud News.
* Searx.
Para iniciar el proceso de actualización de publicación, ve a ''Actualización de Software'' en la sección ''Sistema''. Luego ''Habilitar autoactualización'' y la opción ''Habilitar autoactualización a la siguiente publicación estable''. Entonces haz clic en el botón ''Actualización de Distibución''. Y luego en ''Iniciar Actualización de Distibución''. El proceso podría llegar varias horas si tu sistema operativo reside en un almacenamiento lento como una tarjeta SD. El interfaz web de !FreedomBox podría estar indisponible durante la actualización. Refresca la página si muestra errores. Finalmente, espera a los procesos de post-actualización y reinicia la máquina.

View File

@ -22,12 +22,11 @@ Follow the instructions on the [[FreedomBox/Download|download]] page to download
1. Decompress the downloaded VDI image (tool for [[http://www.7-zip.org/|Windows]], [[http://unarchiver.c3.cx/unarchiver|Mac]]).
1. Create a new VM in the !VirtualBox UI with OS type ''Linux'' and Version ''Debian'' (32/64-bit according to the downloaded image).
{{attachment:virtualbox_os_type.png|VirtualBox Name and OS dialog}}
1. Create a new VM in the !VirtualBox UI with OS type ''Linux'' and Version ''Debian'' (32/64-bit according to the downloaded image). {{attachment:virtualbox-create-1.png|VirtualBox Name and OS dialog}}
1. In the ''Hard disk'' dialog choose ''Use an existing virtual hard disk file'' and select the .vdi file you extracted in step 1.
1. In the ''Hardware'' dialog choose ''Enable EFI (special OSes only)''. You may increase the Base Memory and Processors if desired. {{attachment:virtualbox-create-2.png|VirtualBox Hardware dialog}}
{{attachment:virtualbox_harddisk_file.png|VirtualBox Hard disk dialog}}
1. In the ''Hard disk'' dialog choose ''Use an existing virtual hard disk file'' and select the .vdi file you extracted in step 1. {{attachment:virtualbox-create-3.png|VirtualBox Hard disk selector}} {{attachment:virtualbox-create-4.png|VirtualBox Hard disk dialog}}
1. When created, go to the virtual machine's Settings -> [Network] -> [Adapter 1]->[Attached to:] and choose the network type your want the machine to use according to the explanation in Network Configuration below. The recommended type is the ''Bridged adapter'' option, but be aware that this exposes the !FreedomBox's services to your entire local network.

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

View File

@ -73,8 +73,8 @@
<para>
This the URL fragment under which Plinth will provide its services.
Plinth is shipped with a default value of
<filename>/plinth</filename>. This means that Plinth will be
available as http://localhost:8000/plinth by default.
<filename>/freedombox</filename>. This means that Plinth will be
available as http://localhost:8000/freedombox by default.
</para>
</listitem>
</varlistentry>
@ -194,7 +194,7 @@
<synopsis>$ plinth --server_dir='/myurl'</synopsis>
<para>
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.
</para>
</example>

View File

@ -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. <<BR>>\\n\
typing https://myfreedombox.rocks/freedombox/ into the browser. <<BR>>\\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</ulink>'
>>> generate_inner_docbook([Link('../../Contribute', \
[PlainText('Contribute')])], context={'title': 'FreedomBox/Manual/Hardware'})
'<ulink url="/plinth/help/manual/en/Contribute#">\
'<ulink url="/freedombox/help/manual/en/Contribute#">\
Contribute</ulink>'
>>> generate_inner_docbook([Link('/Code', \
@ -1772,9 +1772,9 @@ Code</ulink>'
>>> generate_inner_docbook([Link('DebianBug:1234', [PlainText('Bug')])])
'<ulink url="https://bugs.debian.org/1234#">Bug</ulink>'
>>> generate_inner_docbook([Link('DebianPkg:plinth', \
>>> generate_inner_docbook([Link('DebianPkg:freedombox', \
[PlainText('Plinth')])])
'<ulink url="https://packages.debian.org/plinth#">Plinth</ulink>'
'<ulink url="https://packages.debian.org/freedombox#">Plinth</ulink>'
>>> generate_inner_docbook([Link('AliothList:freedombox-discuss', \
[PlainText('Discuss')])])
@ -1911,7 +1911,7 @@ PlainText(' on it. ')])])
'<para>An alternative to downloading these images is to \
<ulink url="https://wiki.debian.org/InstallingDebianOn/TI/BeagleBone#">\
install Debian</ulink> on the BeagleBone and then \
<ulink url="/plinth/help/manual/en/Debian#">install \
<ulink url="/freedombox/help/manual/en/Debian#">install \
FreedomBox</ulink> on it. </para>'
>>> generate_inner_docbook([Paragraph([PlainText('After Roundcube is \

View File

@ -3,4 +3,4 @@
Package init file.
"""
__version__ = '25.14'
__version__ = '26.4.1'

View File

@ -3,6 +3,7 @@
import argparse
import logging
import os
import sys
import threading
@ -121,7 +122,8 @@ def main():
arguments = parse_arguments()
cfg.read()
if arguments.develop:
if arguments.develop or os.getenv('FREEDOMBOX_DEVELOP', '') == '1':
cfg.develop = True
# Use the config in the current working directory
cfg.read_file(cfg.get_develop_config_path())

View File

@ -10,6 +10,7 @@ import shutil
import subprocess
import tempfile
from contextlib import contextmanager
from typing import Generator
import augeas
@ -370,12 +371,13 @@ def get_addresses() -> list[dict[str, str | bool]]:
'url_address': hostname
})
# XXX: When a hostname is resolved to IPv6 address, it may likely
# be link-local address. Link local IPv6 addresses are valid only
# for a given link and need to be scoped with interface name such
# as '%eth0' to work. Tools such as curl don't seem to handle
# When a hostname is resolved to IPv6 address, it may likely be link-local
# address. Link local IPv6 addresses are valid only for a given link and
# need to be scoped with interface name such as '%eth0' to work. Browsers
# refused to implement support for link-local addresses (with zone IDs) in
# URLs due to platform specific parsing rules and other implementation
# difficulties. mod_auth_openidc does not support them either.
# this correctly.
# addresses.append({'kind': '6', 'address': hostname, 'numeric': False})
return addresses
@ -397,13 +399,15 @@ def get_ip_addresses() -> list[dict[str, str | bool]]:
}
if address['kind'] == '6' and address['numeric']:
if address['scope'] != 'link':
address['url_address'] = '[{0}]'.format(address['address'])
else:
address['url_address'] = '[{0}%{1}]'.format(
address['url_address'], address['interface'])
address['url_address'] = '[{0}]'.format(address['address'])
addresses.append(address)
if address['scope'] != 'link':
# Do not include link local addresses. Browsers refused to
# implement support for link-local addresses (with zone IDs) in
# URLs due to platform specific parsing rules and other
# implementation difficulties. mod_auth_openidc does not support
# them either.
addresses.append(address)
return addresses
@ -838,3 +842,13 @@ def run(command, **kwargs):
raise exception
return process
@contextmanager
def umask(mask) -> Generator:
"""Set the umask temporarily for a operation and then revert it."""
old_umask = os.umask(mask)
try:
yield
finally:
os.umask(old_umask)

View File

@ -130,6 +130,9 @@ def run_privileged_method(func, module_name, action_name, args, kwargs):
if raw_output:
request['raw_output'] = raw_output
if not log_error:
request['log_error'] = False
client_socket = _request_to_server(request)
if raw_output:
@ -366,7 +369,6 @@ class JSONEncoder(json.JSONEncoder):
def _setup_thread_storage():
"""Setup collection of stdout/stderr from any process in this thread."""
global thread_storage
thread_storage.stdout = b''
thread_storage.stderr = b''
@ -377,14 +379,12 @@ def _clear_thread_storage():
Python documentation is silent on whether thread local storage will be
cleaned up after a thread terminates.
"""
global thread_storage
thread_storage.stdout = None
thread_storage.stderr = None
def get_return_value_from_exception(exception):
"""Return the value to return from server when an exception is raised."""
global thread_storage
return_value = {
'result': 'exception',
'exception': {
@ -424,14 +424,19 @@ def privileged_handle_json_request(
bool):
raise TypeError('Incorrect "raw_output" parameter')
if 'log_error' in request and not isinstance(request['log_error'],
bool):
raise TypeError('Incorrect "log_error" parameter')
return request
try:
request = _parse_request()
log_error = request.get('log_error', True)
arguments = {'args': request['args'], 'kwargs': request['kwargs']}
_setup_thread_storage()
return_value = _privileged_call(request['module'], request['action'],
arguments)
arguments, log_error)
if isinstance(return_value, io.BufferedReader):
raw_output = request.get('raw_output', False)
@ -452,7 +457,7 @@ def privileged_handle_json_request(
return json.dumps(return_value, cls=JSONEncoder)
def _privileged_call(module_name, action_name, arguments):
def _privileged_call(module_name, action_name, arguments, log_error=True):
"""Import the module and run action as superuser"""
if '.' in module_name:
raise SyntaxError('Invalid module name')
@ -500,11 +505,12 @@ def _privileged_call(module_name, action_name, arguments):
return_value = {'result': 'success', 'return': return_values}
except Exception as exception:
return_value = get_return_value_from_exception(exception)
logger.exception(
'Error running action: %s..%s(..): %s\nstdout:\n%s\nstderr:\n%s\n',
module_name, action_name, exception,
return_value['exception']['stdout'],
return_value['exception']['stderr'])
if log_error:
logger.exception(
'Error running action: %s..%s(..): %s\nstdout:\n%s\n'
'stderr:\n%s\n', module_name, action_name, exception,
return_value['exception']['stdout'],
return_value['exception']['stderr'])
return return_value

View File

@ -12,13 +12,11 @@ logger = logging.getLogger(__name__)
# [Path] section
file_root = '/usr/share/plinth'
config_dir = '/etc/plinth'
data_dir = '/var/lib/plinth'
custom_static_dir = '/var/www/plinth/custom/static'
store_file = data_dir + '/plinth.sqlite3'
actions_dir = '/usr/share/plinth/actions'
doc_dir = '/usr/share/freedombox'
server_dir = '/plinth'
server_dir = '/freedombox'
# [Network] section
host = '127.0.0.1'
@ -111,11 +109,9 @@ def read_file(config_path):
config_items = (
('Path', 'file_root', 'string'),
('Path', 'config_dir', 'string'),
('Path', 'data_dir', 'string'),
('Path', 'custom_static_dir', 'string'),
('Path', 'store_file', 'string'),
('Path', 'actions_dir', 'string'),
('Path', 'doc_dir', 'string'),
('Path', 'server_dir', 'string'),
('Network', 'host', 'string'),

View File

@ -44,7 +44,8 @@ def _check(client, condition):
def _client_has_desktop(client):
"""Filter to find out whether an application has desktop clients"""
return _check(
client, lambda platform: platform.get('os') in enum_values(Desktop_OS))
client, lambda platform: platform.get('os') in enum_values(Desktop_OS)
and platform.get('type') != 'package')
def _client_has_mobile(client):
@ -116,7 +117,7 @@ def _validate_platform_package(platform):
def _validate_platform_download(platform):
"""Validate a platform of type download."""
assert platform['os'] in enum_values(Desktop_OS)
assert platform['os'] in enum_values(Desktop_OS) + enum_values(Mobile_OS)
assert isinstance(platform['url'], (str, Promise))

View File

@ -64,10 +64,10 @@ def fixture_load_cfg():
"""Load test configuration."""
from plinth import cfg
keys = ('file_root', 'config_dir', 'data_dir', 'custom_static_dir',
'store_file', 'actions_dir', 'doc_dir', 'server_dir', 'host',
'port', 'use_x_forwarded_for', 'use_x_forwarded_host',
'secure_proxy_ssl_header', 'box_name', 'develop')
keys = ('file_root', 'data_dir', 'custom_static_dir', 'store_file',
'doc_dir', 'server_dir', 'host', 'port', 'use_x_forwarded_for',
'use_x_forwarded_host', 'secure_proxy_ssl_header', 'box_name',
'develop')
saved_state = {}
for key in keys:
saved_state[key] = getattr(cfg, key)

40
plinth/db/dbconfig.py Normal file
View File

@ -0,0 +1,40 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Utilities for parsing dbconfig-common files with Augeas."""
import pathlib
import augeas
def get_credentials(dbconfig_path: str) -> dict[str, str]:
"""Parse dbconfig-common file with Augeas Shellvars lens."""
if not pathlib.Path(dbconfig_path).is_file():
raise FileNotFoundError(f'DB config not found: {dbconfig_path}')
aug = _load_augeas(dbconfig_path)
required = ['dbc_dbuser', 'dbc_dbpass', 'dbc_dbname']
credentials = {}
for key in required + ['dbc_dbserver']:
credentials[key] = aug.get(key).strip('\'"')
if not all(credentials.get(key) for key in required):
raise ValueError('Missing required dbconfig-common credentials')
return {
'user': credentials['dbc_dbuser'],
'password': credentials['dbc_dbpass'],
'database': credentials['dbc_dbname'],
'host': credentials['dbc_dbserver'] or 'localhost'
}
def _load_augeas(config_path: str):
"""Initialize Augeas."""
aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +
augeas.Augeas.NO_MODL_AUTOLOAD)
pathstr = str(config_path)
aug.transform('Shellvars', pathstr)
aug.set('/augeas/context', f'/files{pathstr}')
aug.load()
return aug

View File

@ -93,7 +93,6 @@ def dump_database(backup_file: str | pathlib.Path, database_name: str):
file if it exists.
"""
backup_path = pathlib.Path(backup_file)
backup_path.parent.mkdir(parents=True, exist_ok=True)
with action_utils.service_ensure_running('postgresql'):
with open(backup_path, 'w', encoding='utf-8') as file_handle:
_run_as([

View File

@ -1,5 +1,3 @@
[Path]
file_root = %(parent_parent_dir)s
config_dir = %(file_root)s/data/etc/plinth
actions_dir = %(file_root)s/actions
doc_dir = %(file_root)s/doc

View File

@ -10,7 +10,7 @@ translating the PO file from your language directory.
Introducing yourself is important since some work may have been done
already on Debian translators discussion lists and Weblate
localization platform.
https://hosted.weblate.org/projects/freedombox/plinth/
https://hosted.weblate.org/projects/freedombox/freedombox/
https://www.debian.org/MailingLists/subscribe
## Wiki: translators landing page

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More