3489 Commits

Author SHA1 Message Date
Sunil Mohan Adapa
7937a7c0d2
power: Disable sleep and hibernate on the system
Closes: #2503

- FreedomBox is a server that is typically always running. If applications such
as GNOME desktop environment are installed, they could, by default, cause system
to sleep or hibernate after a period of idleness (based on peripheral activity).
To ensure that services are always available over the network, prevent all such
applications from sending the system to sleep/hibernate.

- Other types of sleep such as hybrid sleep and suspend and hibernate are also
automatically disabled by systemd if either suspend or hibernate are disabled.

Tests:

- Without the changes, install GNOME. In gdm login screen or in desktop
environment, after 20 minutes (default) the system goes to sleep.

- Create the file in the patch with the appropriate directory in a production
FreedomBox machine. Run 'systemctl daemon-reload'. After this, running
'systemctl suspend' or 'systemctl hibernate' will return an error that the
operation is not supported. In GDM, the suspend button does not appear. In GNOME
desktop environment after login, the suspend button does not appear. Even after
the 15-20 minute period, the system does not go to sleep.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-31 19:50:28 -04:00
Sunil Mohan Adapa
f8e78f33d3
radicale: Explicitly set the auth type to accommodate radicale 3.5
Helps: #2501
Helps: Debian #1100995

- With radicale's Debian packaging for version 3.5 (trixie) the auth/type
configuration value is no longer set to remote_user by default[1]. FreedomBox's
setup depends on this. So, set this value explicitly including for bookworm.

Links:

1) https://tracker.debian.org/media/packages/r/radicale/changelog-3.5.0-1

Tests:

- Install on bookworm and testing VMs and run functional tests. Web UI works.

- On bookworm VM, install radicale and perform dist-upgrade. Upgrade succeeds.
Radicale is at version 3.5.0-1. The file /etc/radicale/config *does not*
contains auth/type as 'remote_user'. This is because unattended-upgrades has
unexpectedly upgraded radicale and overwrote the configuration file. This is
being investigated separately.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-28 21:26:40 -04:00
Sunil Mohan Adapa
aa181a564f
storage: tests: Fix a test failure for psutils >= 7.0
- We are using a private data structure that lead to failure. psutil 7.0 removed
two fields from the partition class. Just update the code to work with 7.0
instead of emulating psutil completely as that is a better test.

- The primary code is unaffected in is_partition_read_only() and
get_filesystem_type() due to not having any changes in the fields we use.

Tests:

- Run unit tests on testing and unstable VMs.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-03-24 19:50:54 -07:00
Benedek Nagy
f4f417cbb6
syncthing: Extend setup process to recover from manual config errors
There are configuration items that users of syncthing can accidentally
set, resulting in the UI becoming unavailable. Previously, if such a
thing happened, the FreedomBox admin would have to ssh into the server and
edit the xml manually or reinstall/restore the app. With this patch, it
is enough to re-run the setup to make the UI accesible again.

- Remove http basic authentication from the settings (gui/user and
  gui/password. This is unnecessary as FreedomBox already provides
  authentication.

- Make sure these options are properly set:
  - 'Use HTTPS for GUI' is off
  - 'GUI Listen Address' is 127.0.0.1:8384
  - GUI is enabled

There is a forum discussion that inspired these changes:
https://discuss.freedombox.org/t/solved-cant-access-syncthing-administration-panel/2137

Tests done:
- Fresh install: after the setup, confirm the UI is working properly and
  the xml is configured with the expected values.
- Make the changes to break the Syncthing UI, then re-run setup. Confirm
  the UI is back online.

Signed-off-by: Benedek Nagy <contact@nbenedek.me>
[sunil: Initialize conf_changed variable to prevent failures accessing it]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-03-24 16:38:00 -07:00
Benedek Nagy
1489151b4e
SOGo: add dpkg-dev to the package list
Closes: #2499

[sunil]

- Add a comment about the dependency.

Signed-off-by: Benedek Nagy <contact@nbenedek.me>
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-03-24 15:45:38 -07:00
Sunil Mohan Adapa
5a9d5730a7
names: Store domains in kvstore instead of /etc/hosts
As reported in discussion forum[1], when clients connected via 'shared' network
connection try to resolve the a static domain name configured in FreedomBox,
they resolve to 127.0.1.1. Since this refers to client's own IP address, they
fail to connect.

In the previous version, this was not a problem because the entry was stored as
<hostname>.<domainname>. To resolve this, store domain names in kvstore instead
of /etc/hosts.

Links:

1)
https://discuss.freedombox.org/t/freedombox-resolves-its-own-external-name-as-127-0-1-1/3660

