+
-
+
+
+
# Description
@@ -42,9 +44,9 @@ the [FreedomBox Wiki](https://wiki.debian.org/FreedomBox/) and the
To have a running FreedomBox, first install Debian (Buster or higher) on a clean
machine. Then run:
- ```
- $ sudo apt install freedombox
- ```
+```
+$ sudo apt install freedombox
+```
Full instructions are available on FreedomBox
[Manual](https://wiki.debian.org/FreedomBox/Manual/)'s
diff --git a/Vagrantfile b/Vagrantfile
index bdf3676f3..6e4ce82fa 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -36,6 +36,10 @@ Vagrant.configure(2) do |config|
cd /vagrant/
./setup.py install
systemctl daemon-reload
+ # Stop any ongoing upgrade
+ killall -9 unattended-upgr
+ dpkg --configure -a
+ apt -f install
apt-get update
# In case new dependencies conflict with old dependencies
apt-mark hold freedombox
diff --git a/actions/upgrades b/actions/upgrades
index 4ddfa606d..db808a51f 100755
--- a/actions/upgrades
+++ b/actions/upgrades
@@ -21,6 +21,7 @@ Configures or runs unattended-upgrades
import argparse
import os
+import pathlib
import re
import subprocess
import sys
@@ -170,25 +171,10 @@ def _check_and_backports_sources():
def _add_apt_preferences():
"""Setup APT preferences to upgrade selected packages from backports."""
- old_preferences_file = '/etc/apt/preferences.d/50freedombox.pref'
- if os.path.exists(old_preferences_file):
- os.remove(old_preferences_file)
-
- preferences_file = '/etc/apt/preferences.d/50freedombox2.pref'
- if os.path.exists(preferences_file):
- print('Preferences up-to-date. Skipping update')
- return
-
- preferences = '''Explanation: This file is managed by FreedomBox, do not edit.
-Explanation: Allow carefully selected updates to 'freedombox' from backports.
-Package: freedombox
-Pin: release a=buster-backports
-Pin-Priority: 500
-'''
-
- print('Updating APT preferences.')
- with open(preferences_file, 'w') as file_handle:
- file_handle.write(preferences)
+ for file_name in ['50freedombox.pref', '50freedombox2.pref']:
+ full_path = pathlib.Path('/etc/apt/preferences.d') / file_name
+ if full_path.exists():
+ full_path.unlink()
def subcommand_setup_repositories(_):
diff --git a/actions/users b/actions/users
index abbc34716..12555e52c 100755
--- a/actions/users
+++ b/actions/users
@@ -20,13 +20,14 @@ Configuration helper for the LDAP user directory
"""
import argparse
-import augeas
import os
import re
import shutil
import subprocess
import sys
+import augeas
+
from plinth import action_utils
ACCESS_CONF = '/etc/security/access.conf'
@@ -122,12 +123,13 @@ def subcommand_setup(_):
def configure_ldap_authentication():
"""Configure LDAP authentication."""
- action_utils.dpkg_reconfigure('nslcd', {
- 'ldap-uris': 'ldapi:///',
- 'ldap-base': 'dc=thisbox',
- 'ldap-auth-type': 'SASL',
- 'ldap-sasl-mech': 'EXTERNAL'
- })
+ action_utils.dpkg_reconfigure(
+ 'nslcd', {
+ 'ldap-uris': 'ldapi:///',
+ 'ldap-base': 'dc=thisbox',
+ 'ldap-auth-type': 'SASL',
+ 'ldap-sasl-mech': 'EXTERNAL'
+ })
action_utils.dpkg_reconfigure('libnss-ldapd',
{'nsswitch': 'group, passwd, shadow'})
action_utils.service_restart('nscd')
@@ -165,9 +167,9 @@ dn: ou={unit},dc=thisbox
objectClass: top
objectClass: organizationalUnit
ou: {unit}'''.format(unit=unit)
- subprocess.run(['ldapadd', '-Q', '-Y', 'EXTERNAL', '-H',
- 'ldapi:///'], input=input.encode(),
- stdout=subprocess.DEVNULL, check=True)
+ subprocess.run(['ldapadd', '-Q', '-Y', 'EXTERNAL', '-H', 'ldapi:///'],
+ input=input.encode(), stdout=subprocess.DEVNULL,
+ check=True)
def setup_admin():
@@ -185,8 +187,8 @@ def setup_admin():
if 'olcRootPW' in ldap_object:
subprocess.run(
- ['ldapmodify', '-Q', '-Y', 'EXTERNAL', '-H',
- 'ldapi:///'], check=True, stdout=subprocess.DEVNULL, input=b'''
+ ['ldapmodify', '-Q', '-Y', 'EXTERNAL', '-H', 'ldapi:///'],
+ check=True, stdout=subprocess.DEVNULL, input=b'''
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcRootPW''')
@@ -194,8 +196,8 @@ delete: olcRootPW''')
root_dn = 'gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth'
if ldap_object['olcRootDN'] != root_dn:
subprocess.run(
- ['ldapmodify', '-Q', '-Y', 'EXTERNAL', '-H',
- 'ldapi:///'], check=True, stdout=subprocess.DEVNULL, input=b'''
+ ['ldapmodify', '-Q', '-Y', 'EXTERNAL', '-H', 'ldapi:///'],
+ check=True, stdout=subprocess.DEVNULL, input=b'''
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootDN
@@ -353,9 +355,13 @@ def subcommand_remove_user_from_group(arguments):
def subcommand_get_group_users(arguments):
- """ Get the list of users of an LDAP group."""
- process = _run(['ldapgid', '-P', arguments.groupname],
- stdout=subprocess.PIPE)
+ """Get the list of users of an LDAP group."""
+ try:
+ process = _run(['ldapgid', '-P', arguments.groupname],
+ stdout=subprocess.PIPE)
+ except subprocess.CalledProcessError:
+ return # Group does not exist, return empty list
+
output = process.stdout.decode()
users = output.rsplit(':')[-1]
if users:
diff --git a/debian/changelog b/debian/changelog
index 2e1c2ffb0..78c2d1241 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,56 @@
+plinth (19.15) unstable; urgency=medium
+
+ [ Doma Gergő ]
+ * Translated using Weblate (Hungarian)
+
+ [ nautilusx ]
+ * Translated using Weblate (German)
+
+ [ Allan Nordhøy ]
+ * Translated using Weblate (Norwegian Bokmål)
+
+ [ Joseph Nuthalpati ]
+ * functional_tests: Fix site.is_available not handling default paths
+ * functional_tests: Fix step definition "When I log out"
+ * matrix-synapse: Allow installation of version 1.2 from backports
+
+ [ James Valleroy ]
+ * security: Hide vulnerability table by default
+ * vagrant: Stop any ongoing unattended-upgrade
+ * functional_tests: Use longer password when creating user
+ * locale: Update translation strings
+ * doc: Fetch latest manual
+ * debian: Add lintian-override for package-installs-apt-preferences
+
+ [ Sunil Mohan Adapa ]
+ * names: Perform better layout of domain names table on small screens
+ * cockpit: Apply domain name changes immediately
+ * ejabberd: Prevent processing empty domain name
+ * config: Send hostname change signal only after fully processing it
+ * letsencrypt: Don't try to obtain certificates for .local domains
+ * avahi: Expose .local domain as a proper domain
+ * cockpit: Make essential and install by default
+ * tt-rss: Force upgrade to 18.12-1.1 and beyond
+ * doc: Fetch latest manual
+ * README: Add more screenshots, update existing paths
+ * matrixsynapse: Fix apache syntax errors introduce by 4b8b2e171c86d75
+ * users: yapf cosmetic changes
+ * users: Don't delete 'admin' group when running unit tests
+ * users: Minor cosmetic refactoring
+ * users: Don't fail badly when admin group does not exist
+ * users: Minor fix to return value when getting last admin user
+ * users: Cosmetic yapf and isort fixes
+ * updates: Allow matrix-synapse 1.3 to be installed for buster users
+ * javascript: Don't resubmit when refreshing the page
+ * vagrant: Fix dpkg command for recovering from broken state
+ * functional_tests: Fix create snapshot test failure
+ * storage: Fix regression with restoring backups with storage
+
+ [ bn4t ]
+ * matrix-synapse: Use recommended reverse proxy configuration
+
+ -- James Valleroy https://<your freedombox>/deluge. You will need to enter a password to login: https://<your freedombox>/deluge. You will need to enter a password to login: MyWebName.comhttps://MyWebName.comMyWebName.comhttps://MyWebName.comhttps://<your freedombox>/mldonkey. Users belonging to the https://<your freedombox>/mldonkey. Users belonging to the @username:domain. Currently, you will not be able to change the domain once is it configured. @their-username:their-domain. You can also join rooms which are in another server and have audio/video calls with contacts on other server. @username:domain. Currently, you will not be able to change the domain once is it configured. @their-username:their-domain. You can also join rooms which are in another server and have audio/video calls with contacts on other server. internal and external appropriately. nmcli command, see its man page. Also for a full list of configuration settings and type of connections accepted by Network Manager see: nmcli command, see its man page. Also for a full list of configuration settings and type of connections accepted by Network Manager see: ip addr should show a tun0 connection. traceroute freedombox.org should show you the ip address of the VPN server as the first hop. ip addr should show a tun0 connection. traceroute freedombox.org should show you the ip address of the VPN server as the first hop. enable-edit-actions in /etc/privoxy/config to 1. Before doing so, read carefully the manual, especially: EDIT button on the configuration screen in http://config.privoxy.org/. enable-edit-actions in /etc/privoxy/config to 1. Before doing so, read carefully the manual, especially: EDIT button on the configuration screen in http://config.privoxy.org/. irc://irc.debian.org/freedombox. If your FreedomBox is running Connect to Core. Add button to launch Add Core Account dialog. Account Name field. Fill proper DNS hostname of your FreedomBox in Hostname filed. Port field must have the value 4242. Provide the username and password of the account you wish to create to connect to the Quassel Core in the User and Password fields. Choose Remember if don't wish to be prompted for a password every time you launch Quassel client. OK in the Add Core Account dialog, you should see the core account in the Connect to Core dialog. OK to connect to it. Untrusted Security Certificate warning and need to accept the server certificate. Continue. Then you will be asked if you wish to accept the certificate permanently. Select Forever. Core Configuration Wizard. Select Next. Create Admin User page, enter the username and password you have used earlier to create the core connection. Select Remember password to remember this password for future sessions. Click Next. Select Storage Backend page, select SQLite and click Commit. Quassel IRC wizard to configure your IRC connections. Click Next. Setup Identity page next, provide a name and multiple nicknames. This is how you present yourself to other users on IRC. It is not necessary to give your real world name. Multiple nicknames are useful as fallback nicknames when the first nickname can't be used for some reason. After providing the information click Next. Setup Network Connection page next, provide a network name of your choice. Next provide a list of servers to which Quassel Core should connect to in order to join this IRC network (such as irc.debian.org:6667). Edit. In the Server Info dialog, set the port 6697 (consult your network's documentation for actual list of servers and their secure ports) and click Use SSL. Click OK. This is to ensure that communication between your FreedomBox and the IRC network server is encrypted. Setup Network Connection dialog, provide a list of IRC channels (such as #freedombox) to join upon connecting to the network. Click Save & Connect. All Chats pane on the left of the Quassel Client main window. irc://irc.debian.org/freedombox. If your FreedomBox is running Connect to Core. Add button to launch Add Core Account dialog. Account Name field. Fill proper DNS hostname of your FreedomBox in Hostname filed. Port field must have the value 4242. Provide the username and password of the account you wish to create to connect to the Quassel Core in the User and Password fields. Choose Remember if don't wish to be prompted for a password every time you launch Quassel client. OK in the Add Core Account dialog, you should see the core account in the Connect to Core dialog. OK to connect to it. Untrusted Security Certificate warning and need to accept the server certificate. Continue. Then you will be asked if you wish to accept the certificate permanently. Select Forever. Core Configuration Wizard. Select Next. Create Admin User page, enter the username and password you have used earlier to create the core connection. Select Remember password to remember this password for future sessions. Click Next. Select Storage Backend page, select SQLite and click Commit. Quassel IRC wizard to configure your IRC connections. Click Next. Setup Identity page next, provide a name and multiple nicknames. This is how you present yourself to other users on IRC. It is not necessary to give your real world name. Multiple nicknames are useful as fallback nicknames when the first nickname can't be used for some reason. After providing the information click Next. Setup Network Connection page next, provide a network name of your choice. Next provide a list of servers to which Quassel Core should connect to in order to join this IRC network (such as irc.debian.org:6667). Edit. In the Server Info dialog, set the port 6697 (consult your network's documentation for actual list of servers and their secure ports) and click Use SSL. Click OK. This is to ensure that communication between your FreedomBox and the IRC network server is encrypted. Setup Network Connection dialog, provide a list of IRC channels (such as #freedombox) to join upon connecting to the network. Click Save & Connect. All Chats pane on the left of the Quassel Client main window. --export-storage feature that is responsible for data migration. This feature is not available in radicale 2.x unfortunately. --export-storage feature that is responsible for data migration. This feature is not available in radicale 2.x unfortunately. https://<your freedombox>/roundcube. Enter your username and password. The username for many mail services will be the full email address such as https://<your freedombox>/roundcube. Enter your username and password. The username for many mail services will be the full email address such as openssh-server server by default allowing remote logins from all interfaces. If your hardware device is connected to a monitor and a keyboard, you may login directly as well. Regular operation of FreedomBox does not require you to use the shell. However, some tasks or identifying a problem may require you to login to a shell. Admin users are able to log in using ssh (see Logging In below) and have superuser privileges via sudo. sudo ./bin/passwd-in-image <image-file> fbx. fbx with the name of the user you wish to login as. freedombox should be replaced with the hostname or IP address of you FreedomBox device as found in the fbx is the default user present on FreedomBox with superuser privileges. Any other user created using Plinth and belonging to the group admin will be able to login. The root account has no password set and will not be able to login. Access will be denied to all other users. fbx and users in admin group will also be able to login on the terminal directly. Other users will be denied access. libpam-abl package that FreedomBox installs by default. To control this behavior consult libpam-abl documentation. admin username (see above). admin username, and ADDRESS with the hidden service address for your FreedomBox. fbx default user is not managed by Plinth and its password cannot be changed in the web interface. admin username (see above). admin username, and ADDRESS with the hidden service address for your FreedomBox. fbx default user is not managed by Plinth and its password cannot be changed in the web interface. https://<your freedombox>/transmission. When you try to access this page, you will be required to login with a username and password. The default for both is "transmission". You can change the username and password using the configuration form in Plinth. https://<your freedombox>/transmission. When you try to access this page, you will be required to login with a username and password. The default for both is "transmission". You can change the username and password using the configuration form in Plinth. apt-get update asks for a confirmation to change https://<your freedombox>/plinth/apps/xmpp/jsxc/. It will automatically check the BOSH server connection to the configured domain name. https://<your freedombox>/plinth/apps/xmpp/jsxc/. It will automatically check the BOSH server connection to the configured domain name. apt-get update asks for a confirmation to change | Type | -Domain Name | +Domain Name | Services | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ domain.domain_type.display_name }} | -{{ domain.name }} | +{{ domain.name }} | {{ domain.get_readable_services|join:', ' }} |
-
{{ app.name }} |
+ {{ app.count }} |
+ |