mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-02-18 08:33:41 +00:00
Tests:
- Config app description is as expected.
- Config form does not show domain name field anymore.
- Submitting the form with changes works.
- Names app has correct link for configuring static domain name. Clicking it
takes to page for setting domain name.
- On startup, static domian name signal is sent properly if set. Otherwise no
signal is send.
- Change domain name form shows correct value for current domain name.
- Change domain name form sets the value for domain name properly.
- Page title is correct.
- Validations works.
- Add/remove domain name signals are sent properly.
- Success message as shown expected
- /etc/hosts is updated as expected.
- Unit tests work.
- Functional tests on ejabberd, letsencrypt, matrix, email, jsxc, openvpn
- After freshly starting the service. Visiting names app shows correct list of
domains.
- ejabberd:
- Installs works as expected. Currently set domain_name is setup properly.
Copy certificate happens on proper domain.
- Changing the domain sets the domain properly in ejabberd configuration.
- Ejabberd app page shows link to name services instead of config app.
Clicking works as expected.
- letsencrypt:
- When no domains are configured, the link to 'Configure domains' is to the
names app.
- matrix-synapse:
- Domain name is properly shown in the status.
- email:
- Primary domain name is shows properly in the app page.
- Setting new primary domain works.
- When installing, domain set as static domain name is prioritized as primary
domain.
- jsxc:
- Show the current static domain name in the domain field. BOSH server is
available.
- openvpn:
- Show the current static domain in profile is set otherwise show the current
hostname.
- If domain name is not set, downloaded OpenVPN profile shows hostname.
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""
|
|
Configure domains accepted by postfix.
|
|
|
|
See: http://www.postfix.org/postconf.5.html#mydestination
|
|
See: http://www.postfix.org/postconf.5.html#mydomain
|
|
See: http://www.postfix.org/postconf.5.html#myhostname
|
|
"""
|
|
|
|
import pathlib
|
|
import re
|
|
|
|
from plinth.actions import privileged
|
|
from plinth.app import App
|
|
from plinth.modules import names
|
|
from plinth.modules.email import postfix
|
|
from plinth.modules.names.components import DomainName
|
|
|
|
from . import dkim, tls
|
|
|
|
|
|
def get_domains():
|
|
"""Return the current domain configuration."""
|
|
conf = postfix.get_config(['mydomain', 'mydestination'])
|
|
domains = set(postfix.parse_maps(conf['mydestination']))
|
|
defaults = {'$myhostname', 'localhost.$mydomain', 'localhost'}
|
|
domains.difference_update(defaults)
|
|
return {'primary_domain': conf['mydomain'], 'all_domains': domains}
|
|
|
|
|
|
def set_all_domains(primary_domain=None):
|
|
"""Set the primary domain and all the domains for postfix."""
|
|
all_domains = DomainName.list_names()
|
|
if not primary_domain:
|
|
primary_domain = get_domains()['primary_domain']
|
|
if primary_domain not in all_domains:
|
|
primary_domain = names.get_domain_name() or list(all_domains)[0]
|
|
|
|
# Update configuration and don't restart daemons
|
|
set_domains(primary_domain, list(all_domains))
|
|
dkim.setup_dkim(primary_domain)
|
|
|
|
# Copy certificates (self-signed if needed) and restart daemons
|
|
app = App.get('email')
|
|
app.get_component('letsencrypt-email-postfix').setup_certificates()
|
|
app.get_component('letsencrypt-email-dovecot').setup_certificates()
|
|
|
|
|
|
@privileged
|
|
def set_domains(primary_domain: str, all_domains: list[str]):
|
|
"""Set the primary domain and all the domains for postfix."""
|
|
all_domains = [_clean_domain(domain) for domain in all_domains]
|
|
primary_domain = _clean_domain(primary_domain)
|
|
|
|
defaults = {'$myhostname', 'localhost.$mydomain', 'localhost'}
|
|
my_destination = ', '.join(set(all_domains).union(defaults))
|
|
conf = {
|
|
'myhostname': primary_domain,
|
|
'mydomain': primary_domain,
|
|
'mydestination': my_destination
|
|
}
|
|
postfix.set_config(conf)
|
|
pathlib.Path('/etc/mailname').write_text(primary_domain + '\n',
|
|
encoding='utf-8')
|
|
tls.set_postfix_config(primary_domain, all_domains)
|
|
tls.set_dovecot_config(primary_domain, all_domains)
|
|
|
|
|
|
def _clean_domain(domain):
|
|
domain = domain.lower().strip()
|
|
assert re.match('^[a-z0-9-\\.]+$', domain)
|
|
return domain
|