Tests:

- Adding/removing static domains from Names app works. The order of added
domains is preserved in the stored configuration. When adding a existing domain,
a proper error message is shown.

- Without the patch, configure multiple domains. They show up in /etc/hosts.
Apply the patches and restart the service. Names app setup will run. Entries
from /etc/hosts are removed and will be added to kvstore. The list of domains
shows properly in Names app. After restarting the services, domains are show
properly.

- Without the patch on a version of FreedomBox without support for multiple
static domains, configure a static domain. Switch to latest version FreedomBox
with the patches. Restart the service. Names app setup will run. Entry from
/etc/hosts will be removed and will be added to kvstore. The list of domains
shows properly in Names app. After restarting the services, domains are show
properly.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-21 16:01:41 -04:00
Sunil Mohan Adapa
91c5931c59
upgrades: Run dpkg/apt fixes before dist upgrade
Closes: #2490

Tests:

- Unit tests works.

- On a fresh stable container, enable auto updates. Run 'apt install
mumble-server' and kill the apt process when it is unpacking. After this any apt
install command will ask for running dpkg --configure -a. At this time, run the
Testing dist upgrade. Dist upgrade starts successfully and then shows the
message 'Fixing any broken apt/dpkg states...'. It also shows that packages that
were not setup have been setup. Dist upgrades proceeds after that.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-17 08:10:46 -04:00
Sunil Mohan Adapa
eaed05e02b
upgrades: Use bind mounts to edit sources file only upon completion
- Save changes to /etc/apt/sources.list as a different file.

- When launching the dist upgrade process via systemd-run, use bind mounting to
ensure that the newly created sources file is treated as the original
/etc/apt/sources.list.

- If the process completes successfully, rename the new file to the original
sources.list. If the process terminates abruptly or machine reboots,
sources.list will remain unchanged. This will also the dist upgrade process to
be restarted (and hopefully continued).

Tests:

- On a fresh stable container, running dist-upgrade succeeds.

- While dist-upgrade is running, /etc/apt/sources.list is unmodified. After the
operation is successfully completed, /etc/apt/sources.list has been updates
successfully. If the operation fails, /etc/apt/sources.list remains unmodified.

- During the run the following are run:
  - apt update
  - package holds
  - debconf selections
  - full-upgrade
  - autoremove
  - unattended-upgrades
  - restarting freedombox service
  - waiting 10 minutes
  - apt update

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:39 -04:00
Sunil Mohan Adapa
33cbdd734b
upgrades: Minor refactor to pre-dist upgrade checks
- Don't perform sources.list changes in the check() method.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
f02b77f212
upgrades: tests: Add unit tests for dist upgrade methods
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
8c93ea20a4
upgrades: Perform easier checks first during dist upgrade
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
3aff47039f
upgrades: Simplify some global names
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
bbc2a2b0de
upgrades: Log messages using python logging framework
- When an action is invoked, it configured to handle console and journal
handlers. Console logger (StreamHandler) flushes after each event. Journal event
is sent immediately after the event. So, we are not losing the immediate flush
advantage by switching to logging framework.

- Since console logging is present (and the output is not captured away), using
journal handler also will double log each event. Remove the journal handler.
Console is where the output of various commands is logged. So, keep that.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
1b89151c38
upgrades: Log apt output to journal during dist upgrade
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
32739bb8b7
upgrades: Simplify dist upgrades checks using exceptions
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
9ddfbc4fed
upgrades: Use systemd service status instead of flag file
- A service with the same name can't be started again.

- Transient service goes away as soon as the process ends. This is like
automatically removing the flag. This ensures that stale file does not cause an
issue.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
e58d3d8465
upgrades: Refactor code to retrieve the new codename
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
69058645ab
upgrades: Perform sources file update more reliably
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
ac5f778ae8
upgrades: Relax list of packages to hold during dist upgrade
Closes: #2493.

Tests:

- For each of the packages in the list, download the Bookworm version and Trixie
version of the packages. See if the files in /etc/ that were modified were also
files we also modify. If so, keep it in the list. Otherwise, remove it from the
list.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
5a15665b41
upgrades: Split the main dist upgrade code
- To make it easier to test and read.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
6b13e0eb7a
upgrades: Refactor code to hold packages
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
20d9f8af8d
upgrades: Use systemd-run to create transient service
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:38 -04:00
Sunil Mohan Adapa
0b807a8ce1
upgrades: Refactor code for disabling Quassel during dist-upgrade
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:37 -04:00
Sunil Mohan Adapa
e97e1fc725
upgrades: Refactor code to disable snapshots
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:37 -04:00
Sunil Mohan Adapa
1d8e406528
upgrades: Drop special handling for searx
Helps: #2493.

- searx will not be part of Trixie.

- This special upgrade code is not required for Bookworm -> Trixie upgrade.

- This code is not be invoked for Bullseye -> Bookworm upgrade as this removal
will not reach Bullseye.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:37 -04:00
Sunil Mohan Adapa
7cef898948
upgrades: Split dist upgrade into a separate module
- For ease of maintenance and testing.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-03-10 18:20:37 -04:00
Sunil Mohan Adapa
d629295110
sogo: Fix a typo in tags
Thanks to user 'fefekrzr' for pointing it out.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-03-03 12:41:40 -08:00
Sunil Mohan Adapa
d411718fb1
dynamicdns: Handle addition of duplicate domains
Tests:

- Adding a new domain works. Adding a new domain with old name results in error
message.

- Editing a old domain works. Updating the domain name works. Updating
configuration parameters without domain name change works.

- Adding a domain with capital letters results in domain with lower cased
letters.

Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-24 17:30:46 -05:00
Sunil Mohan Adapa
84bf20e1b8
names: Handle addition of duplicate static domains
Tests:

- Adding an new unique domain works.

- Adding an existing domain results in an error.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-24 17:30:42 -05:00
James Valleroy
5544eff707
upgrades: Drop unattended-upgrade call from dist-upgrade
unattended-upgrade will take a very long time to run, and won't be able
to upgrade most of the packages. There is not much benefit to running it
here.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-02-23 12:53:19 -08:00
James Valleroy
d0e25e5239
upgrades: Inhibit shutdown during dist-upgrade
Tests:

- Start a dist-upgrade from stable to testing. Dist upgrade is completed
  as expected. "The system will reboot" message appears only after
  freedombox-dist-upgrade.service has completed.

Helps: #2090

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2025-02-23 12:53:10 -08:00
James Valleroy
c67b1164df
matrixsynapse: tests: Fix adding domain
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 11:16:27 -05:00
Sunil Mohan Adapa
85a694f20f
names: Retrieve the most important domain in a more generic way
- The get_domain_name() has some problem. It returns only static domain names
but not a dynamic domain name. It may not always return the same domain when
multiple static domains are configured. It may return return an empty string.

Tests:

- JSXC page shows the alphabetically first static domain. If no static domain is
configured, first dynamic domain is shown, next pagekite domain, next pagekite
domain, next tor onion domain, and finally .local domain.

- Downloading profile from OpenVPN will set the first domain in it.

- When ejabberd is installed, the first domain is configured by default.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:45:05 -05:00
Sunil Mohan Adapa
aac12f4391
names: Sort domains by priority of their domain types
- First of the list is the most important one and may be used as "primary"
domain in apps.

- Change the return type of DomainName.list() from set to list so that order can
be preserved. Update all users of the API accordingly. Add type hints to all the
methods using this API to catch any errors.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:45:01 -05:00
Sunil Mohan Adapa
045b336a9b
names: Specify priority order among domain types
- This can be used to ensure that apps that can deal with only a single domain
auto-configure the best domain by default.

Tests:

- Unit tests run.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:58 -05:00
Sunil Mohan Adapa
49d16412f8
names: Simplify/clarify domain names types for static/dynamic
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:56 -05:00
Sunil Mohan Adapa
f5ecf31453
dynamicdns: Show specific operations on domains in Names apps
- Instead of just configure button, show edit/delete. And configure separately.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:53 -05:00
Sunil Mohan Adapa
863d170219
names: Allow adding multiple static domain names
- Change the mechanism for storing domain names in /etc/hosts. Don't write
hostname to /etc/hosts. Don't prepend hostname to domain name. This means that
when hostname changes, set_domain_name need not be called.

- This means that domain names such as example.fbx.one were not resolvable using
/etc/hosts but these will now resolve to 127.0.1.1. This is a minor concern to
becoming a breaking change.

- Don't use socket.getfqdn() for finding the domain name of the machine. Instead
read from /etc/hosts. There does not seem to a glibc/python API for querying
domain names from /etc/hosts with all variations it allows. Forward resolution
properly works no matter the library.

- Drop a pre-Python 3 conversion from unicode to ascii string for hostname. This
is no longer relevant.

- Domain name form is now domain add form. Passing domain name is mandatory.
Domain delete form and view have been introduced.

- Use augeas to edit hosts file. Add privileged methods to add/delete/get
domains. Add method to migration from old format to new. Support reading old
format too in get_domains.

Tests:

- Without hostname written in /etc/hosts, 'resolvectl query <hostname>' and
'ping <hostname>' work.

- With old /etc/hosts format apply patches and restart service. It will be
converted to new format.

- Adding a domain adds a new line to /etc/hosts file. The domain is shown in
domains list in Names app. Applications get reconfigured with the new domain
name.

- Deleting a domain adds a new line to /etc/hosts file. The domain is shown in
domains list in Names app. Applications get reconfigured with the new domain
name.

- Restarting app triggers domain added signal for all domains and all the
domains are shown in the Names app.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:50 -05:00
Sunil Mohan Adapa
889453daff
names: Simplify showing current and available domains
- In the main domains list, only show currently configured domains. Allow
operations such as edit/delete/configure on them. Actions are determined by the
domain type.

- Show domain types that can be added in a separate table. If an domain is
present and only of that type can exist, it will not be shown in this table.
Show add/configure action based on whether multiple domains can exist.

Tests:

- Configuring a singleton domain type puts it in the domains tables and removes
it from the add domains table. De-configuring it or disabling it does the
opposite.

- For domain types with multiple domains (static/dynamic), entries are shown in
domains if such domains exist. Entry in add domains tables always shows up.

- All action buttons for all five domain types work.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:47 -05:00
Sunil Mohan Adapa
e8d2faecab
names: Add more URLs to the domain type component
- To be used to present better interface for domain types that have multiple
domains.

Tests:

- Unit tests pass.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:43 -05:00
Sunil Mohan Adapa
7e3bdfa49a
dynamicdns: List domains that have not had status update yet
- This can happen if a domain is added while the app is disabled.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:24 -05:00
Sunil Mohan Adapa
a660194308
dynamicdns: Add/remove domains when app is enabled/disabled
This seems to be the most useful function for enabling/disabling dynamic DNS.
This is also what users are likely to expect.

Tests:

- Disable app. The domains will be removed from list of domains in Names app.
Installed applications will be reconfigured.

- Enable app. The domains will be added to list of domains in Names app.
Installed applications will be reconfigured.

- When app is disabled. Adding/removing domain does not trigger app
configuration apps. Domains are not added to Names app.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:21 -05:00
Sunil Mohan Adapa
ca5f547c02
names: domain type: Minor refactor
- In preparation for changes to domain type component.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:19 -05:00
Sunil Mohan Adapa
d9f9168c76
names: Use hostnamectl instead of socket API get the current hostname
- This would mean consistent interfacing with systemd instead of a split
approach.

Tests:

- Edit hostname page shows the current value of hostname correctly.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:16 -05:00
Sunil Mohan Adapa
4176f53e05
dynamicdns: Implement adding multiple domains
Tests:

- Functional tests pass.

- Adding domain triggers domain_added signal.

- Editing a domain triggers domain removed and domain added signals.

- Deleting a domain trigger domain removed signal.

- For each of the action, the status table shows updated information.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-16 10:44:13 -05:00
Benedek Nagy
1ab78fb9da
email: fix fresh installation issue
The changes introduced in https://salsa.debian.org/freedombox-team/freedombox/-/merge_requests/2616
make the email app installation fail if it's installed for the first
time.
This patch ensures that 95-freedombox-sieve.conf is present and that
dovecot is restarted before privileged.setup_spam() is run. This way,
the sievec command can run.

Signed-off-by: Benedek Nagy <contact@nbenedek.me>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-02-15 17:32:39 -05:00
Benedek Nagy
6887c960fe
sogo: Add a new app for SOGo groupware
SOGo is an open source webmail client and groupware available in Debian.
Make a new FreedomBox app for it to be used with the local
Postfix/Dovecot email server.

SOGo requires a database to store events/tasks as well as user settings. Memcached
is also required for caching.

Users log in with their username (as opposed to username + domain on
Roundcube). The host header seen from the first login will be
associated with the user profile. So, if a user logs into SOGo from
freedombox.local and later configures the email server to use
example.com, they will manually have to edit their account(s) to show
the updated domain.

Authentication is done via openldap. It is possible to authenticate with
apache, however it is limited to http basic auth, so mod_auth_tkt cannot
be used. See: b40d777a86/SoObjects/SOGo/SOGoProxyAuthenticator.m (L137)
Configuring http basic auth in my opinion wouldn't add much to
the user experience. It would actually take away the usage of SOGO's built
in TOTP feature.

SOGo only accepts configurations from /etc/sogo/sogo.conf, other configs
from sogo.d don't get recognised.

Use the sogo icon from upstream source. Update sogo.png and sogo.svg to be the
same image (but resized) that is provided in the upstream source. The previous
image was download from Wikimedia Commons.

Update smtp settings so that messages can be sent

Test result for mail deliverability sent with SOGo: https://www.mail-tester.com/test-pdf2yzy6n

The result shows that the message is not DKIM signed. This seems to be
an issue not specific to SOGo. Mails sent from Thunderbird don't get
signed either.

Tests:
- Install app and log in with a FreedomBox user. Create a new event
  titled "Lunch with 🍕 and fries". Confirm the pizza character displays properly.
- Backup the app and uninstall it.
- Restore from the backup, log in and confirm the event gets restored.

To-do:
- test ActiveSync
- create a fail2ban jail
- include the icons in the copyright file
- test sending email in a production setup
- test sieve filters
- write tests

https://salsa.debian.org/freedombox-team/freedombox/-/issues/56

[Sunil]

- App:

  - Update icons to be uniform size as all other apps and copyright information.

  - Since SOGo is not configured to trust the authentication from Apache, it
  does not require FirewallLocalProtection. Remove it.

  - Expand app description. Talk about Email Server app.

  - Update to match recent tags related changes.

  - Make memcached a shared daemon as other processes might use it.

  - Added shared daemon for PostgreSQL.

  - Don't start services when rerunning setup if the app is currently disabled.

  - Don't restart memcached during a restore operation.

- Security:

  - Add system security restrictions to the daemon.

  - Don't use fail2ban jail. SOGo has a mechanism to lock users for a few
  minutes. Use that instead.

- Apache:

  - Make /.well-known URLs work by moving their definitions to global section.

  - Remove old (<2.4) Apache authorization keywords.

  - Simplify, indentation, new line at EOF.

- Manifest:

  - Add more tags.

  - Add SOGo connector, DAVx5, and GNOME Calendar to list of clients.

  - Add 'sogo' to list of service to bring down during backup/restore.

- Privileged:

  - Switch from MySQL to PostgreSQL as it is recommended by SOGo.

  - Use existing utility to generate database password.

  - Use plget and plmerge utilities from gnustep-common package to parse/edit
  the configuration instead of augeas which don't have a dedicated lens.

  - Don't reset the domain when rerunning setup.

  - Ensure that the configuration file has proper ownership and permissions even
  when it did not exist previously.

  - Add typing information for most methods.

  - Remove configuration file after uninstall.

- Configuration:

  - Define database URLs for all seven database tables.

  - Set calendar default roles as suggested in the installation guide.

  - Refresh view automatically every minute to check for new mail.

  - Use the mechanism to lock account after failed login attempts.

  - Add folder name for Junk folder too explicitly.

- Tests: Add basic functional tests.

Tests:

- Functional tests work.

- Rerunning setup does not change the domain back to the primary domain of the
email server.

- Login works. Sending mail and reading mail works. Creating calendar events and
contact works.

- Changing the domain sets the domain value properly in the configuration file.
Configured domain is shown properly on the form.

- Backup and restore work as expected.

- When configuration file is removed and setup is re-run, then the file is
created with proper ownership and permissions.

- 'systemd-analyze security sogo.service' shows a good score.

Signed-off-by: Benedek Nagy <contact@nbenedek.me>
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-01-26 10:50:28 -05:00
Sunil Mohan Adapa
74e908ea82
apache: Enable expires module by default
- Can be used to set the 'Expires:' header to cache static files for a long
time.

Tests:

- Without the patch 'a2query -m expires' shows that the module is not installed.
Applying the patches and restarting services shows that Apache app's setup is
run and 'a2query -m expires' shows that module is enabled.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-01-26 10:50:26 -05:00
Sunil Mohan Adapa
e8f9783057
nextcloud: Drop some dead code
It does not seem to be used anywhere now.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-01-26 10:50:24 -05:00
Sunil Mohan Adapa
9aa3203733
ttrss: Fix issue with installing after an uninstalling
Tests:

- Without the patch, uninstall and reinstall will fail. With patch it passes.

- Rerunning setup does not destroy the contents of the database.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-01-26 10:50:21 -05:00