freedombox release 26.5.1 for unstable
[dgit distro=debian split] [dgit please-upload source=freedombox version=26.5.1] -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEEfWrbdQ+RCFWJSEvmd8DHXntlCAgFAmnFtskWHGp2YWxsZXJv eUBtYWlsYm94Lm9yZwAKCRB3wMdee2UICNWXD/9lorH6SX2joVjmxa/Ra+fhIojn UjAYM57/t/IMyyrWAi+nojrIhhvhSwHgyi+WKYP2NHsi3BcYrloZ5E+POcE3uhBK Jf8RqOKLbQuXp7ceasP8DgvgA1steAQATJb4LfX5YV+sjwEDfG6aOAc9qM56K06h 4EOGopp+H0SvVhyiRfhLpkBIrQZO3DlksXmkOSbtAupEnAJPgH0foUnlJVPH9qev 93GnSaOECVlfYGzH5K4fJS/9wNFhpG15JG+lBSZRwNIHnU+vLQAC0voB2OFbAmfp qA46Uve3FPBTOzEsUo1wGdhO5L9eaVFuTT4S8AFqxO2wo2zWRNt97nZ2KGkeEh7E IL4WruYrwvxEK7bFmfVcJdE7sWUFI1kCO/KJxb9AmkGVRTAzuZKLGBYzTKEcqWkf bORpOwmlLsf/BhLlcOFPaeYd2q9GGiZUp5waOiGnhiF4VrNqXi1cmb3b5CBznu5H mc38WrpiOSUmZeoc+U/GkJFrVA5uQodfSPTTCaiLeetuEuVlVv+gJyj3xsZ2wUaW C9QJrploalz90XcYuaW44I92tP35mN+k7szcucnUgR6sZMTVINn8qCiXTspbfGJJ Nsa2/5q4wfEY7yuZf65000ET9RLOln8HYMihzsoBwJREt4nqbm/6WGwqHuuDQ3vB DhQacEoLdR5LhU/EcA== =+17i -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEEfWrbdQ+RCFWJSEvmd8DHXntlCAgFAmnJJWAWHGp2YWxsZXJv eUBtYWlsYm94Lm9yZwAKCRB3wMdee2UICDBgEACDxCHbhXeHyve7cGAHlHJlddHP A9qiazqVR7A4pJ9YtO+/PeHCd8gRb844eKa3nf+mcMqjxyhNxPaLuBxd9ujC3n29 UlS29AgRgNA9RJCl+Gu3ySJNy47D2sOj1SEeD7Onu4oP0Rbsn67EMH4e+QflYLdY bX/SeYEpQnYRh/UjYGBQrTI1LjdnCYfcfH9v33jEK3QOnj2S+hCepLdDyLhGMfA+ 2UtztdYjs/pcpl9tB7FXyuthrOrofB8E6IQ09THtjVzJmgbIReKnPkibX8+b7kef cq7A3NRViFsoY8t+OgiDU569gmMfdnIE6uXOdUnM0/w768pFHPiZ02jVEAVZgI4E UG8CAn95vN++xHfH0v33WsZxeC5I0e3h4kcWXTzTAxKcPLIqzinXvTUv2bmR0mvG 8ME4/VQZzZORf9CtRCc5i/0fztO30yqQok59ORrtQEatyHzN78Xf4nd4WjqwFEMz nKWAo79nSrik0hX0N+h4QHby1Qt1Vz1NzBZKSaVD3H/RXiI1n46ivb+BK9+rcoup a6ASxnW2QLE/F8BmCOg4X3CQuELmGmpzzdzlOAdTWTMpcwskVLTmXb843foRJPCj FRnsxre/hHz1vVL5360lfhBBAObc37MMrSGDbawqPI6d2/FYe3zqfPFkn6s8nw2p D7SaLaCfh4yM2Gg2Kg== =U5Dg -----END PGP SIGNATURE----- Merge tag 'debian/26.5.1' into debian/trixie-backports freedombox release 26.5.1 for unstable
58
container
@ -484,6 +484,9 @@ def parse_arguments() -> argparse.Namespace:
|
||||
help='Disk image size to resize to after download')
|
||||
subparser.add_argument('--hkp-client', choices=('gpg', 'wget'),
|
||||
default='gpg', help='Client for key retrieval')
|
||||
subparser.add_argument(
|
||||
'--skip-install', action='store_true',
|
||||
help='Skip running make provision-dev in the container')
|
||||
|
||||
# Print IP address
|
||||
subparser = subparsers.add_parser(
|
||||
@ -686,10 +689,27 @@ def _verify_signature(hkp_client: str, data_file: pathlib.Path,
|
||||
|
||||
def _extract_image(compressed_file: pathlib.Path):
|
||||
"""Extract the image file."""
|
||||
decompressed_file = compressed_file.with_suffix('')
|
||||
# Strip the .xz extension, then replace .img with .raw
|
||||
decompressed_file = compressed_file.with_suffix('').with_suffix('.raw')
|
||||
older_image = compressed_file.with_suffix('')
|
||||
|
||||
if decompressed_file.exists():
|
||||
return decompressed_file
|
||||
|
||||
# Rename older image and its corresponding state files.
|
||||
if older_image.exists():
|
||||
logger.info('Renaming .img file to .raw')
|
||||
older_image.rename(decompressed_file)
|
||||
|
||||
for ext in ['.setup', '.provisioned']:
|
||||
old_state = older_image.with_suffix(older_image.suffix + ext)
|
||||
new_state = decompressed_file.with_suffix(
|
||||
decompressed_file.suffix + ext)
|
||||
if old_state.exists():
|
||||
old_state.rename(new_state)
|
||||
|
||||
return decompressed_file
|
||||
|
||||
logger.info('Decompressing file %s', compressed_file)
|
||||
partial_file = compressed_file.with_suffix('.partial')
|
||||
with partial_file.open('w', encoding='utf-8') as file_handle:
|
||||
@ -712,7 +732,8 @@ def _get_compressed_image_path(distribution: str) -> pathlib.Path:
|
||||
def _get_image_file(distribution: str) -> pathlib.Path:
|
||||
"""Return the path of the image file."""
|
||||
compressed_image = _get_compressed_image_path(distribution)
|
||||
return compressed_image.with_suffix('')
|
||||
# Strip the .xz extension, then replace .img with .raw
|
||||
return compressed_image.with_suffix('').with_suffix('.raw')
|
||||
|
||||
|
||||
def _get_project_folder() -> pathlib.Path:
|
||||
@ -946,7 +967,7 @@ def _setup_ssh(image_file: pathlib.Path):
|
||||
_runc(image_file, ['chown', 'fbx:fbx', '/home/fbx/.ssh/authorized_keys'])
|
||||
|
||||
|
||||
def _setup_image(image_file: pathlib.Path):
|
||||
def _setup_image(image_file: pathlib.Path, skip_install: bool = False):
|
||||
"""Prepare the image for execution."""
|
||||
setup_file = image_file.with_suffix(image_file.suffix + '.setup')
|
||||
if setup_file.exists():
|
||||
@ -958,9 +979,10 @@ def _setup_image(image_file: pathlib.Path):
|
||||
_runc(image_file, ['tee', '/etc/apt/apt.conf.d/20auto-upgrades'],
|
||||
input=contents.encode())
|
||||
|
||||
logger.info('In image: Disabling FreedomBox service')
|
||||
_runc(image_file, ['systemctl', 'disable', 'plinth'],
|
||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
if not skip_install:
|
||||
logger.info('In image: Disabling FreedomBox service')
|
||||
_runc(image_file, ['systemctl', 'disable', 'plinth'],
|
||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
|
||||
logger.info('In image: Creating virtiofs mount at /freedombox')
|
||||
mount = '''[Unit]
|
||||
@ -1018,15 +1040,19 @@ def _is_provisioned(distribution: str) -> bool:
|
||||
return provision_file.exists()
|
||||
|
||||
|
||||
def _provision(image_file: pathlib.Path, machine_type: str, distribution: str):
|
||||
def _provision(image_file: pathlib.Path, machine_type: str, distribution: str,
|
||||
skip_install: bool = False):
|
||||
"""Run app setup inside the container."""
|
||||
if _is_provisioned(distribution):
|
||||
return
|
||||
|
||||
machine = Machine.get_instance(machine_type, distribution)
|
||||
ssh_command = machine.get_ssh_command()
|
||||
subprocess.run(ssh_command + ['bash'], check=True,
|
||||
input=PROVISION_SCRIPT.encode())
|
||||
if skip_install:
|
||||
logger.info('Skipping provision step (--skip-install)')
|
||||
else:
|
||||
machine = Machine.get_instance(machine_type, distribution)
|
||||
ssh_command = machine.get_ssh_command()
|
||||
subprocess.run(ssh_command + ['bash'], check=True,
|
||||
input=PROVISION_SCRIPT.encode())
|
||||
|
||||
provision_file = image_file.with_suffix(image_file.suffix + '.provisioned')
|
||||
provision_file.touch()
|
||||
@ -1329,9 +1355,8 @@ VirtualEthernet=yes
|
||||
if result.returncode:
|
||||
raise Exception(f'Image file {image_link} is not a symlink.')
|
||||
|
||||
subprocess.run(['sudo', 'rm', '--force',
|
||||
str(image_link)], check=False)
|
||||
|
||||
# May be linked to wrong place (such as old .img file)
|
||||
subprocess.run(['sudo', 'rm', '--force', str(image_link)], check=False)
|
||||
subprocess.run([
|
||||
'sudo', 'ln', '--symbolic',
|
||||
str(image_file.resolve()),
|
||||
@ -1476,10 +1501,11 @@ def subcommand_start(arguments: argparse.Namespace):
|
||||
arguments.hkp_client)
|
||||
_resize_disk_image(image_file, arguments.image_size,
|
||||
arguments.distribution)
|
||||
_setup_image(image_file)
|
||||
_setup_image(image_file, arguments.skip_install)
|
||||
machine.setup()
|
||||
machine.launch()
|
||||
_provision(image_file, arguments.machine_type, arguments.distribution)
|
||||
_provision(image_file, arguments.machine_type, arguments.distribution,
|
||||
arguments.skip_install)
|
||||
_print_banner(arguments.machine_type, arguments.distribution)
|
||||
|
||||
|
||||
|
||||
112
debian/changelog
vendored
@ -1,3 +1,115 @@
|
||||
freedombox (26.5.1) unstable; urgency=medium
|
||||
|
||||
[ Burak Yavuz ]
|
||||
* Translated using Weblate (Turkish)
|
||||
|
||||
[ Besnik Bleta ]
|
||||
* Translated using Weblate (Albanian)
|
||||
|
||||
[ Sunil Mohan Adapa ]
|
||||
* debian/control: Fix building with nocheck profile (Closes: #1131956)
|
||||
* debian/copyright: Drop a removed file, correct path for another
|
||||
* web_server: Fix locating SVG icons on production setup (Closes: #1131892)
|
||||
|
||||
-- James Valleroy <jvalleroy@mailbox.org> Thu, 26 Mar 2026 18:21:43 -0400
|
||||
|
||||
freedombox (26.5) unstable; urgency=medium
|
||||
|
||||
[ OwlGale ]
|
||||
* Translated using Weblate (Russian)
|
||||
|
||||
[ Frederico Gomes ]
|
||||
* wireguard: Remove client entry for F-Droid which is not available
|
||||
* wireguard: Update windows client link
|
||||
* wireguard: Add button for direct APK download
|
||||
* wireguard: Add entries for Homebrew and RPM packages
|
||||
* clients: Fix formatting of package row in table
|
||||
* wireguard: Fix freedombox VPN IP for services
|
||||
|
||||
[ Sunil Mohan Adapa ]
|
||||
* clients: Fix show empty clients in Desktop section
|
||||
* apache: Minor improvement to getting the request host
|
||||
* letsencrypt: Don't perform operations on apps that are not installed
|
||||
* tests: functional: Drop undefined 'sso' pytest mark
|
||||
* ui: Simplify SVG app icons for using them inline in HTML
|
||||
* ui: Use inline SVG images for app icons for dark mode adaptation
|
||||
* html: Drop type attribute value of text/javascript
|
||||
* html: Drop trailing slash from void elements
|
||||
* clients: Use SVG icons when showing external links
|
||||
* ui: Use inline SVG icons for system and help section page
|
||||
* ui: Add rest of the icons used from fork-awesome set
|
||||
* ui: Use inline SVG icons for breadcrumbs
|
||||
* ui: Use inline SVG icons for app toolbar
|
||||
* ui: Use inline SVG icons for notification dropdown
|
||||
* ui: Use inline SVG icons for internal zone message
|
||||
* names: Use inline SVG icons for main app page
|
||||
* featherwiki: Use inline SVG icons for app
|
||||
* tiddlywiki: Use inline SVG icons for app
|
||||
* wireguard: Use inline SVG icons
|
||||
* dynamicdns: Use inline SVG icons
|
||||
* help: Use inline SVG icons
|
||||
* ui: Use inline SVG icons for port forwarding info
|
||||
* power: Use inline SVG icons
|
||||
* pagekite: Use inline SVG icons
|
||||
* pagekite: Fix issue with adding custom services
|
||||
* ikiwiki: Use inline SVG icons
|
||||
* samba: Use inline SVG icons
|
||||
* miniflux: Use inline SVG icons
|
||||
* users: Use inline SVG icons
|
||||
* email: Use inline SVG icons
|
||||
* help: Use inline SVG icons
|
||||
* matrixsynapse: Use inline SVG icons
|
||||
* bepasty: Use inline SVG icons
|
||||
* calibre: Use inline SVG icons
|
||||
* kiwix: Use inline SVG icons
|
||||
* security: Use inline SVG icons
|
||||
* sharing: Use inline SVG icons
|
||||
* snapshot: Use inline SVG icons
|
||||
* diagnostics: Use inline SVG icons
|
||||
* storage: Use inline SVG icons
|
||||
* gitweb: Use inline SVG icons
|
||||
* ui: Use inline SVG icons for tag search
|
||||
* ui: Use inline SVG icons for clients launch buttons
|
||||
* networks: Use inline SVG icons
|
||||
* firstboot: Use inline SVG icons
|
||||
* ui: Use inline SVG icons for app's service-not-running message
|
||||
* ui: Use inline SVG icons for app's log page
|
||||
* ui: Use inline SVG icons for operation waiting notification
|
||||
* backups: Use inline SVG icons
|
||||
* ui: Use inline SVG icons for app install page
|
||||
* ui: Use inline SVG icons for all collapse buttons
|
||||
* ui: Use inline SVG icons for all spinners
|
||||
* ui: Use inline SVG icons for all error/warn/info/success messages
|
||||
* ui: Better placement for dropdown indicator in dropdown button
|
||||
* ui: Use inline SVG icons for navigation bar at the top
|
||||
* upgrades: Use inline SVG icons
|
||||
* ui: Use inline SVG icons for theme switcher menu
|
||||
* ui: Drop fonts-fork-awesome as dependency
|
||||
* ui: Rename 'plinth_extras' template tags module to 'extras'
|
||||
* janus: Drop unused reference to font-awesome
|
||||
* doc: Reduce verbosity when building documentation
|
||||
* app: Fix build issue with Django 5.x (Closes: #1131272)
|
||||
* apache: Increase OpenID Connect RP session timeout activity
|
||||
* action_utils: Stop associated service when stopping a socket unit
|
||||
* action_utils: Don't restart web interface when installing an app
|
||||
|
||||
[ Daniel Wiik ]
|
||||
* Translated using Weblate (Swedish)
|
||||
|
||||
[ Joseph Nuthalapati ]
|
||||
* container: Add option to skip install
|
||||
* container: Fix image extension to .raw for systemd v260
|
||||
|
||||
[ James Valleroy ]
|
||||
* apache: Use a Uwsgi native socket systemd unit for each app
|
||||
* locale: Update translation strings
|
||||
* doc: Fetch latest manual
|
||||
|
||||
[ Ettore Atalan ]
|
||||
* Translated using Weblate (German)
|
||||
|
||||
-- James Valleroy <jvalleroy@mailbox.org> Mon, 23 Mar 2026 20:25:07 -0400
|
||||
|
||||
freedombox (26.4.2~bpo13+1) trixie-backports; urgency=high
|
||||
|
||||
* Rebuild for trixie-backports.
|
||||
|
||||
3
debian/control
vendored
@ -30,7 +30,7 @@ Build-Depends:
|
||||
python3-configobj <!nocheck>,
|
||||
python3-cryptography <!nocheck>,
|
||||
python3-dbus,
|
||||
python3-django <!nocheck>,
|
||||
python3-django,
|
||||
python3-django-axes <!nocheck>,
|
||||
python3-django-captcha <!nocheck>,
|
||||
# Explictly depend on ipware as it is optional dependecy of django-axes
|
||||
@ -78,7 +78,6 @@ Depends:
|
||||
bind9-dnsutils,
|
||||
curl,
|
||||
debconf,
|
||||
fonts-fork-awesome,
|
||||
# sgdisk is used in storage app to expand GPT disks
|
||||
gdisk,
|
||||
gettext,
|
||||
|
||||
202
debian/copyright
vendored
@ -32,8 +32,7 @@ Copyright: 2012 FreedomBox Foundation
|
||||
Comment: Original Author: Robert Martinez
|
||||
License: GPL-3+
|
||||
|
||||
Files: static/themes/default/icons/app-store.png
|
||||
static/themes/default/icons/app-store.svg
|
||||
Files: static/themes/default/icons/app-store.svg
|
||||
Copyright: Marie Van den Broeck (https://thenounproject.com/marie49/)
|
||||
Comment: https://thenounproject.com/icon/162372/
|
||||
License: CC-BY-SA-3.0
|
||||
@ -101,14 +100,6 @@ Copyright: 2020 Adwaita Icon Theme Authors, GNOME Project
|
||||
Comment: https://github.com/GNOME/adwaita-icon-theme/ http://www.gnome.org
|
||||
License: LGPL-3 or CC-BY-SA-3.0-US
|
||||
|
||||
Files: static/themes/default/icons/f-droid.png
|
||||
static/themes/default/icons/f-droid.svg
|
||||
Copyright: 2012 William Theaker
|
||||
2013 Robert Martinez
|
||||
2015 Andrew Nayenko
|
||||
Comment: https://gitlab.com/fdroid/artwork/blob/master/fdroid-logo-2015/fdroid-logo.svg
|
||||
License: CC-BY-SA-3.0 or GPL-3+
|
||||
|
||||
Files: plinth/modules/featherwiki/static/icons/featherwiki.png
|
||||
plinth/modules/featherwiki/static/icons/featherwiki.svg
|
||||
Copyright: 2022 Robbie Antenesse <dev@alamantus.com>
|
||||
@ -121,15 +112,6 @@ Copyright: 2010 Git Authors
|
||||
Comment: https://github.com/git/git/blob/master/gitweb/static/git-logo.png
|
||||
License: GPL-2
|
||||
|
||||
Files: static/themes/default/icons/google-play.png
|
||||
Copyright: Chameleon Design (https://thenounproject.com/Chamedesign/)
|
||||
Comment: https://thenounproject.com/icon/887917/
|
||||
License: CC-BY-3.0-US
|
||||
|
||||
Files: static/themes/default/icons/gnu-linux.png
|
||||
Copyright: 2017 Cowemoji
|
||||
License: CC0-1.0
|
||||
|
||||
Files: plinth/modules/homeassistant/static/icons/homeassistant.png
|
||||
plinth/modules/homeassistant/static/icons/homeassistant.svg
|
||||
Copyright: Home Assistant Core Developers
|
||||
@ -161,12 +143,6 @@ Copyright: 2020 The other Kiwix guy
|
||||
Comment: https://commons.wikimedia.org/wiki/File:Kiwix_logo_v3.svg
|
||||
License: CC-BY-SA-4.0
|
||||
|
||||
Files: static/themes/default/icons/macos.png
|
||||
static/themes/default/icons/macos.svg
|
||||
Copyright: Vectors Market (https://thenounproject.com/vectorsmarket/)
|
||||
Comment: https://thenounproject.com/icon/1203053/
|
||||
License: CC-BY-SA-3.0
|
||||
|
||||
Files: plinth/modules/matrixsynapse/static/icons/matrixsynapse.png
|
||||
Copyright: 2017 Kishan Raval
|
||||
Comment: https://github.com/thekishanraval/Logos
|
||||
@ -340,12 +316,6 @@ Copyright: 2011-2021 WordPress Contributors
|
||||
Comment: https://github.com/WordPress/wordpress-develop/blob/master/src/wp-admin/images/wordpress-logo.svg
|
||||
License: GPL-2+
|
||||
|
||||
Files: static/themes/default/icons/windows.png
|
||||
static/themes/default/icons/windows.svg
|
||||
Copyright: 2007 ruli (https://thenounproject.com/2007ruli/)
|
||||
Comment: https://thenounproject.com/icon/1206946/
|
||||
License: CC-BY-SA-3.0
|
||||
|
||||
Files: plinth/modules/wireguard/static/icons/wireguard.png
|
||||
plinth/modules/wireguard/static/icons/wireguard.svg
|
||||
Copyright: 2019 WireGuard LLC
|
||||
@ -357,6 +327,85 @@ Copyright: 2008 GNOME icon artists
|
||||
Comment: https://commons.wikimedia.org/wiki/File:Gnome-computer.svg
|
||||
License: LGPL-3+ or CC-BY-SA-3.0
|
||||
|
||||
Files: static/themes/default/icons/adjust.svg
|
||||
static/themes/default/icons/android.svg
|
||||
static/themes/default/icons/arrow-right.svg
|
||||
static/themes/default/icons/ban.svg
|
||||
static/themes/default/icons/bar-chart.svg
|
||||
static/themes/default/icons/bars.svg
|
||||
static/themes/default/icons/bell-o.svg
|
||||
static/themes/default/icons/book.svg
|
||||
static/themes/default/icons/check-circle.svg
|
||||
static/themes/default/icons/check.svg
|
||||
static/themes/default/icons/chevron-right.svg
|
||||
static/themes/default/icons/clock-o.svg
|
||||
static/themes/default/icons/cog.svg
|
||||
static/themes/default/icons/comments.svg
|
||||
static/themes/default/icons/compass.svg
|
||||
static/themes/default/icons/debian.svg
|
||||
static/themes/default/icons/download.svg
|
||||
static/themes/default/icons/eject.svg
|
||||
static/themes/default/icons/exclamation-triangle.svg
|
||||
static/themes/default/icons/external-link.svg
|
||||
static/themes/default/icons/eye-slash.svg
|
||||
static/themes/default/icons/eye.svg
|
||||
static/themes/default/icons/f-droid.svg
|
||||
static/themes/default/icons/files-o.svg
|
||||
static/themes/default/icons/film.svg
|
||||
static/themes/default/icons/flag.svg
|
||||
static/themes/default/icons/freedombox.svg
|
||||
static/themes/default/icons/frown-o.svg
|
||||
static/themes/default/icons/globe-w.svg
|
||||
static/themes/default/icons/gnu-linux.svg
|
||||
static/themes/default/icons/google-play.svg
|
||||
static/themes/default/icons/hdd-o.svg
|
||||
static/themes/default/icons/heartbeat.svg
|
||||
static/themes/default/icons/heart.svg
|
||||
static/themes/default/icons/home.svg
|
||||
static/themes/default/icons/hourglass-o.svg
|
||||
static/themes/default/icons/info-circle.svg
|
||||
static/themes/default/icons/key.svg
|
||||
static/themes/default/icons/life-ring.svg
|
||||
static/themes/default/icons/line-chart.svg
|
||||
static/themes/default/icons/lock.svg
|
||||
static/themes/default/icons/macos.svg
|
||||
static/themes/default/icons/moon.svg
|
||||
static/themes/default/icons/pencil-square-o.svg
|
||||
static/themes/default/icons/plus.svg
|
||||
static/themes/default/icons/power-off.svg
|
||||
static/themes/default/icons/question-circle.svg
|
||||
static/themes/default/icons/refresh.svg
|
||||
static/themes/default/icons/repeat.svg
|
||||
static/themes/default/icons/rocket.svg
|
||||
static/themes/default/icons/shield.svg
|
||||
static/themes/default/icons/signal.svg
|
||||
static/themes/default/icons/smile-o.svg
|
||||
static/themes/default/icons/spinner.svg
|
||||
static/themes/default/icons/star.svg
|
||||
static/themes/default/icons/sun.svg
|
||||
static/themes/default/icons/tags.svg
|
||||
static/themes/default/icons/tag.svg
|
||||
static/themes/default/icons/terminal.svg
|
||||
static/themes/default/icons/th.svg
|
||||
static/themes/default/icons/times.svg
|
||||
static/themes/default/icons/trash-o.svg
|
||||
static/themes/default/icons/trash.svg
|
||||
static/themes/default/icons/upload.svg
|
||||
static/themes/default/icons/user.svg
|
||||
static/themes/default/icons/users.svg
|
||||
static/themes/default/icons/wifi.svg
|
||||
static/themes/default/icons/windows.svg
|
||||
static/themes/default/icons/wrench.svg
|
||||
Copyright: 2018, Fork Awesome
|
||||
Comment: https://github.com/ForkAwesome/Fork-Awesome/tree/master/src/icons/svg/
|
||||
License: OFL-1.1
|
||||
|
||||
Files: static/themes/default/icons/fedora.svg
|
||||
static/themes/default/icons/homebrew.svg
|
||||
Copyright: 2026, Simple Icons
|
||||
Comment: https://github.com/simple-icons/simple-icons/
|
||||
License: CC0-1.0
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2013 Tzafrir Cohen
|
||||
2013-2026 FreedomBox Authors
|
||||
@ -2848,3 +2897,94 @@ License: Zlib
|
||||
.
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
License: OFL-1.1
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
.
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
.
|
||||
PREAMBLE The goals of the Open Font License (OFL) are to stimulate
|
||||
worldwide development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to provide
|
||||
a free and open framework in which fonts may be shared and improved in
|
||||
partnership with others.
|
||||
.
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves.
|
||||
The fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
.
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such.
|
||||
This may include source files, build scripts and documentation.
|
||||
.
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
.
|
||||
"Original Version" refers to the collection of Font Software components
|
||||
as distributed by the Copyright Holder(s).
|
||||
.
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting ? in part or in whole ?
|
||||
any of the components of the Original Version, by changing formats or
|
||||
by porting the Font Software to a new environment.
|
||||
.
|
||||
"Author" refers to any designer, engineer, programmer, technical writer
|
||||
or other person who contributed to the Font Software.
|
||||
.
|
||||
PERMISSION & CONDITIONS
|
||||
.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
.
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
.
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
.
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
.
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
.
|
||||
5) The Font Software, modified or unmodified, in part or in whole, must
|
||||
be distributed entirely under this license, and must not be distributed
|
||||
under any other license. The requirement for fonts to remain under
|
||||
this license does not apply to any document created using the Font
|
||||
Software.
|
||||
.
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are not met.
|
||||
.
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
|
||||
DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
19
doc/Makefile
@ -109,20 +109,25 @@ manual-pages-xml:=$(patsubst %.raw.wiki, %.xml, $(manual-pages-raw-wiki))
|
||||
manual-pages: $(manual-pages-part-html)
|
||||
|
||||
$(manual-pdfs): %.pdf: %.xml
|
||||
xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf -o $(dir $@) $<
|
||||
@echo "[PDF] $<"
|
||||
@xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf -o $(dir $@) $< 2> /dev/null
|
||||
|
||||
$(manual-pages-part-html): %.part.html: %.xml
|
||||
xsltproc /usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml5/docbook.xsl $< | \
|
||||
@echo "[XSLT] $<"
|
||||
@xsltproc /usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml5/docbook.xsl $< 2> /dev/null | \
|
||||
perl -pe 'BEGIN {undef $$/} s/.*<body[^>]*>(.*)<\/body\s*>.*/$$1/si' > $@
|
||||
@rm -f $(dir $@)docbook.css
|
||||
@rm -f docbook.css
|
||||
|
||||
$(manual-xmls) $(manual-pages-xml): %.xml: %.raw.wiki $(SCRIPTS_DIR)/wikiparser.py
|
||||
$(SCRIPTS_DIR)/wikiparser.py $< | xmllint --format - > $@
|
||||
@echo "[WIKIPARSE] $<"
|
||||
@$(SCRIPTS_DIR)/wikiparser.py $< | xmllint --format - > $@
|
||||
|
||||
%.1: %.xml
|
||||
xmlto man $<
|
||||
@echo "[MAN] $<"
|
||||
@xmlto man $< 2> /dev/null
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f $(manual-pages-part-html) $(manual-pages-xml) $(manual-xmls)
|
||||
rm -f $(OUTPUTS)
|
||||
@echo "[RM] {part-htmls} {xmls} {manuals} {outputs}"
|
||||
@rm -f $(manual-pages-part-html) $(manual-pages-xml) $(manual-xmls)
|
||||
@rm -f $(OUTPUTS)
|
||||
|
||||
@ -8,6 +8,3 @@ Webserver
|
||||
|
||||
.. autoclass:: plinth.modules.apache.components.WebserverRoot
|
||||
:members:
|
||||
|
||||
.. autoclass:: plinth.modules.apache.components.Uwsgi
|
||||
:members:
|
||||
|
||||
@ -8,7 +8,46 @@ 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) ==
|
||||
== FreedomBox 26.5 (2026-03-23) ==
|
||||
|
||||
=== Highlights ===
|
||||
|
||||
* action_utils: Don't restart web interface when installing an app
|
||||
* apache: Use a Uwsgi native socket systemd unit for each app
|
||||
* ui: Use inline SVG icons for all apps
|
||||
* wireguard: Fix freedombox VPN IP for services
|
||||
|
||||
=== Other Changes ===
|
||||
|
||||
* action_utils: Stop associated service when stopping a socket unit
|
||||
* apache: Increase OpenID Connect RP session timeout activity
|
||||
* apache: Minor improvement to getting the request host
|
||||
* app: Fix build issue with Django 5.x
|
||||
* clients: Fix formatting of package row in table
|
||||
* clients: Fix show empty clients in Desktop section
|
||||
* clients: Use SVG icons when showing external links
|
||||
* container: Add option to skip install
|
||||
* container: Fix image extension to .raw for systemd v260
|
||||
* doc: Reduce verbosity when building documentation
|
||||
* html: Drop trailing slash from void elements
|
||||
* html: Drop type attribute value of text/javascript
|
||||
* janus: Drop unused reference to font-awesome
|
||||
* letsencrypt: Don't perform operations on apps that are not installed
|
||||
* locale: Update translations for German, Russian, Swedish
|
||||
* pagekite: Fix issue with adding custom services
|
||||
* tests: functional: Drop undefined 'sso' pytest mark
|
||||
* ui: Add rest of the icons used from fork-awesome set
|
||||
* ui: Better placement for dropdown indicator in dropdown button
|
||||
* ui: Drop fonts-fork-awesome as dependency
|
||||
* ui: Rename 'plinth_extras' template tags module to 'extras'
|
||||
* ui: Simplify SVG app icons for using them inline in HTML
|
||||
* ui: Use inline SVG icons for buttons, messages, spinners, etc.
|
||||
* wireguard: Add button for direct APK download
|
||||
* wireguard: Add entries for Homebrew and RPM packages
|
||||
* wireguard: Remove client entry for F-Droid which is not available
|
||||
* wireguard: Update windows client link
|
||||
|
||||
== FreedomBox 26.4.2 (2026-03-08) ==
|
||||
|
||||
=== Highlights ===
|
||||
|
||||
@ -18,7 +57,7 @@ The following are the release notes for each !FreedomBox version.
|
||||
|
||||
* 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
|
||||
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Russian, Turkish
|
||||
* Vagrantfile: Enable public network for bridged networking
|
||||
|
||||
== FreedomBox 26.4 (2026-03-02) ==
|
||||
|
||||
@ -8,7 +8,46 @@ 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) ==
|
||||
== FreedomBox 26.5 (2026-03-23) ==
|
||||
|
||||
=== Highlights ===
|
||||
|
||||
* action_utils: Don't restart web interface when installing an app
|
||||
* apache: Use a Uwsgi native socket systemd unit for each app
|
||||
* ui: Use inline SVG icons for all apps
|
||||
* wireguard: Fix freedombox VPN IP for services
|
||||
|
||||
=== Other Changes ===
|
||||
|
||||
* action_utils: Stop associated service when stopping a socket unit
|
||||
* apache: Increase OpenID Connect RP session timeout activity
|
||||
* apache: Minor improvement to getting the request host
|
||||
* app: Fix build issue with Django 5.x
|
||||
* clients: Fix formatting of package row in table
|
||||
* clients: Fix show empty clients in Desktop section
|
||||
* clients: Use SVG icons when showing external links
|
||||
* container: Add option to skip install
|
||||
* container: Fix image extension to .raw for systemd v260
|
||||
* doc: Reduce verbosity when building documentation
|
||||
* html: Drop trailing slash from void elements
|
||||
* html: Drop type attribute value of text/javascript
|
||||
* janus: Drop unused reference to font-awesome
|
||||
* letsencrypt: Don't perform operations on apps that are not installed
|
||||
* locale: Update translations for German, Russian, Swedish
|
||||
* pagekite: Fix issue with adding custom services
|
||||
* tests: functional: Drop undefined 'sso' pytest mark
|
||||
* ui: Add rest of the icons used from fork-awesome set
|
||||
* ui: Better placement for dropdown indicator in dropdown button
|
||||
* ui: Drop fonts-fork-awesome as dependency
|
||||
* ui: Rename 'plinth_extras' template tags module to 'extras'
|
||||
* ui: Simplify SVG app icons for using them inline in HTML
|
||||
* ui: Use inline SVG icons for buttons, messages, spinners, etc.
|
||||
* wireguard: Add button for direct APK download
|
||||
* wireguard: Add entries for Homebrew and RPM packages
|
||||
* wireguard: Remove client entry for F-Droid which is not available
|
||||
* wireguard: Update windows client link
|
||||
|
||||
== FreedomBox 26.4.2 (2026-03-08) ==
|
||||
|
||||
=== Highlights ===
|
||||
|
||||
@ -18,7 +57,7 @@ The following are the release notes for each !FreedomBox version.
|
||||
|
||||
* 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
|
||||
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Russian, Turkish
|
||||
* Vagrantfile: Enable public network for bridged networking
|
||||
|
||||
== FreedomBox 26.4 (2026-03-02) ==
|
||||
|
||||
@ -3,4 +3,4 @@
|
||||
Package init file.
|
||||
"""
|
||||
|
||||
__version__ = '26.4.1'
|
||||
__version__ = '26.5.1'
|
||||
|
||||
@ -18,9 +18,6 @@ from . import actions
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
UWSGI_ENABLED_PATH = '/etc/uwsgi/apps-enabled/{config_name}.ini'
|
||||
UWSGI_AVAILABLE_PATH = '/etc/uwsgi/apps-available/{config_name}.ini'
|
||||
|
||||
# Flag on disk to indicate if freedombox package was held by
|
||||
# plinth. This is a backup in case the process is interrupted and hold
|
||||
# is not released.
|
||||
@ -123,6 +120,14 @@ def service_disable(service_name: str, check: bool = False):
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
if service_name.endswith('.socket'):
|
||||
# Instead, may need to query the unit for associated .service file.
|
||||
base_name = service_name.rpartition('.')[0]
|
||||
try:
|
||||
service_stop(f'{base_name}.service', check=check)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
|
||||
def service_mask(service_name: str, check: bool = False):
|
||||
"""Mask a service"""
|
||||
@ -310,43 +315,6 @@ class WebserverChange:
|
||||
self.actions_required.add(action_required)
|
||||
|
||||
|
||||
def uwsgi_is_enabled(config_name):
|
||||
"""Return whether a uwsgi config is enabled."""
|
||||
enabled_path = UWSGI_ENABLED_PATH.format(config_name=config_name)
|
||||
return os.path.exists(enabled_path)
|
||||
|
||||
|
||||
def uwsgi_enable(config_name):
|
||||
"""Enable a uwsgi configuration that runs under uwsgi."""
|
||||
if uwsgi_is_enabled(config_name):
|
||||
return
|
||||
|
||||
# uwsgi is started/stopped using init script. We don't know if it can
|
||||
# handle some configuration already running against newly enabled
|
||||
# configuration. So, stop first before enabling new configuration.
|
||||
service_stop('uwsgi')
|
||||
|
||||
enabled_path = UWSGI_ENABLED_PATH.format(config_name=config_name)
|
||||
available_path = UWSGI_AVAILABLE_PATH.format(config_name=config_name)
|
||||
os.symlink(available_path, enabled_path)
|
||||
|
||||
service_enable('uwsgi')
|
||||
service_start('uwsgi')
|
||||
|
||||
|
||||
def uwsgi_disable(config_name):
|
||||
"""Disable a uwsgi configuration that runs under uwsgi."""
|
||||
if not uwsgi_is_enabled(config_name):
|
||||
return
|
||||
|
||||
# If uwsgi is restarted later, it won't stop the just disabled
|
||||
# configuration due to how init scripts are written for uwsgi.
|
||||
service_stop('uwsgi')
|
||||
enabled_path = UWSGI_ENABLED_PATH.format(config_name=config_name)
|
||||
os.unlink(enabled_path)
|
||||
service_start('uwsgi')
|
||||
|
||||
|
||||
def get_addresses() -> list[dict[str, str | bool]]:
|
||||
"""Return a list of IP addresses and hostnames."""
|
||||
addresses = get_ip_addresses()
|
||||
@ -469,9 +437,31 @@ def is_disk_image():
|
||||
return os.path.exists('/var/lib/freedombox/is-freedombox-disk-image')
|
||||
|
||||
|
||||
def run_apt_command(arguments, enable_triggers: bool = False):
|
||||
def run_apt_command(arguments, enable_triggers: bool = False,
|
||||
allow_freedombox_restart=False):
|
||||
"""Run apt-get with provided arguments."""
|
||||
command = ['apt-get', '--assume-yes', '--quiet=2'] + arguments
|
||||
command = []
|
||||
if not allow_freedombox_restart:
|
||||
# Don't restart the freedombox web service. This configuration is only
|
||||
# used when apt command is invoked from freedombox web service itself
|
||||
# (such as during an app's installation/uninstallation).
|
||||
#
|
||||
# If this is not done, a freedombox web service restart is attempted.
|
||||
# needsrestart will wait until the restart is completed. apt command
|
||||
# will wait until needsrestart is completed. The restart mechanism in
|
||||
# service will wait until all currently running threads are completed.
|
||||
# One thread that has invoked this apt command will not finish as it
|
||||
# waits for apt command to finish. This results in a deadlock. Avoid
|
||||
# this by not attempting to restart freedombox web service when apt
|
||||
# command is invoked from freedombox web service.
|
||||
mount_path = '/etc/needrestart/conf.d/freedombox-self.conf'
|
||||
orig_path = f'/usr/share/freedombox{mount_path}'
|
||||
command = [
|
||||
'systemd-run', '--pipe',
|
||||
f'--property=BindReadOnlyPaths={orig_path}:{mount_path}'
|
||||
]
|
||||
|
||||
command += ['apt-get', '--assume-yes', '--quiet=2'] + arguments
|
||||
|
||||
env = os.environ.copy()
|
||||
env['DEBIAN_FRONTEND'] = 'noninteractive'
|
||||
|
||||
@ -574,10 +574,19 @@ class Info(FollowerComponent):
|
||||
except ImproperlyConfigured:
|
||||
# Hack to allow apps to be instantiated without Django
|
||||
# initialization as required by privileged process.
|
||||
return [
|
||||
tag._proxy____args[0] if isinstance(tag, Promise) else tag
|
||||
for tag in self._tags
|
||||
]
|
||||
def _make_str(tag):
|
||||
"""Return the string without casting."""
|
||||
if not isinstance(tag, Promise):
|
||||
return tag
|
||||
|
||||
# Django 4.2
|
||||
if hasattr(tag, '_proxy____args'):
|
||||
return tag._proxy____args[0]
|
||||
|
||||
# Django 5.x
|
||||
return tag._args[0]
|
||||
|
||||
return [_make_str(tag) for tag in self._tags]
|
||||
|
||||
|
||||
class EnableState(LeaderComponent):
|
||||
|
||||
@ -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))
|
||||
|
||||
|
||||
|
||||
@ -24,14 +24,14 @@ class Menu(app.FollowerComponent):
|
||||
name is the label of the menu item.
|
||||
|
||||
icon is the icon to be displayed for the menu item. Icon can be the
|
||||
name of a glyphicon from the Fork Awesome font's icon set:
|
||||
https://forkawesome.github.io/Fork-Awesome/icons/. In this case, the
|
||||
icon name starts with the string 'fa-'. Alternatively, the icon can
|
||||
also be a file under the directory plinth/modules/<app>/static/icons/,
|
||||
provided without an extension. SVG icons are preferred. Currently, both
|
||||
PNG and SVG icons with the same name are used. For example, if the
|
||||
value of icon is 'myicon' and app_id in App class is 'myapp', then two
|
||||
icons files plinth/modules/myapp/static/icons/myicon.svg and
|
||||
name of an SVG icon from the static/theme/icons directory. In this
|
||||
case, the icon name starts with the string 'fa-' (a tribute to the
|
||||
fork-awesome project). Alternatively, the icon can also be a file under
|
||||
the directory plinth/modules/<app>/static/icons/, provided without an
|
||||
extension. SVG icons are preferred. Currently, both PNG and SVG icons
|
||||
with the same name are used. For example, if the value of icon is
|
||||
'myicon' and app_id in App class is 'myapp', then two icons files
|
||||
plinth/modules/myapp/static/icons/myicon.svg and
|
||||
plinth/modules/myapp/static/icons/myicon.png are used in the interface.
|
||||
|
||||
tags is a list of tags that describe the app. Tags help users to find
|
||||
|
||||
@ -230,7 +230,7 @@ CONTENT_SECURITY_POLICY = CSPDict({
|
||||
# scripts).
|
||||
'script-src': "'self'",
|
||||
# Allow inline CSS and CSS files from Freedombox itself.
|
||||
'style-src': "'self'",
|
||||
'style-src': "'self' 'unsafe-inline'",
|
||||
# Web worker sources are allowed only from FreedomBox itself (for
|
||||
# JSXC).
|
||||
'worker-src': "'self'",
|
||||
|
||||
@ -86,7 +86,7 @@ class ApacheApp(app_module.App):
|
||||
|
||||
app_id = 'apache'
|
||||
|
||||
_version = 16
|
||||
_version = 17
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""Create components for the app."""
|
||||
@ -97,8 +97,8 @@ class ApacheApp(app_module.App):
|
||||
self.add(info)
|
||||
|
||||
packages = Packages('packages-apache', [
|
||||
'apache2', 'php-fpm', 'ssl-cert', 'uwsgi', 'uwsgi-plugin-python3',
|
||||
'libapache2-mod-auth-openidc'
|
||||
'apache2', 'php-fpm', 'ssl-cert', 'uwsgi-core',
|
||||
'uwsgi-plugin-python3', 'libapache2-mod-auth-openidc'
|
||||
])
|
||||
self.add(packages)
|
||||
|
||||
@ -134,6 +134,7 @@ class ApacheApp(app_module.App):
|
||||
daemon = Daemon('daemon-apache', 'apache2')
|
||||
self.add(daemon)
|
||||
|
||||
# To be able to disable the old uwsgi init.d script.
|
||||
related_daemon = RelatedDaemon('related-daemon-apache', 'uwsgi')
|
||||
self.add(related_daemon)
|
||||
|
||||
|
||||
@ -210,42 +210,6 @@ class WebserverRoot(app.FollowerComponent):
|
||||
kvstore.delete(self._key_get(), ignore_missing=True)
|
||||
|
||||
|
||||
class Uwsgi(app.LeaderComponent):
|
||||
"""Component to enable/disable uWSGI configuration."""
|
||||
|
||||
def __init__(self, component_id: str, uwsgi_name: str):
|
||||
"""Initialize the uWSGI component.
|
||||
|
||||
component_id should be a unique ID across all components of an app and
|
||||
across all components.
|
||||
|
||||
uwsgi_name is the primary part of the configuration file path which
|
||||
must be enabled/disabled by this component.
|
||||
|
||||
"""
|
||||
super().__init__(component_id)
|
||||
|
||||
self.uwsgi_name = uwsgi_name
|
||||
|
||||
def is_enabled(self) -> bool:
|
||||
"""Return whether the uWSGI configuration is enabled."""
|
||||
return action_utils.uwsgi_is_enabled(self.uwsgi_name) \
|
||||
and action_utils.service_is_enabled('uwsgi')
|
||||
|
||||
def enable(self) -> None:
|
||||
"""Enable the uWSGI configuration."""
|
||||
privileged.uwsgi_enable(self.uwsgi_name)
|
||||
|
||||
def disable(self) -> None:
|
||||
"""Disable the uWSGI configuration."""
|
||||
privileged.uwsgi_disable(self.uwsgi_name)
|
||||
|
||||
def is_running(self) -> bool:
|
||||
"""Return whether the uWSGI daemon is running with configuration."""
|
||||
return action_utils.uwsgi_is_enabled(self.uwsgi_name) \
|
||||
and action_utils.service_is_running('uwsgi')
|
||||
|
||||
|
||||
def diagnose_url(url: str, kind: str | None = None,
|
||||
env: dict[str, str] | None = None,
|
||||
check_certificate: bool = True,
|
||||
|
||||
@ -237,6 +237,30 @@ def _setup_oidc_config():
|
||||
|
||||
Keep the metadata directory and configuration file unreadable by non-admin
|
||||
users since they contain module's crypto secret and OIDC client secret.
|
||||
|
||||
# Session management
|
||||
|
||||
When apps like Syncthing are protected with mod_auth_openidc, there a
|
||||
session maintained using server-side session storage and a cookie on the
|
||||
client side. This session is different from the session managed by the
|
||||
OpenID Connect Provider (FreedomBox web interface). As long as this session
|
||||
is valid, no further authentication mechanisms are triggered.
|
||||
|
||||
When the session expires, if the request is a GET request (due to page
|
||||
reload), the browser is redirected to OP, a fresh token is created, and the
|
||||
page is loaded. However, for POST requests, 401 error is returned and if
|
||||
the application is unaware, it won't do much about it. So, this
|
||||
necessitates keeping the session timeout value high.
|
||||
|
||||
When logout is performed on FreedomBox web interface, mod_auth_openidc
|
||||
cookie is also removed and logout feels instantaneous. However, this won't
|
||||
work for applications not using mod_auth_openidc and for applications
|
||||
hosted on other domains. A better way to do this is to implement OpenID
|
||||
Connect's Back-Channel Logout or using OpenID Connect Session Management.
|
||||
|
||||
For more about session management see:
|
||||
https://github.com/OpenIDC/mod_auth_openidc/wiki/Sessions-and-Timeouts and
|
||||
https://github.com/OpenIDC/mod_auth_openidc/wiki/Session-Management-Settings
|
||||
"""
|
||||
metadata_dir_path.parent.mkdir(mode=0o700, parents=True, exist_ok=True)
|
||||
metadata_dir_path.mkdir(mode=0o700, exist_ok=True)
|
||||
@ -259,6 +283,13 @@ def _setup_oidc_config():
|
||||
OIDCSSLValidateServer Off
|
||||
OIDCProviderMetadataRefreshInterval 86400
|
||||
|
||||
# Expire the mod_auth_openidc session (not the OpenID Conneect Provider
|
||||
# session) after 10 hours of idle with a maximum session duration equal to
|
||||
# the expiry time of the ID token (10 hours). This allows applications such
|
||||
# as FeatherWiki to have long editing sessions before save.
|
||||
OIDCSessionInactivityTimeout 36000
|
||||
OIDCSessionMaxDuration 0
|
||||
|
||||
# Use relative URL to return to the original domain
|
||||
OIDCRedirectURI /apache/oidc/callback
|
||||
OIDCRemoteUserClaim sub
|
||||
@ -331,18 +362,6 @@ def unlink_root(domain: str):
|
||||
action_utils.service_reload('apache2')
|
||||
|
||||
|
||||
@privileged
|
||||
def uwsgi_enable(name: str):
|
||||
"""Enable uWSGI configuration and reload."""
|
||||
action_utils.uwsgi_enable(name)
|
||||
|
||||
|
||||
@privileged
|
||||
def uwsgi_disable(name: str):
|
||||
"""Disable uWSGI configuration and reload."""
|
||||
action_utils.uwsgi_disable(name)
|
||||
|
||||
|
||||
@privileged
|
||||
def domain_setup(domain: str):
|
||||
"""Add site specific configuration for a domain."""
|
||||
|
||||
@ -10,7 +10,7 @@ import pytest
|
||||
|
||||
from plinth import app, kvstore
|
||||
from plinth.diagnostic_check import DiagnosticCheck, Result
|
||||
from plinth.modules.apache.components import (Uwsgi, Webserver, WebserverRoot,
|
||||
from plinth.modules.apache.components import (Webserver, WebserverRoot,
|
||||
check_url, diagnose_url,
|
||||
diagnose_url_on_all)
|
||||
|
||||
@ -326,81 +326,6 @@ def test_webserver_root_uninstall(component_app, enable, disable):
|
||||
assert kvstore.get_default('test-webserver_domain', 'x-value') == 'x-value'
|
||||
|
||||
|
||||
def test_uwsgi_init():
|
||||
"""Test that uWSGI component can be initialized."""
|
||||
with pytest.raises(ValueError):
|
||||
Uwsgi(None, None)
|
||||
|
||||
uwsgi = Uwsgi('test-uwsgi', 'test-config')
|
||||
assert uwsgi.component_id == 'test-uwsgi'
|
||||
assert uwsgi.uwsgi_name == 'test-config'
|
||||
|
||||
|
||||
@patch('plinth.action_utils.service_is_enabled')
|
||||
@patch('plinth.action_utils.uwsgi_is_enabled')
|
||||
def test_uwsgi_is_enabled(uwsgi_is_enabled, service_is_enabled):
|
||||
"""Test that checking uwsgi configuration enabled works."""
|
||||
uwsgi = Uwsgi('test-uwsgi', 'test-config')
|
||||
|
||||
uwsgi_is_enabled.return_value = True
|
||||
service_is_enabled.return_value = True
|
||||
assert uwsgi.is_enabled()
|
||||
uwsgi_is_enabled.assert_has_calls([call('test-config')])
|
||||
service_is_enabled.assert_has_calls([call('uwsgi')])
|
||||
|
||||
service_is_enabled.return_value = False
|
||||
assert not uwsgi.is_enabled()
|
||||
|
||||
uwsgi_is_enabled.return_value = False
|
||||
assert not uwsgi.is_enabled()
|
||||
|
||||
service_is_enabled.return_value = False
|
||||
assert not uwsgi.is_enabled()
|
||||
|
||||
|
||||
@patch('plinth.modules.apache.privileged.uwsgi_enable')
|
||||
def test_uwsgi_enable(enable):
|
||||
"""Test that enabling uwsgi configuration works."""
|
||||
uwsgi = Uwsgi('test-uwsgi', 'test-config')
|
||||
|
||||
uwsgi.enable()
|
||||
enable.assert_has_calls([call('test-config')])
|
||||
|
||||
|
||||
@patch('plinth.modules.apache.privileged.uwsgi_disable')
|
||||
def test_uwsgi_disable(disable):
|
||||
"""Test that disabling uwsgi configuration works."""
|
||||
uwsgi = Uwsgi('test-uwsgi', 'test-config')
|
||||
|
||||
uwsgi.disable()
|
||||
disable.assert_has_calls([call('test-config')])
|
||||
|
||||
|
||||
@patch('plinth.action_utils.service_is_running')
|
||||
@patch('plinth.action_utils.uwsgi_is_enabled')
|
||||
def test_uwsgi_is_running(uwsgi_is_enabled, service_is_running):
|
||||
"""Test checking whether uwsgi is running with a configuration."""
|
||||
uwsgi = Uwsgi('test-uwsgi', 'test-config')
|
||||
|
||||
uwsgi_is_enabled.return_value = True
|
||||
service_is_running.return_value = True
|
||||
assert uwsgi.is_running()
|
||||
uwsgi_is_enabled.assert_has_calls([call('test-config')])
|
||||
service_is_running.assert_has_calls([call('uwsgi')])
|
||||
|
||||
uwsgi_is_enabled.return_value = False
|
||||
service_is_running.return_value = True
|
||||
assert not uwsgi.is_running()
|
||||
|
||||
uwsgi_is_enabled.return_value = True
|
||||
service_is_running.return_value = False
|
||||
assert not uwsgi.is_running()
|
||||
|
||||
uwsgi_is_enabled.return_value = False
|
||||
service_is_running.return_value = False
|
||||
assert not uwsgi.is_running()
|
||||
|
||||
|
||||
@patch('plinth.modules.apache.components.check_url')
|
||||
@patch('plinth.action_utils.get_addresses')
|
||||
def test_diagnose_url(get_addresses, check):
|
||||
@ -473,8 +398,10 @@ def test_diagnose_url(get_addresses, check):
|
||||
def test_check_url(run):
|
||||
"""Test checking whether a URL is accessible."""
|
||||
url = 'http://localhost/test'
|
||||
basic_command = ['curl', '--location', '--cookie', '', '--fail',
|
||||
'--write-out', '%{response_code}']
|
||||
basic_command = [
|
||||
'curl', '--location', '--cookie', '', '--fail', '--write-out',
|
||||
'%{response_code}'
|
||||
]
|
||||
extra_args = {'env': None, 'check': True, 'stdout': -1, 'stderr': -1}
|
||||
|
||||
# Basic
|
||||
|
||||
@ -39,7 +39,7 @@ class DiscoverIDPView(View):
|
||||
return HttpResponseBadRequest(f'Cannot handle "{method}" method')
|
||||
|
||||
oidc_callback_parts = urlparse(oidc_callback)
|
||||
request_host = request.META['HTTP_HOST']
|
||||
request_host = request.get_host()
|
||||
if request_host != oidc_callback_parts.netloc:
|
||||
return HttpResponseBadRequest(
|
||||
f'Cannot redirect from {request_host} to a different host '
|
||||
|
||||
@ -5,10 +5,11 @@
|
||||
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
{% load extras %}
|
||||
|
||||
{% block page_head %}
|
||||
<link type="text/css" rel="stylesheet"
|
||||
href="{% static 'backups/backups.css' %}"/>
|
||||
href="{% static 'backups/backups.css' %}">
|
||||
{% endblock %}
|
||||
|
||||
{% block configuration %}
|
||||
@ -17,28 +18,28 @@
|
||||
<a title="{% trans 'Create a new backup' %}"
|
||||
role="button" class="btn btn-primary"
|
||||
href="{% url 'backups:create' %}">
|
||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||
{% icon 'plus' %}
|
||||
{% trans 'Create Backup' %}
|
||||
</a>
|
||||
|
||||
<a title="{% trans 'Upload and restore a backup archive' %}"
|
||||
role="button" class="btn btn-default"
|
||||
href="{% url 'backups:upload' %}">
|
||||
<span class="fa fa-upload" aria-hidden="true"></span>
|
||||
{% icon 'upload' %}
|
||||
{% trans 'Upload and Restore' %}
|
||||
</a>
|
||||
|
||||
<a title="{% trans 'Add a backup location' %}"
|
||||
role="button" class="btn btn-default"
|
||||
href="{% url 'backups:add-repository' %}">
|
||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||
{% icon 'plus' %}
|
||||
{% trans 'Add Backup Location' %}
|
||||
</a>
|
||||
|
||||
<a title="{% trans 'Add a remote backup location' %}"
|
||||
role="button" class="btn btn-default"
|
||||
href="{% url 'backups:add-remote-repository' %}">
|
||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||
{% icon 'plus' %}
|
||||
{% trans 'Add Remote Backup Location' %}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@ -6,9 +6,10 @@
|
||||
{% load bootstrap %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
{% load extras %}
|
||||
|
||||
{% block page_js %}
|
||||
<script type="text/javascript" src="{% static 'backups/backups_add_remote_repository.js' %}"
|
||||
<script src="{% static 'backups/backups_add_remote_repository.js' %}"
|
||||
defer></script>
|
||||
{% endblock %}
|
||||
|
||||
@ -127,7 +128,7 @@
|
||||
|
||||
<div class="alert alert-warning d-flex align-items-center" role="alert">
|
||||
<div class="me-2">
|
||||
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
|
||||
{% icon 'exclamation-triangle' %}
|
||||
<span class="visually-hidden">{% trans "Caution:" %}</span>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
{% endcomment %}
|
||||
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
<div class="table-responsive repository" data-repository-name="{{ repository.name }}">
|
||||
<table class="table" class="archives-list">
|
||||
@ -12,14 +13,13 @@
|
||||
<div class="d-sm-flex flex-sm-row">
|
||||
<div class="flex-sm-grow-1 lh-lg collapsible-button"
|
||||
data-bs-toggle="collapse" data-bs-target="#{{ uuid }}">
|
||||
<span class="fa fa-chevron-right fa-fw" aria-hidden="true"></span>
|
||||
{% icon 'chevron-right' %}
|
||||
{% if repository.error %}
|
||||
<span class="fa fa-exclamation-triangle mount-error"
|
||||
aria-hidden="true" title="{{ repository.error }}">
|
||||
</span>
|
||||
<span title={{ repository.error }}>
|
||||
{% icon 'exclamation-triangle' %}</span>
|
||||
{% elif repository.is_encrypted %}
|
||||
<span class="fa fa-lock encrypted"
|
||||
aria-hidden="true" title="{% trans "This repository is encrypted" %}">
|
||||
<span title="{% trans "This repository is encrypted" %}">
|
||||
{% icon 'lock' class='svg-icon encrypted' %}
|
||||
</span>
|
||||
{% endif %}
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
<div class="text-end">
|
||||
<a class="repository-schedule btn btn-sm btn-primary"
|
||||
href="{% url 'backups:schedule' uuid %}">
|
||||
<span class="fa fa-clock-o" aria-hidden="true"></span>
|
||||
{% icon 'clock-o' %}
|
||||
{% trans "Schedule" %}
|
||||
</a>
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-sm btn-default"
|
||||
title="{% trans 'Unmount Location' %}">
|
||||
<span class="fa fa-eject" aria-hidden="true"></span>
|
||||
{% icon 'eject' %}
|
||||
</button>
|
||||
</form>
|
||||
|
||||
@ -53,7 +53,7 @@
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-sm btn-default"
|
||||
title="{% trans 'Mount Location' %}">
|
||||
<span class="fa fa-eye" aria-hidden="true"></span>
|
||||
{% icon 'eye' %}
|
||||
</button>
|
||||
</form>
|
||||
|
||||
@ -66,7 +66,7 @@
|
||||
<a title="{% trans 'Remove Backup Location. This will not delete the remote backup.' %}"
|
||||
role="button" class="repository-remove btn btn-sm btn-default"
|
||||
href="{% url 'backups:repository-remove' uuid %}">
|
||||
<span class="fa fa-trash-o" aria-hidden="true"></span>
|
||||
{% icon 'trash-o' %}
|
||||
</a>
|
||||
|
||||
{% endif %}
|
||||
@ -93,8 +93,7 @@
|
||||
</a>
|
||||
<a class="archive-delete btn btn-sm btn-default"
|
||||
href="{% url 'backups:delete' uuid archive.name %}">
|
||||
<span class="fa fa-trash-o" aria-hidden="true">
|
||||
</span>
|
||||
{% icon 'trash-o' %}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
|
||||
{% load bootstrap %}
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block page_head %}
|
||||
{% endblock %}
|
||||
@ -24,7 +25,7 @@
|
||||
{% if max_filesize %}
|
||||
<div class="alert alert-warning d-flex align-items-center" role="alert">
|
||||
<div class="me-2">
|
||||
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
|
||||
{% icon 'exclamation-triangle' %}
|
||||
<span class="visually-hidden">{% trans "Caution:" %}</span>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
|
||||
{% load bootstrap %}
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -23,7 +24,7 @@
|
||||
{% if form.keyscan_error %}
|
||||
<div class="alert alert-danger d-flex align-items-center">
|
||||
<div class="me-2">
|
||||
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
|
||||
{% icon 'exclamation-triangle' %}
|
||||
<span class="visually-hidden">{% trans "Caution:" %}</span>
|
||||
</div>
|
||||
<pre class="mb-0">{{ form.keyscan_error }}</pre>
|
||||
@ -42,7 +43,7 @@
|
||||
<p>
|
||||
<a class="btn btn-default collapsed collapsible-button"
|
||||
data-bs-toggle="collapse" href="#help" aria-expanded="false">
|
||||
<span class="fa fa-chevron-right fa-fw" aria-hidden="true"></span>
|
||||
{% icon 'chevron-right' %}
|
||||
{% trans "How to verify?" %}
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@ -6,10 +6,12 @@ from django.utils.translation import gettext_lazy as _
|
||||
from plinth import app as app_module
|
||||
from plinth import frontpage, menu
|
||||
from plinth.config import DropinConfigs
|
||||
from plinth.modules.apache.components import Uwsgi, Webserver
|
||||
from plinth.daemon import Daemon
|
||||
from plinth.modules.apache.components import Webserver
|
||||
from plinth.modules.backups.components import BackupRestore
|
||||
from plinth.modules.firewall.components import Firewall
|
||||
from plinth.package import Packages
|
||||
from plinth.privileged import service as service_privileged
|
||||
|
||||
from . import manifest, privileged
|
||||
|
||||
@ -48,7 +50,7 @@ class BepastyApp(app_module.App):
|
||||
|
||||
app_id = 'bepasty'
|
||||
|
||||
_version = 3
|
||||
_version = 4
|
||||
|
||||
def __init__(self) -> None:
|
||||
"""Create components for the app."""
|
||||
@ -83,8 +85,9 @@ class BepastyApp(app_module.App):
|
||||
ports=['http', 'https'], is_external=True)
|
||||
self.add(firewall)
|
||||
|
||||
uwsgi = Uwsgi('uwsgi-bepasty', 'bepasty-freedombox')
|
||||
self.add(uwsgi)
|
||||
daemon = Daemon('daemon-bepasty',
|
||||
'uwsgi-app@bepasty-freedombox.socket')
|
||||
self.add(daemon)
|
||||
|
||||
webserver = Webserver('webserver-bepasty', 'bepasty-freedombox',
|
||||
urls=['https://{host}/bepasty/'])
|
||||
@ -107,6 +110,16 @@ class BepastyApp(app_module.App):
|
||||
# value.
|
||||
privileged.set_default(['read'])
|
||||
|
||||
if old_version and old_version <= 3:
|
||||
webserver = self.get_component('webserver-bepasty')
|
||||
daemon = self.get_component('daemon-bepasty')
|
||||
if webserver.is_enabled():
|
||||
daemon.enable()
|
||||
|
||||
# Vanquish the old uwsgi init.d script.
|
||||
service_privileged.disable('uwsgi')
|
||||
service_privileged.mask('uwsgi')
|
||||
|
||||
def uninstall(self):
|
||||
"""De-configure and uninstall the app."""
|
||||
super().uninstall()
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
[Service]
|
||||
User=bepasty
|
||||
Group=bepasty
|
||||
StateDirectory=bepasty
|
||||
LoadCredential=bepasty-freedombox.conf:/etc/bepasty-freedombox.conf
|
||||
@ -12,5 +12,5 @@
|
||||
</Location>
|
||||
|
||||
<Location /bepasty/>
|
||||
ProxyPass unix:/run/uwsgi/app/bepasty-freedombox/socket|uwsgi://bepasty/
|
||||
ProxyPass unix:/run/uwsgi/bepasty-freedombox.socket|uwsgi://bepasty/
|
||||
</Location>
|
||||
|
||||
@ -25,7 +25,7 @@ lazy-apps = true
|
||||
|
||||
# Module to import
|
||||
module = bepasty.wsgi
|
||||
env = BEPASTY_CONFIG=/etc/bepasty-freedombox.conf
|
||||
env = BEPASTY_CONFIG=$(CREDENTIALS_DIRECTORY)/bepasty-freedombox.conf
|
||||
|
||||
pythonpath = /usr/lib/python3/dist-packages/
|
||||
buffer-size = 32768
|
||||
|
||||
@ -15,9 +15,9 @@ backup = {
|
||||
'files': ['/etc/bepasty-freedombox.conf']
|
||||
},
|
||||
'data': {
|
||||
'directories': ['/var/lib/bepasty']
|
||||
'directories': ['/var/lib/bepasty', '/var/lib/private/bepasty']
|
||||
},
|
||||
'services': ['uwsgi'],
|
||||
'services': ['uwsgi-app@bepasty-freedombox.socket'],
|
||||
}
|
||||
|
||||
tags = [_('File sharing'), _('Pastebin')]
|
||||
|
||||
@ -2,11 +2,8 @@
|
||||
"""Configuration helper for bepasty."""
|
||||
|
||||
import collections
|
||||
import grp
|
||||
import json
|
||||
import os
|
||||
import pathlib
|
||||
import pwd
|
||||
import secrets
|
||||
import shutil
|
||||
import string
|
||||
@ -17,11 +14,10 @@ from plinth import action_utils
|
||||
from plinth.actions import privileged, secret_str
|
||||
from plinth.modules import bepasty
|
||||
|
||||
DATA_DIR = '/var/lib/bepasty'
|
||||
|
||||
PASSWORD_LENGTH = 20
|
||||
|
||||
CONF_FILE = pathlib.Path('/etc/bepasty-freedombox.conf')
|
||||
DATA_DIR = '/var/lib/private/bepasty'
|
||||
PASSWORD_LENGTH = 20
|
||||
SERVICE_NAME = 'uwsgi-app@bepasty-freedombox.service'
|
||||
|
||||
|
||||
def _augeas_load():
|
||||
@ -66,26 +62,6 @@ def conf_file_write(conf):
|
||||
@privileged
|
||||
def setup(domain_name: str):
|
||||
"""Post installation actions for bepasty."""
|
||||
# Create bepasty group if needed.
|
||||
try:
|
||||
grp.getgrnam('bepasty')
|
||||
except KeyError:
|
||||
action_utils.run(['addgroup', '--system', 'bepasty'], check=True)
|
||||
|
||||
# Create bepasty user if needed.
|
||||
try:
|
||||
pwd.getpwnam('bepasty')
|
||||
except KeyError:
|
||||
action_utils.run([
|
||||
'adduser', '--system', '--ingroup', 'bepasty', '--home',
|
||||
'/var/lib/bepasty', '--gecos', 'bepasty file sharing', 'bepasty'
|
||||
], check=True)
|
||||
|
||||
# Create data directory if needed.
|
||||
if not os.path.exists(DATA_DIR):
|
||||
os.makedirs(DATA_DIR, mode=0o750)
|
||||
shutil.chown(DATA_DIR, user='bepasty', group='bepasty')
|
||||
|
||||
# Create configuration file if needed.
|
||||
if not CONF_FILE.is_file():
|
||||
passwords = [_generate_password() for _ in range(3)]
|
||||
@ -112,7 +88,11 @@ def setup(domain_name: str):
|
||||
}
|
||||
conf_file_write(conf)
|
||||
CONF_FILE.chmod(0o640)
|
||||
shutil.chown(CONF_FILE, user='bepasty', group='bepasty')
|
||||
|
||||
# Migrate from old bepasty:bepasty ownership to root:root
|
||||
shutil.chown(CONF_FILE, user='root', group='root')
|
||||
action_utils.run(['deluser', 'bepasty'], check=False)
|
||||
action_utils.run(['delgroup', 'bepasty'], check=False)
|
||||
|
||||
|
||||
@privileged
|
||||
@ -132,7 +112,8 @@ def add_password(permissions: list[str], comment: str | None = None):
|
||||
conf['PERMISSION_COMMENTS'][password] = comment
|
||||
|
||||
conf_file_write(conf)
|
||||
action_utils.service_try_restart('uwsgi')
|
||||
# Service is started again by socket.
|
||||
action_utils.service_stop(SERVICE_NAME)
|
||||
|
||||
|
||||
@privileged
|
||||
@ -145,7 +126,7 @@ def remove_password(password: secret_str):
|
||||
if password in conf['PERMISSION_COMMENTS']:
|
||||
del conf['PERMISSION_COMMENTS'][password]
|
||||
conf_file_write(conf)
|
||||
action_utils.service_try_restart('uwsgi')
|
||||
action_utils.service_stop(SERVICE_NAME)
|
||||
|
||||
|
||||
@privileged
|
||||
@ -153,7 +134,7 @@ def set_default(permissions: list[str]):
|
||||
"""Set default permissions."""
|
||||
conf = {'DEFAULT_PERMISSIONS': _format_permissions(permissions)}
|
||||
conf_file_write(conf)
|
||||
action_utils.service_try_restart('uwsgi')
|
||||
action_utils.service_stop(SERVICE_NAME)
|
||||
|
||||
|
||||
def _format_permissions(permissions=None):
|
||||
@ -173,5 +154,3 @@ def uninstall():
|
||||
"""Remove bepasty user, group and data."""
|
||||
shutil.rmtree(DATA_DIR, ignore_errors=True)
|
||||
CONF_FILE.unlink(missing_ok=True)
|
||||
action_utils.run(['deluser', 'bepasty'], check=False)
|
||||
action_utils.run(['delgroup', 'bepasty'], check=False)
|
||||
|
||||
@ -1,81 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 512 512"
|
||||
id="svg3384"
|
||||
version="1.1"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
sodipodi:docname="bepasty.svg"
|
||||
inkscape:export-filename="bepasty.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90">
|
||||
<metadata
|
||||
id="metadata3392">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3390">
|
||||
<linearGradient
|
||||
id="linearGradient4986"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4988" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2220"
|
||||
inkscape:window-height="1580"
|
||||
id="namedview3388"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.45479912"
|
||||
inkscape:cx="-148.23239"
|
||||
inkscape:cy="423.53358"
|
||||
inkscape:window-x="819"
|
||||
inkscape:window-y="309"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg3384"
|
||||
scale-x="2.1" />
|
||||
viewBox="0 0 512 512">
|
||||
<path
|
||||
d="m 455.13594,110.31437 q 7.96543,7.96544 13.65503,21.62047 5.6896,13.65504 5.6896,25.03423 v 327.72086 q 0,11.3792 -7.96544,19.34463 Q 458.5497,512 447.1705,512 H 64.8295 q -11.3792,0 -19.34463,-7.96544 -7.96544,-7.96543 -7.96544,-19.34463 V 29.522074 q 0,-11.379196 7.96544,-19.344634 Q 53.4503,2.212003 64.8295,2.212003 h 254.894 q 11.3792,0 25.03423,5.6895981 13.65504,5.6895979 21.62047,13.6550359 z M 328.82686,40.901271 V 147.86572 H 435.7913 q -2.8448,-8.24992 -6.25856,-11.66368 L 340.49053,47.159829 Q 337.07677,43.74607 328.82686,40.901271 Z M 438.06714,475.58657 V 184.27914 H 319.7235 q -11.3792,0 -19.34463,-7.96543 -7.96544,-7.96544 -7.96544,-19.34464 V 38.625431 H 73.93286 V 475.58657 Z"
|
||||
id="path3386"
|
||||
style="fill:#0000ff;stroke-width:0.28447992"
|
||||
inkscape:connector-curvature="0" />
|
||||
style="fill:#0000ff;stroke-width:0.28447992" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:3.41375899px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.28447992px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="21.294685"
|
||||
y="467.65359"
|
||||
id="text3394"
|
||||
transform="scale(0.95420813,1.0479894)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3396"
|
||||
x="21.294685"
|
||||
y="467.65359"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:641.4967041px;line-height:1.25;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">B</tspan></text>
|
||||
@ -83,43 +19,20 @@
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:3.41375899px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.28447992px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="402.81888"
|
||||
y="219.26285"
|
||||
id="text3398"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3400"
|
||||
y="219.26285"><tspan
|
||||
x="402.81888"
|
||||
y="219.26285"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">p</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="402.81888"
|
||||
y="278.71915"
|
||||
id="tspan3402"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">a</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="402.81888"
|
||||
y="338.17545"
|
||||
id="tspan3404"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">s</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="402.81888"
|
||||
y="397.63174"
|
||||
id="tspan3406"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">t</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="402.81888"
|
||||
y="457.08804"
|
||||
id="tspan3408"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">y</tspan></text>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
inkscape:label="E"
|
||||
style="display:inline;opacity:0.578"
|
||||
transform="translate(0,-1280)" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Deck"
|
||||
style="display:inline;opacity:1"
|
||||
transform="translate(0,-1280)" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 3.4 KiB |
@ -5,6 +5,7 @@
|
||||
|
||||
{% load bootstrap %}
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block configuration %}
|
||||
{{ block.super }}
|
||||
@ -14,7 +15,7 @@
|
||||
<div class="btn-toolbar">
|
||||
<a href="{% url 'bepasty:add' %}" class="btn btn-default"
|
||||
role="button" title="{% trans 'Add password' %}">
|
||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||
{% icon 'plus' %}
|
||||
{% trans 'Add password' %}
|
||||
</a>
|
||||
</div>
|
||||
@ -43,8 +44,10 @@
|
||||
<form class="form form-inline" method="post"
|
||||
action="{% url 'bepasty:remove' password.password %}">
|
||||
{% csrf_token %}
|
||||
<button class="password-remove btn btn-sm btn-default fa fa-trash-o"
|
||||
type="submit"></button>
|
||||
<button class="password-remove btn btn-sm btn-default"
|
||||
type="submit">
|
||||
{% icon 'trash-o' %}
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 33 KiB |
@ -4,6 +4,7 @@
|
||||
{% endcomment %}
|
||||
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block configuration %}
|
||||
{{ block.super }}
|
||||
@ -13,7 +14,7 @@
|
||||
<div class="btn-toolbar">
|
||||
<a href="{% url 'calibre:create-library' %}" class="btn btn-default"
|
||||
role="button" title="{% trans 'Create Library' %}">
|
||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||
{% icon 'plus' %}
|
||||
{% trans 'Create Library' %}
|
||||
</a>
|
||||
</div>
|
||||
@ -35,7 +36,7 @@
|
||||
<a href="{% url 'calibre:delete-library' library %}"
|
||||
class="btn btn-default btn-sm secondary" role="button"
|
||||
title="{% blocktrans %}Delete library {{ library }}{% endblocktrans %}">
|
||||
<span class="fa fa-trash-o" aria-hidden="true"></span>
|
||||
{% icon 'trash-o' %}
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
@ -10,7 +10,7 @@ import pytest
|
||||
|
||||
from plinth.tests import functional
|
||||
|
||||
pytestmark = [pytest.mark.apps, pytest.mark.sso, pytest.mark.calibre]
|
||||
pytestmark = [pytest.mark.apps, pytest.mark.calibre]
|
||||
|
||||
|
||||
class TestCalibreApp(functional.BaseAppTests):
|
||||
|
||||
@ -1,70 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 512 512"
|
||||
version="1.1"
|
||||
id="svg90114"
|
||||
sodipodi:docname="cockpit.svg"
|
||||
width="512"
|
||||
height="512"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata90120">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs90118" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="3628"
|
||||
inkscape:window-height="2133"
|
||||
id="namedview90116"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="1.978022"
|
||||
inkscape:cx="-82.324146"
|
||||
inkscape:cy="2.3236654"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg90114" />
|
||||
height="512">
|
||||
<g
|
||||
id="g867"
|
||||
transform="scale(8)">
|
||||
<path
|
||||
d="M 32,0 C 14.354,0 0,14.353 0,32 0,49.647 14.354,64 32,64 49.646,64 64,49.646 64,32 64,14.354 49.646,0 32,0 Z m 0,4.795 c 15.057,0 27.218,12.148 27.218,27.204 C 59.218,47.055 47.057,59.204 32,59.204 16.944,59.204 4.796,47.056 4.796,32 4.796,16.944 16.944,4.795 32,4.795 Z"
|
||||
style="color:#000000;text-indent:0;text-decoration:none;text-decoration-line:none;text-transform:none;fill:#3465a4;fill-opacity:1;stroke-width:1.36899996"
|
||||
id="path90108"
|
||||
inkscape:connector-curvature="0" />
|
||||
style="color:#000000;text-indent:0;text-decoration:none;text-decoration-line:none;text-transform:none;fill:#3465a4;fill-opacity:1;stroke-width:1.36899996" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccccccccccccccccc"
|
||||
d="m 42.707,18.892 c -1.306,-0.048 -3.285,0.978 -5.064,2.747 l -3.836,3.815 -11.496,-3.86 -2.242,2.314 8.668,6.587 -1.938,1.928 c -0.641243,0.636519 -1.212499,1.33986 -1.704,2.098 l -5.223,-0.39 -1.274,1.292 5.194,3.846 3.798,5.184 1.28,-1.283 -0.386,-5.274 c 0.658,-0.431 1.33,-0.966 1.977,-1.61 l 2.04,-2.029 6.652,8.735 2.314,-2.242 -3.878,-11.552 3.716,-3.695 c 2.372,-2.36 3.465,-5.121 2.451,-6.191 -0.253,-0.268 -0.613,-0.404 -1.049,-0.42 z"
|
||||
id="path90110"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#3465a4;fill-opacity:1;stroke-width:1.36899996" />
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.1 KiB |
@ -1,67 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 512 512"
|
||||
x="0px"
|
||||
y="0px"
|
||||
version="1.1"
|
||||
id="svg12"
|
||||
sodipodi:docname="coturn.svg"
|
||||
width="512"
|
||||
height="512"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
inkscape:export-filename="coturn.png"
|
||||
inkscape:export-xdpi="48"
|
||||
inkscape:export-ydpi="48">
|
||||
<metadata
|
||||
id="metadata18">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Communication, video, call, camera, talk, record, media</dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs16" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1782"
|
||||
inkscape:window-height="1122"
|
||||
id="namedview14"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.73750001"
|
||||
inkscape:cx="23.98607"
|
||||
inkscape:cy="48.884982"
|
||||
inkscape:window-x="1233"
|
||||
inkscape:window-y="454"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg12" />
|
||||
<title
|
||||
id="title2">Communication, video, call, camera, talk, record, media</title>
|
||||
fill="currentColor">
|
||||
<g
|
||||
data-name="Video Call"
|
||||
id="g6"
|
||||
transform="matrix(10.24,0,0,10.24,-71.68,-71.68)">
|
||||
<path
|
||||
d="m 36.1963,35.02 -5,-1 a 0.9967,0.9967 0 0 0 -1.1025,0.5576 l -2.1484,4.6061 a 19.09,19.09 0 0 1 -9.1286,-9.1286 l 4.6061,-2.1483 a 1.0008,1.0008 0 0 0 0.5576,-1.1026 l -1,-5 A 1,1 0 0 0 22,21 h -6 a 1,1 0 0 0 -1,1 21.0508,21.0508 0 0 0 21,21 1,1 0 0 0 1,-1 V 36 A 1,1 0 0 0 36.1963,35.02 Z M 21.8652,26.4258 18.06,28.2009 A 16.9646,16.9646 0 0 1 17.0507,23 h 4.13 z m 9.709,9.709 L 35,36.82 v 4.13 A 17.4236,17.4236 0 0 1 29.8,39.9381 Z M 56.5254,20.1494 A 0.9978,0.9978 0 0 0 55.5527,20.1055 L 45,25.3818 V 19 A 3.0033,3.0033 0 0 0 42,16 H 10 a 3.0033,3.0033 0 0 0 -3,3 v 26 a 3.0033,3.0033 0 0 0 3,3 h 32 a 3.0033,3.0033 0 0 0 3,-3 v -6.3818 l 10.5527,5.2763 A 1,1 0 0 0 57,43 V 21 A 1,1 0 0 0 56.5254,20.1494 Z M 43,45 a 1.0009,1.0009 0 0 1 -1,1 H 10 A 1.0013,1.0013 0 0 1 9,45 V 19 a 1.0013,1.0013 0 0 1 1,-1 h 32 a 1.0009,1.0009 0 0 1 1,1 z m 12,-3.6182 -10,-5 v -8.7636 l 10,-5 z"
|
||||
id="path4"
|
||||
inkscape:connector-curvature="0" />
|
||||
d="m 36.1963,35.02 -5,-1 a 0.9967,0.9967 0 0 0 -1.1025,0.5576 l -2.1484,4.6061 a 19.09,19.09 0 0 1 -9.1286,-9.1286 l 4.6061,-2.1483 a 1.0008,1.0008 0 0 0 0.5576,-1.1026 l -1,-5 A 1,1 0 0 0 22,21 h -6 a 1,1 0 0 0 -1,1 21.0508,21.0508 0 0 0 21,21 1,1 0 0 0 1,-1 V 36 A 1,1 0 0 0 36.1963,35.02 Z M 21.8652,26.4258 18.06,28.2009 A 16.9646,16.9646 0 0 1 17.0507,23 h 4.13 z m 9.709,9.709 L 35,36.82 v 4.13 A 17.4236,17.4236 0 0 1 29.8,39.9381 Z M 56.5254,20.1494 A 0.9978,0.9978 0 0 0 55.5527,20.1055 L 45,25.3818 V 19 A 3.0033,3.0033 0 0 0 42,16 H 10 a 3.0033,3.0033 0 0 0 -3,3 v 26 a 3.0033,3.0033 0 0 0 3,3 h 32 a 3.0033,3.0033 0 0 0 3,-3 v -6.3818 l 10.5527,5.2763 A 1,1 0 0 0 57,43 V 21 A 1,1 0 0 0 56.5254,20.1494 Z M 43,45 a 1.0009,1.0009 0 0 1 -1,1 H 10 A 1.0013,1.0013 0 0 1 9,45 V 19 a 1.0013,1.0013 0 0 1 1,-1 h 32 a 1.0009,1.0009 0 0 1 1,1 z m 12,-3.6182 -10,-5 v -8.7636 l 10,-5 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.1 KiB |
@ -1,82 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="512"
|
||||
height="512"
|
||||
id="svg3440"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
sodipodi:docname="Deluge-Logo.svg"
|
||||
inkscape:export-filename="deluge.png"
|
||||
inkscape:export-xdpi="480"
|
||||
inkscape:export-ydpi="480"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
sodipodi:modified="TRUE"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs3">
|
||||
viewBox="0 0 512 512">
|
||||
<defs>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2973">
|
||||
id="autoidmagic-linearGradient2973">
|
||||
<stop
|
||||
style="stop-color:#eeeeec;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2975" />
|
||||
offset="0" />
|
||||
<stop
|
||||
style="stop-color:#eeeeec;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2977" />
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4126">
|
||||
id="autoidmagic-linearGradient4126">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop4128" />
|
||||
offset="0.0000000" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.16494845;"
|
||||
offset="1.0000000"
|
||||
id="stop4130" />
|
||||
offset="1.0000000" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4114">
|
||||
id="autoidmagic-linearGradient4114">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4116" />
|
||||
offset="0" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4118" />
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3962">
|
||||
id="autoidmagic-linearGradient3962">
|
||||
<stop
|
||||
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop3964" />
|
||||
offset="0.0000000" />
|
||||
<stop
|
||||
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
|
||||
offset="0.15517241"
|
||||
id="stop4134" />
|
||||
offset="0.15517241" />
|
||||
<stop
|
||||
style="stop-color:#4074ae;stop-opacity:1.0000000;"
|
||||
offset="0.75000000"
|
||||
id="stop4346" />
|
||||
offset="0.75000000" />
|
||||
<stop
|
||||
style="stop-color:#36486c;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop3966" />
|
||||
offset="1.0000000" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
r="13.994944"
|
||||
@ -86,9 +55,8 @@
|
||||
cx="-10.089286"
|
||||
gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient4019"
|
||||
xlink:href="#linearGradient3993"
|
||||
inkscape:collect="always" />
|
||||
id="autoidmagic-radialGradient4019"
|
||||
xlink:href="#autoidmagic-linearGradient3993" />
|
||||
<radialGradient
|
||||
r="14.057444"
|
||||
fy="31.329016"
|
||||
@ -97,9 +65,8 @@
|
||||
cx="-10.323107"
|
||||
gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient4004"
|
||||
xlink:href="#linearGradient3993"
|
||||
inkscape:collect="always" />
|
||||
id="autoidmagic-radialGradient4004"
|
||||
xlink:href="#autoidmagic-linearGradient3993" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
|
||||
@ -108,9 +75,8 @@
|
||||
fx="-10.323107"
|
||||
cy="31.329016"
|
||||
cx="-10.323107"
|
||||
id="radialGradient3999"
|
||||
xlink:href="#linearGradient3993"
|
||||
inkscape:collect="always" />
|
||||
id="autoidmagic-radialGradient3999"
|
||||
xlink:href="#autoidmagic-linearGradient3993" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
|
||||
@ -119,35 +85,29 @@
|
||||
fx="61.662098"
|
||||
cy="24.241488"
|
||||
cx="61.662098"
|
||||
id="radialGradient3943"
|
||||
xlink:href="#linearGradient1312"
|
||||
inkscape:collect="always" />
|
||||
id="autoidmagic-radialGradient3943"
|
||||
xlink:href="#autoidmagic-linearGradient1312" />
|
||||
<linearGradient
|
||||
id="linearGradient1312">
|
||||
id="autoidmagic-linearGradient1312">
|
||||
<stop
|
||||
id="stop1314"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop1316"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3993">
|
||||
id="autoidmagic-linearGradient3993">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3995" />
|
||||
offset="0" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0"
|
||||
offset="1"
|
||||
id="stop3997" />
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2973"
|
||||
id="radialGradient3866"
|
||||
xlink:href="#autoidmagic-linearGradient2973"
|
||||
id="autoidmagic-radialGradient3866"
|
||||
cx="-22.375"
|
||||
cy="18.499998"
|
||||
fx="-22.375"
|
||||
@ -163,55 +123,44 @@
|
||||
cy="63.965389"
|
||||
cx="15.115514"
|
||||
gradientTransform="scale(1.64399,0.608276)"
|
||||
id="radialGradient5000"
|
||||
xlink:href="#linearGradient4114"
|
||||
inkscape:collect="always" />
|
||||
id="autoidmagic-radialGradient5000"
|
||||
xlink:href="#autoidmagic-linearGradient4114" />
|
||||
<linearGradient
|
||||
id="linearGradient4989">
|
||||
id="autoidmagic-linearGradient4989">
|
||||
<stop
|
||||
id="stop4991"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#d3e9ff;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4993"
|
||||
offset="0.15517241"
|
||||
style="stop-color:#d3e9ff;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4995"
|
||||
offset="0.75000000"
|
||||
style="stop-color:#4074ae;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4997"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#36486c;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4977">
|
||||
id="autoidmagic-linearGradient4977">
|
||||
<stop
|
||||
id="stop4979"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4981"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:0.16494845;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4825"
|
||||
inkscape:collect="always">
|
||||
id="autoidmagic-linearGradient4825">
|
||||
<stop
|
||||
id="stop4827"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4829"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4114"
|
||||
id="radialGradient6090"
|
||||
xlink:href="#autoidmagic-linearGradient4114"
|
||||
id="autoidmagic-radialGradient6090"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.64399,0.608276)"
|
||||
cx="15.115514"
|
||||
@ -220,9 +169,8 @@
|
||||
fy="63.965389"
|
||||
r="12.289036" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4825"
|
||||
id="radialGradient6098"
|
||||
xlink:href="#autoidmagic-linearGradient4825"
|
||||
id="autoidmagic-radialGradient6098"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="12.071323"
|
||||
cy="12.493138"
|
||||
@ -230,9 +178,8 @@
|
||||
fy="12.493138"
|
||||
r="6.7175145" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2973"
|
||||
id="radialGradient6103"
|
||||
xlink:href="#autoidmagic-linearGradient2973"
|
||||
id="autoidmagic-radialGradient6103"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.25463,-0.898371,0.979785,0.277703,-18.00903,32.03312)"
|
||||
cx="17.903898"
|
||||
@ -241,9 +188,8 @@
|
||||
fy="40.159222"
|
||||
r="14.33681" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2973"
|
||||
id="radialGradient6106"
|
||||
xlink:href="#autoidmagic-linearGradient2973"
|
||||
id="autoidmagic-radialGradient6106"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.583269,-0.431533,0.577146,0.78008,-5.80022,4.004109)"
|
||||
cx="12.525543"
|
||||
@ -252,9 +198,8 @@
|
||||
fy="38.09042"
|
||||
r="14.33681" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1312"
|
||||
id="radialGradient6109"
|
||||
xlink:href="#autoidmagic-linearGradient1312"
|
||||
id="autoidmagic-radialGradient6109"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.768231,1.13675,-0.820972,0.554824,-3.72248,-85.07126)"
|
||||
cx="65.800331"
|
||||
@ -263,9 +208,8 @@
|
||||
fy="27.16758"
|
||||
r="12.972491" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4989"
|
||||
id="radialGradient6115"
|
||||
xlink:href="#autoidmagic-linearGradient4989"
|
||||
id="autoidmagic-radialGradient6115"
|
||||
cx="16.651781"
|
||||
cy="32.187485"
|
||||
fx="16.651781"
|
||||
@ -274,136 +218,40 @@
|
||||
gradientTransform="matrix(1.486175,-1.536108,0.932321,0.902016,-38.10476,31.42646)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="0.17254902"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="302.26512"
|
||||
inkscape:cy="189.18337"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="2004"
|
||||
inkscape:window-height="1280"
|
||||
inkscape:window-x="909"
|
||||
inkscape:window-y="619"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Internet Category</dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:contributor>
|
||||
<cc:Agent>
|
||||
<dc:title>Tuomas Kuosmanen</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:contributor>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>internet</rdf:li>
|
||||
<rdf:li>tools</rdf:li>
|
||||
<rdf:li>applications</rdf:li>
|
||||
<rdf:li>category</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(0,464)">
|
||||
<g
|
||||
id="g874"
|
||||
transform="matrix(10.934561,0,0,10.934561,-15.037742,-474.45489)">
|
||||
<ellipse
|
||||
ry="7.4751287"
|
||||
rx="20.203051"
|
||||
cy="38.908627"
|
||||
cx="24.849752"
|
||||
inkscape:export-ydpi="480"
|
||||
inkscape:export-xdpi="480"
|
||||
transform="matrix(0.947409,0,0,1.17786,1.244375,-6.853427)"
|
||||
id="path4112"
|
||||
style="fill:url(#radialGradient6090);fill-opacity:1;stroke:none;stroke-opacity:1" />
|
||||
style="fill:url(#autoidmagic-radialGradient6090);fill-opacity:1;stroke:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path2069"
|
||||
d="M 23.942923,0.9561338 37.330543,18.266721 C 46.998995,29.84687 41.49692,43.923891 26.7742,45.000491 6.0597413,45.582655 6.5086231,27.37483 11.255313,18.609381 Z"
|
||||
style="fill:url(#radialGradient6115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
style="fill:url(#autoidmagic-radialGradient6115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cscscc"
|
||||
id="path2969"
|
||||
d="M 35.111358,26.143133 C 28.972772,13.030586 17.560684,17.697957 17.274449,26.949974 16.894738,39.223415 34.748874,37.615429 36.715244,41.468778 28.821643,47.675479 14.973233,45.226508 10.962289,39.715204 6.9574776,34.212326 7.2383598,25.630263 10.784249,19.587632 24.158625,0.978654 39.749127,24.383766 35.111358,26.143133 Z"
|
||||
style="fill:#1b4075;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path2071"
|
||||
d="m 23.996861,3.5433428 12.06049,15.6077022 c 8.71239,10.431485 3.361995,23.263047 -9.93217,24.357476 C 7.3917365,44.015286 7.4275065,28.119221 12.17284,20.333442 Z"
|
||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.1000706;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.36612022" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path3945"
|
||||
d="M 23.940758,0.96491709 34.727367,14.909752 c 7.919841,9.482559 5.719937,5.374223 -6.364886,6.369094 C 25.083165,11.203805 18.13871,11.859899 13.523802,15.675236 Z"
|
||||
style="opacity:0.46000001;fill:url(#radialGradient6109);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
style="opacity:0.46000001;fill:url(#autoidmagic-radialGradient6109);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cscscc"
|
||||
id="path3868"
|
||||
d="M 35.159701,26.173667 C 29.021115,13.06112 18.734027,17.978491 18.447792,27.230508 18.068081,39.503949 34.797217,37.645963 36.763587,41.499312 28.869986,47.706013 15.021576,45.257042 11.010632,39.745738 7.0058197,34.24286 7.2867027,25.660797 10.832592,19.618166 24.206968,1.0091879 39.79747,24.4143 35.159701,26.173667 Z"
|
||||
style="fill:url(#radialGradient6106);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
style="fill:url(#autoidmagic-radialGradient6106);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cscscc"
|
||||
id="path4874"
|
||||
d="M 35.120795,26.14195 C 28.553327,12.814962 15.685968,17.224233 15.399733,26.47625 15.020022,38.749691 32.874158,37.141705 34.840528,40.995054 26.946927,47.201755 13.098517,44.752784 9.0875727,39.24148 5.0827617,33.738602 5.3636437,25.156539 8.9095327,19.113908 22.315509,0.47615954 40.03233,23.660113 35.120795,26.14195 Z"
|
||||
style="fill:url(#radialGradient6103);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
style="fill:url(#autoidmagic-radialGradient6103);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<circle
|
||||
r="6.7175145"
|
||||
cy="12.493138"
|
||||
cx="12.071323"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.21999996;fill:url(#radialGradient6098);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
id="path4941"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.21999996;fill:url(#autoidmagic-radialGradient6098);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
transform="matrix(-0.829136,1.052307,1.239307,0.0758326,26.32898,25.58605)" />
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 10 KiB |
@ -4,6 +4,7 @@
|
||||
{% endcomment %}
|
||||
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
@ -72,9 +73,9 @@
|
||||
{% endwith %}
|
||||
{% endfor %}
|
||||
{% elif app_data.exception %}
|
||||
<span class="fa fa-exclamation-triangle mx-1" aria-hidden="true"></span>
|
||||
{% icon 'exclamation-triangle' %}
|
||||
{% else %}
|
||||
<span class="fa fa-hourglass-o mx-1"></span>
|
||||
{% icon 'hourglass-o' %}
|
||||
{% endif %}
|
||||
|
||||
{% if app_data.show_repair %}
|
||||
@ -98,7 +99,7 @@
|
||||
{% elif app_data.exception %}
|
||||
<div class="alert alert-danger d-flex align-items-center" role="alert">
|
||||
<div class="me-2">
|
||||
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
|
||||
{% icon 'exclamation-triangle' %}
|
||||
<span class="visually-hidden">{% trans "Caution:" %}</span>
|
||||
</div>
|
||||
<div>
|
||||
@ -107,7 +108,7 @@
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-center">
|
||||
<span class="fa fa-hourglass-o me-2"></span>
|
||||
{% icon 'hourglass-o' %}
|
||||
{% trans "Running..." %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
@ -6,6 +6,5 @@
|
||||
{% load static %}
|
||||
|
||||
{% block page_js %}
|
||||
<script type="text/javascript" src="{% static 'dynamicdns/dynamicdns.js' %}"
|
||||
defer></script>
|
||||
<script src="{% static 'dynamicdns/dynamicdns.js' %}" defer></script>
|
||||
{% endblock %}
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
|
||||
{% load bootstrap %}
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block extra_content %}
|
||||
<h3>{% trans "Domains" %}</h3>
|
||||
@ -12,7 +13,7 @@
|
||||
<div class="btn-toolbar">
|
||||
<a href="{% url 'dynamicdns:domain-add' %}" class="btn btn-primary"
|
||||
role="button" title="{% trans 'Add Domain' %}">
|
||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||
{% icon 'plus' %}
|
||||
{% trans 'Add Domain' %}
|
||||
</a>
|
||||
</div>
|
||||
@ -72,14 +73,14 @@
|
||||
title="{% blocktrans trimmed with domain=domain.domain %}
|
||||
Edit domain {{ domain }}
|
||||
{% endblocktrans %}">
|
||||
<span class="fa fa-pencil-square-o" aria-hidden="true"></span>
|
||||
{% icon 'pencil-square-o' %}
|
||||
</a>
|
||||
<a href="{% url 'dynamicdns:domain-delete' domain.domain %}"
|
||||
class="btn btn-default btn-sm domain-delete" role="button"
|
||||
title="{% blocktrans trimmed with domain=domain.main %}
|
||||
Delete domain {{ domain }}
|
||||
{% endblocktrans %}">
|
||||
<span class="fa fa-trash" aria-hidden="true"></span>
|
||||
{% icon 'trash' %}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@ -1,52 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg4670"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 512 512"
|
||||
sodipodi:docname="ejabberd.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata4676">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs4674">
|
||||
viewBox="0 0 512 512">
|
||||
<defs>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="1">
|
||||
id="autoidmagic-1">
|
||||
<stop
|
||||
style="stop-color:#3fb2f3;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop5283" />
|
||||
offset="0" />
|
||||
<stop
|
||||
style="stop-color:#49c8c6;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop5285" />
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#1"
|
||||
id="linearGradient5291"
|
||||
xlink:href="#autoidmagic-1"
|
||||
id="autoidmagic-linearGradient5291"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="506.164"
|
||||
y1="897.51288"
|
||||
@ -54,30 +24,7 @@
|
||||
y2="128.18068"
|
||||
gradientTransform="matrix(0.66697552,0,0,0.66697552,-85.307583,-85.482171)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2406"
|
||||
inkscape:window-height="1596"
|
||||
id="namedview4672"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.4609375"
|
||||
inkscape:cx="679.76068"
|
||||
inkscape:cy="684.56784"
|
||||
inkscape:window-x="360"
|
||||
inkscape:window-y="176"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg4670" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path55690"
|
||||
d="m 22.71497,365.69226 c 0,-96.78776 -0.40234,-141.38713 1.20287,-156.02866 6.44884,-58.82121 33.72282,-112.060031 77.15278,-150.593881 15.86816,-14.07925 29.94351,-24.1697 48.85857,-33.81826 24.2013,-12.34507 45.75644,-18.7887797 75.51234,-23.3636597 13.30553,-2.04567999 45.02409,-2.89686 61.2289,-0.1279 28.13604,4.80767 51.05526,11.0185897 75.25656,23.3636597 13.71286,6.99492 22.05918,12.44601 33.56017,21.05403 53.34559,39.92696 86.57853,98.036001 93.21856,164.381301 1.01407,10.13231 0.84226,35.9671 -0.31003,46.82589 -5.57194,52.50759 -28.16943,100.36301 -65.32657,138.34413 -18.74038,19.15597 -37.94156,33.00688 -60.80864,44.56419 -26.40718,13.34652 -47.90913,19.84352 -79.93665,24.2163 -3.91319,0.53428 -33.22101,1.03784 -93.76027,1.34066 -94.78589,0.47414 -90.7228,-0.061 -105.3743,3.67775 -13.03428,3.32612 -26.47548,9.60448 -36.56103,16.8188 -7.03893,5.03503 -15.61484,12.9312 -19.75722,19.02725 C 25.06379,508.03342 23.57162,512 23.08611,512 22.35645,512 22.71497,487.47538 22.71497,365.69226 Z m 241.16185,17.65451 c 31.82882,-2.12959 53.76526,-9.35719 72.30888,-23.25032 5.28214,-3.95745 7.91313,-8.79737 9.16787,-15.98467 1.75999,-10.08148 -1.65009,-19.68856 -9.04886,-27.59787 -6.60742,-7.06336 -14.66683,-10.12814 -24.21989,-9.62673 -4.87238,0.25573 -7.24389,1.15 -12.7562,3.8417 -8.31896,4.06221 -23.36809,8.8061 -30.7782,9.79291 -7.87584,1.04883 -22.38658,0.41053 -29.8358,-1.28946 -8.35089,-1.90576 -13.01891,-3.46467 -22.06018,-7.80658 -16.41488,-7.88297 -26.19927,-16.47647 -38.27486,-32.48721 -5.04709,-6.6918 -11.92086,-16.51795 -11.92086,-18.03369 0,-0.98364 8.99373,-0.17118 107.74764,-0.18178 117.20682,-0.0126 113.30384,0.21449 120.84512,-3.60697 7.54482,-3.82325 14.73542,-13.65006 16.36528,-22.42176 0.84963,-4.5726 0.74455,-15.87294 -0.71526,-25.5975 -6.14544,-40.93802 -33.2388,-82.65846 -70.06043,-107.3262 -34.70077,-23.246921 -73.69502,-31.573231 -111.5199,-23.941861 -29.41553,5.93474 -61.58044,24.527611 -83.72636,47.927721 -21.23185,22.43426 -34.9718,49.54515 -40.87774,80.89661 -1.71868,9.1235 -1.44292,37.07177 0.28921,46.6106 5.71134,31.45233 17.71104,56.86846 39.82451,81.65652 19.51009,21.8698 52.61186,40.85283 80.94991,46.26207 13.1122,2.50289 23.68465,3.14209 38.29612,2.16447 z M 166.01784,196.72721 c 0,-0.74011 1.97739,-3.62392 3.84154,-6.62954 17.15641,-27.66182 43.80669,-46.26482 72.32639,-51.01387 9.59204,-1.59725 20.85634,-1.64826 28.78687,-0.45061 19.7296,2.97955 37.31724,12.15074 53.99369,27.9141 10.7124,10.12586 22.24569,25.4918 23.29409,29.19751 l 0.18087,1.51413 -90.71432,-0.0904 c -91.5303,-0.0912 -91.70913,0.90175 -91.70913,-0.44128 z"
|
||||
style="display:inline;fill:url(#linearGradient5291);fill-opacity:1;stroke-width:0.6669755"
|
||||
sodipodi:nodetypes="ssssssssssssssssssssssscssssssscssssssssssscsssscss" />
|
||||
style="display:inline;fill:url(#autoidmagic-linearGradient5291);fill-opacity:1;stroke-width:0.6669755" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 3.4 KiB |
@ -8,8 +8,7 @@
|
||||
{% load static %}
|
||||
|
||||
{% block page_js %}
|
||||
<script type="text/javascript" src="{% static 'ejabberd/ejabberd.js' %}"
|
||||
defer></script>
|
||||
<script src="{% static 'ejabberd/ejabberd.js' %}" defer></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block status %}
|
||||
|
||||
@ -1,64 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="512"
|
||||
height="512"
|
||||
version="1.1"
|
||||
id="svg71"
|
||||
sodipodi:docname="Internet-mail.svg"
|
||||
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview73"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.25455729"
|
||||
inkscape:cx="-718.89514"
|
||||
inkscape:cy="-544.08184"
|
||||
inkscape:window-width="1852"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg71" />
|
||||
<defs
|
||||
id="defs43">
|
||||
viewBox="0 0 512 512">
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="a">
|
||||
id="autoidmagic-a">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#9aa29a"
|
||||
id="stop2" />
|
||||
stop-color="#9aa29a" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#b5beb5"
|
||||
id="stop4" />
|
||||
stop-color="#b5beb5" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="b"
|
||||
id="autoidmagic-b"
|
||||
cx="6.7030001"
|
||||
cy="73.615997"
|
||||
r="7.2280002"
|
||||
gradientTransform="matrix(3.4251013,0,0,1.0381524,2.0723312,-20.765398)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
id="stop7" />
|
||||
offset="0" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-opacity="0"
|
||||
id="stop9" />
|
||||
stop-opacity="0" />
|
||||
</radialGradient>
|
||||
<linearGradient
|
||||
id="i"
|
||||
id="autoidmagic-i"
|
||||
x1="8.7799997"
|
||||
x2="9.7620001"
|
||||
y1="37.785"
|
||||
@ -67,15 +37,13 @@
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-opacity=".129"
|
||||
id="stop12" />
|
||||
stop-opacity=".129" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-opacity="0"
|
||||
id="stop14" />
|
||||
stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="h"
|
||||
id="autoidmagic-h"
|
||||
x1="11.233"
|
||||
x2="21.112"
|
||||
y1="13.686"
|
||||
@ -84,24 +52,22 @@
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#fff"
|
||||
id="stop17" />
|
||||
stop-color="#fff" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#ededed"
|
||||
id="stop19" />
|
||||
stop-color="#ededed" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="g"
|
||||
id="autoidmagic-g"
|
||||
x1="8.9160004"
|
||||
x2="9.8859997"
|
||||
y1="37.196999"
|
||||
y2="52.091"
|
||||
gradientTransform="matrix(2.4548,0,0,0.762,2.88,0.343)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
xlink:href="#a" />
|
||||
xlink:href="#autoidmagic-a" />
|
||||
<linearGradient
|
||||
id="f"
|
||||
id="autoidmagic-f"
|
||||
x1="10.184"
|
||||
x2="15.311"
|
||||
y1="15.148"
|
||||
@ -110,15 +76,13 @@
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#fff"
|
||||
id="stop23" />
|
||||
stop-color="#fff" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#dcdcdc"
|
||||
id="stop25" />
|
||||
stop-color="#dcdcdc" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="e"
|
||||
id="autoidmagic-e"
|
||||
x1="5.8270001"
|
||||
x2="13.467"
|
||||
y1="7.2309999"
|
||||
@ -127,15 +91,13 @@
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#ededed"
|
||||
id="stop28" />
|
||||
stop-color="#ededed" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#c8c8c8"
|
||||
id="stop30" />
|
||||
stop-color="#c8c8c8" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="c"
|
||||
id="autoidmagic-c"
|
||||
x1="11.573"
|
||||
x2="18.475"
|
||||
y1="4.7459998"
|
||||
@ -144,15 +106,13 @@
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#fff"
|
||||
id="stop33" />
|
||||
stop-color="#fff" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#e2e2e2"
|
||||
id="stop35" />
|
||||
stop-color="#e2e2e2" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="d"
|
||||
id="autoidmagic-d"
|
||||
x1="2.062"
|
||||
x2="30.6"
|
||||
y1="15.257"
|
||||
@ -161,17 +121,14 @@
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#989690"
|
||||
id="stop38" />
|
||||
stop-color="#989690" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#656460"
|
||||
id="stop40" />
|
||||
stop-color="#656460" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#a"
|
||||
id="linearGradient90"
|
||||
xlink:href="#autoidmagic-a"
|
||||
id="autoidmagic-90"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.4548,0,0,0.762,2.88,0.343)"
|
||||
x1="8.9160004"
|
||||
@ -180,80 +137,60 @@
|
||||
y2="52.091" />
|
||||
</defs>
|
||||
<g
|
||||
id="g197"
|
||||
transform="matrix(12.823403,0,0,12.823403,-62.27045,-23.451719)">
|
||||
<path
|
||||
fill="url(#c)"
|
||||
fill="url(#autoidmagic-c)"
|
||||
fill-rule="evenodd"
|
||||
stroke="url(#d)"
|
||||
stroke="url(#autoidmagic-d)"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="0.857"
|
||||
d="m 6.333,16.972 v 24.51 H 43.306 L 43.244,17.09 C 43.241,15.712 31.396,2.412 29.211,2.412 H 20.66 c -2.297,0 -14.326,13.262 -14.326,14.56 z"
|
||||
id="path47"
|
||||
style="fill:url(#c);stroke:url(#d)" />
|
||||
d="m 6.333,16.972 v 24.51 H 43.306 L 43.244,17.09 C 43.241,15.712 31.396,2.412 29.211,2.412 H 20.66 c -2.297,0 -14.326,13.262 -14.326,14.56 z" />
|
||||
<path
|
||||
fill="url(#e)"
|
||||
fill="url(#autoidmagic-e)"
|
||||
fill-rule="evenodd"
|
||||
d="M 6.923,16.787 C 6.525,16.357 18.81,3.093 20.667,3.093 h 8.376 c 1.747,0 14.037,13.128 13.427,13.886 L 31.61,30.474 19.295,30.156 6.923,16.786 Z"
|
||||
id="path49"
|
||||
style="fill:url(#e)" />
|
||||
d="M 6.923,16.787 C 6.525,16.357 18.81,3.093 20.667,3.093 h 8.376 c 1.747,0 14.037,13.128 13.427,13.886 L 31.61,30.474 19.295,30.156 6.923,16.786 Z" />
|
||||
<path
|
||||
fill-opacity="0.146"
|
||||
fill-rule="evenodd"
|
||||
d="m 19.078,30.018 -7.333,-8.746 24.818,-6.936 3.029,6.216 -7.416,9.44"
|
||||
id="path51" />
|
||||
d="m 19.078,30.018 -7.333,-8.746 24.818,-6.936 3.029,6.216 -7.416,9.44" />
|
||||
<path
|
||||
fill-opacity="0.146"
|
||||
fill-rule="evenodd"
|
||||
d="m 18.292,29.836 -7.483,-8.81 24.648,-6.893 3.174,6.271 -7.241,9.407"
|
||||
id="path53" />
|
||||
d="m 18.292,29.836 -7.483,-8.81 24.648,-6.893 3.174,6.271 -7.241,9.407" />
|
||||
<path
|
||||
fill-opacity="0.146"
|
||||
fill-rule="evenodd"
|
||||
d="m 18.775,29.957 -7.675,-8.66 24.968,-7.065 3.286,6.593 -7.48,9.107"
|
||||
id="path55" />
|
||||
d="m 18.775,29.957 -7.675,-8.66 24.968,-7.065 3.286,6.593 -7.48,9.107" />
|
||||
<path
|
||||
fill="url(#f)"
|
||||
fill="url(#autoidmagic-f)"
|
||||
fill-rule="evenodd"
|
||||
d="m 18.594,30.441 -7.333,-8.746 24.712,-6.894 3.11,6.388 -7.12,8.986"
|
||||
id="path57"
|
||||
style="fill:url(#f)" />
|
||||
d="m 18.594,30.441 -7.333,-8.746 24.712,-6.894 3.11,6.388 -7.12,8.986" />
|
||||
<path
|
||||
fill="url(#g)"
|
||||
fill="url(#autoidmagic-90)"
|
||||
fill-rule="evenodd"
|
||||
d="M 20.488,29.064 7.092,40.036 21.001,30.432 h 9.018 l 12.42,9.482 -11.864,-10.85 z"
|
||||
id="path59"
|
||||
style="fill:url(#linearGradient90)" />
|
||||
d="M 20.488,29.064 7.092,40.036 21.001,30.432 h 9.018 l 12.42,9.482 -11.864,-10.85 z" />
|
||||
<path
|
||||
fill="url(#g)"
|
||||
fill="url(#autoidmagic-g)"
|
||||
fill-rule="evenodd"
|
||||
d="M 6.963,16.885 18.48,31.201 19.548,30.347 6.964,16.885 Z"
|
||||
color="#000000"
|
||||
id="path61"
|
||||
style="fill:url(#g)" />
|
||||
color="#000000" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke="url(#h)"
|
||||
stroke="url(#autoidmagic-h)"
|
||||
stroke-width="0.857"
|
||||
d="m 7.308,17.131 0.03,23.211 H 42.284 L 42.221,17.258 C 42.219,16.508 31.005,3.459 28.837,3.459 h -7.895 c -2.253,0 -13.635,12.892 -13.634,13.672 z"
|
||||
id="path63"
|
||||
style="stroke:url(#h)" />
|
||||
d="m 7.308,17.131 0.03,23.211 H 42.284 L 42.221,17.258 C 42.219,16.508 31.005,3.459 28.837,3.459 h -7.895 c -2.253,0 -13.635,12.892 -13.634,13.672 z" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
fill-rule="evenodd"
|
||||
d="m 20.957,30.453 -11.941,8.271 2.219,0.006 9.998,-6.869 8.822,-1.423 z m -9.529,-8.783 1.324,1.411 22.791,-6.884 2.915,5.682 0.614,-0.712 -3.069,-6.378 z"
|
||||
id="path65" />
|
||||
d="m 20.957,30.453 -11.941,8.271 2.219,0.006 9.998,-6.869 8.822,-1.423 z m -9.529,-8.783 1.324,1.411 22.791,-6.884 2.915,5.682 0.614,-0.712 -3.069,-6.378 z" />
|
||||
<path
|
||||
fill="url(#i)"
|
||||
fill="url(#autoidmagic-i)"
|
||||
fill-rule="evenodd"
|
||||
d="m 13.308,23.636 6.026,6.454 1.197,-1.026 10.087,0.043 0.812,0.727 3.975,-4.744 C 34.251,23.679 13.308,23.636 13.308,23.636 Z"
|
||||
id="path67"
|
||||
style="fill:url(#i)" />
|
||||
d="m 13.308,23.636 6.026,6.454 1.197,-1.026 10.087,0.043 0.812,0.727 3.975,-4.744 C 34.251,23.679 13.308,23.636 13.308,23.636 Z" />
|
||||
<path
|
||||
fill="#b1b1b1"
|
||||
fill-rule="evenodd"
|
||||
d="M 41.813,17.848 31.861,30.479 30.793,29.624 Z"
|
||||
color="#000000"
|
||||
id="path69" />
|
||||
color="#000000" />
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 5.8 KiB |
@ -4,11 +4,12 @@
|
||||
{% endcomment %}
|
||||
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block subsubmenu %}
|
||||
<a class="btn btn-default" role="button" href="/rspamd/">
|
||||
{% trans "Manage Spam" %}
|
||||
<span class="fa fa-external-link"></span>
|
||||
{% icon 'external-link' %}
|
||||
</a>
|
||||
<a class="btn btn-default" role="button"
|
||||
href="{% url 'email:aliases' %}">
|
||||
@ -34,7 +35,7 @@
|
||||
<a href="{% url 'email:dns' domain %}"
|
||||
title="{% blocktrans %}View domain: {{ domain }}{% endblocktrans %}">
|
||||
{{ domain }}</a>
|
||||
{% if domain == primary_domain %}<div class="app-icon fa fa-tag"></div>{% endif %}
|
||||
{% if domain == primary_domain %}{% icon 'tag' %}{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
@ -1,159 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
id="svg2"
|
||||
sodipodi:docname="featherwiki.svg"
|
||||
viewBox="0 0 511.99998 511.99999"
|
||||
version="1.1"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
viewBox="0 0 512 512"
|
||||
width="512"
|
||||
height="512"
|
||||
inkscape:export-filename="featherwiki.png"
|
||||
inkscape:export-xdpi="48"
|
||||
inkscape:export-ydpi="48"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs
|
||||
id="defs11" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
bordercolor="#666666"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-y="23"
|
||||
pagecolor="#ffffff"
|
||||
inkscape:window-height="1429"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:zoom="1.4283557"
|
||||
inkscape:window-x="26"
|
||||
showgrid="false"
|
||||
borderopacity="1.0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cx="175.37648"
|
||||
inkscape:cy="344.45202"
|
||||
inkscape:window-width="1789"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:document-units="px"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:snap-global="false"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Vrstva 1"
|
||||
inkscape:groupmode="layer">
|
||||
height="512">
|
||||
<g>
|
||||
<g
|
||||
id="g907"
|
||||
transform="matrix(0.51715286,0,0,0.51715286,-2.4633634,-2.5670809)">
|
||||
<g
|
||||
id="g850"
|
||||
transform="matrix(-2.53053,-0.03341354,-0.03341354,-2.53053,1038.0811,2209.6311)">
|
||||
<path
|
||||
id="path844"
|
||||
sodipodi:nodetypes="cccccccsccccccccccsscscsscscaaacsscccccccccccccccccccccc"
|
||||
style="color:#000000;opacity:1;fill:#19457c;fill-opacity:1;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 205.22,478.53 c -23.15688,16.34454 -41.83323,53.12276 -43.6252,79.5 l 18.34,27.97 -18.6,-19.53 c -0.0333,8.4167 0.51776,17.394 1.125,27.094 l 12,14.844 -11.531,-6.375 c 0.34608,5.9871 0.66846,12.155 0.8125,18.688 0.53129,24.095 3.2621,61.668 7.8125,98.219 l 15.16,31.78 -14.03,-23.22 c 1.2784,9.6063 2.6675,19.06 4.1875,28.094 l 14.156,17 -13.5,-13.312 c 1.3937,8.0034 2.8954,15.596 4.4688,22.656 l 14,9.1562 -18.741,-5.1097 c 2.2337,8.2287 16.005,10.247 20.225,13.24 0,0 -18.352,-1.4767 -16.481,0.0653 5.136,4.2312 12.223,5.0179 14.951,6.2104 5.2176,2.2806 3.3255,2.0318 3.3255,2.0318 -1.7183,-0.31873 -8.3403,4.3107 -12.856,4.275 -3.2433,-0.0256 2.6433,0.16019 6.3662,-0.25953 14.31,-4.1628 7.819,-1.0595 8.9684,-1.9324 1.8048,-1.3706 -10.876,5.7242 -13.106,5.8769 -3.1577,0.21605 3.0489,1.4336 5.3547,0.35605 6.3347,-3.0329 12.819,-5.5291 19.655,-1.5848 4.907,2.8316 9.6512,-0.21607 7.8019,-1.3297 -1.7484,-1.8359 0.41271,0.30444 0.2971,0.43753 -1.4859,1.7106 -6.0522,-0.7293 -6.1023,-2.9946 -0.0714,-3.2319 9.9407,-1.7546 8.5089,-4.6529 -0.29476,-0.59665 4.1858,1.4365 -1.8251,0.80916 -2.1331,-0.31119 -2.9558,-0.90497 -4.4048,1.2467 0,0 1.8069,-3.3305 0.92239,-3.0232 -11.553,4.0142 6.8807,-4.0658 9.8015,-11.357 l -13.494,2.5441 10.051,-11.724 c 0.76355,-2.9062 1.512,-5.9353 2.25,-9.0312 l -13.54,7.78 14.06,-10.06 c 0.92178,-3.9543 1.8354,-8.0372 2.7188,-12.25 l -18.188,12.875 18.906,-16.406 c 1.3869,-6.8048 2.7087,-13.9 3.9688,-21.125 l -19.875,22 20.96,-28.38 c 7.2214,-43.29 11.924,-90.896 11.906,-120.09 l -13,8.4375 c 12.83559,-7.69668 13.00208,-13.67041 12.59405,-26.343 l -13.281,12.094 13.188,-15.031 c -0.5639,-15.697 -1.5394,-30.203 -3.5,-42.625 l -18.11,15.38 14.19,-32.69 c -6.41339,-14.04841 -22.03415,-48.83827 -35.28095,-50.219 z" />
|
||||
<path
|
||||
id="path846"
|
||||
style="fill:#f0e2e2;fill-rule:evenodd;stroke:#000000;stroke-width:0.30448;stroke-linecap:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 205.03,478.51 c 0.98759,-6.7e-4 1.7961,80.659 1.8047,180.04 0.009,99.385 -0.7859,180.05 -1.7735,180.05 -0.98759,6.7e-4 -1.7961,-80.659 -1.8047,-180.04 -0.009,-99.385 0.78591,-180.05 1.7735,-180.05 z" />
|
||||
<path
|
||||
id="path848"
|
||||
sodipodi:nodetypes="cccc"
|
||||
style="fill:#000000;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 202.28,842.66 c 2.174,-4.381 4.3103,-2.3783 5.4014,0.47766 l -2.514,-28.929 z" />
|
||||
</g>
|
||||
<g
|
||||
id="g842"
|
||||
transform="matrix(-2.7355499,-0.95049478,-1.0223921,2.7094995,1991.4013,-1095.9208)">
|
||||
<path
|
||||
id="path836"
|
||||
sodipodi:nodetypes="cccccccccccccccccscccccscacssccccccccccccccccccccccc"
|
||||
style="color:#000000;opacity:1;fill:#1f5598;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 205.22,478.53 c -23.15688,16.34454 -41.83323,53.12276 -43.6252,79.5 l 18.34,27.97 -18.6,-19.53 c -0.0333,8.4167 0.51776,17.394 1.125,27.094 l 12,14.844 -11.531,-6.375 c 1.61117,39.57325 4.38737,82.31761 8.625,116.907 l 15.16,31.78 -14.03,-23.22 c 1.2784,9.6063 2.6675,19.06 4.1875,28.094 l 14.156,17 -13.5,-13.312 c 1.3937,8.0034 2.8954,15.596 4.4688,22.656 l 14,9.1562 -18.741,-5.1097 c 2.2337,8.2287 16.005,10.247 20.225,13.24 0,0 -18.352,-1.4767 -16.481,0.0653 5.136,4.2312 12.223,5.0179 14.951,6.2104 0.58151,3.17031 -8.46009,4.5849 -9.5305,6.3068 -3.2433,-0.0256 2.6433,0.16019 6.3662,-0.25953 0,0 4.65117,2.59746 -4.1376,3.9445 -3.1577,0.21605 3.0489,1.4336 5.3547,0.35605 6.3347,-3.0329 12.819,-5.5291 19.655,-1.5848 4.907,2.8316 9.6512,-0.21607 7.8019,-1.3297 -1.7484,-1.8359 0.41271,0.30444 0.2971,0.43753 -1.4859,1.7106 -6.0522,-0.7293 -6.1023,-2.9946 0,0 1.71899,-1.59312 2.279,-2.59704 0.51529,-0.92375 1.8069,-3.3305 0.92239,-3.0232 -11.553,4.0142 6.8807,-4.0658 9.8015,-11.357 l -13.494,2.5441 10.051,-11.724 c 0.76355,-2.9062 1.512,-5.9353 2.25,-9.0312 l -13.54,7.78 14.06,-10.06 c 0.92178,-3.9543 1.8354,-8.0372 2.7188,-12.25 l -18.188,12.875 18.906,-16.406 c 1.3869,-6.8048 2.7087,-13.9 3.9688,-21.125 l -19.875,22 20.96,-28.38 c 7.2214,-43.29 11.924,-90.896 11.906,-120.09 l -13,8.4375 12.969,-10.656 c -0.0506,-5.26738 -0.22316,-10.99106 -0.37495,-15.687 l -13.281,12.094 13.188,-15.031 c -0.5639,-15.697 -1.5394,-30.203 -3.5,-42.625 l -18.11,15.38 14.19,-32.69 c -6.41339,-14.04841 -22.03415,-48.83827 -35.28095,-50.219 z" />
|
||||
<path
|
||||
id="path838"
|
||||
style="fill:#f0e2e2;fill-rule:evenodd;stroke:#000000;stroke-width:0.30448;stroke-linecap:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 205.03,478.51 c 0.98759,-6.7e-4 1.7961,80.659 1.8047,180.04 0.009,99.385 -0.7859,180.05 -1.7735,180.05 -0.98759,6.7e-4 -1.7961,-80.659 -1.8047,-180.04 -0.009,-99.385 0.78591,-180.05 1.7735,-180.05 z" />
|
||||
<path
|
||||
id="path840"
|
||||
sodipodi:nodetypes="cccc"
|
||||
style="fill:#000000;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 202.28,842.66 c 2.174,-4.381 4.3103,-2.3783 5.4014,0.47766 l -2.514,-28.929 z" />
|
||||
</g>
|
||||
<g
|
||||
id="g858"
|
||||
transform="matrix(2.7355499,-0.95049478,1.0223921,2.7094995,-991.40128,-1095.9208)">
|
||||
<path
|
||||
id="path852"
|
||||
sodipodi:nodetypes="ssccccccccccccccccsscscssccssccccccccccccccccccccccs"
|
||||
style="color:#000000;opacity:1;fill:#1f5598;fill-opacity:0.993151;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 205.22,478.53 c -9.3228,0.20557 -32.409,40.138 -38.719,55.875 -2.9559,7.373 -4.3693,15.194 -4.9062,23.625 l 18.34,27.97 -18.6,-19.53 c -0.0333,8.4167 0.51776,17.394 1.125,27.094 l 12,14.844 -11.531,-6.375 c 1.61117,39.57325 4.38737,82.31761 8.625,116.907 l 15.16,31.78 -14.03,-23.22 c 1.2784,9.6063 2.6675,19.06 4.1875,28.094 l 14.156,17 -13.5,-13.312 c 1.3937,8.0034 2.8954,15.596 4.4688,22.656 l 14,9.1562 -18.741,-5.1097 c 2.2337,8.2287 16.005,10.247 20.225,13.24 0,0 -18.352,-1.4767 -16.481,0.0653 5.136,4.2312 12.223,5.0179 14.951,6.2104 5.2176,2.2806 3.3255,2.0318 3.3255,2.0318 -1.7183,-0.31873 -8.3403,4.3107 -12.856,4.275 -3.2433,-0.0256 2.6433,0.16019 6.3662,-0.25953 14.31,-4.1628 7.819,-1.0595 8.9684,-1.9324 1.8048,-1.3706 -10.876,5.7242 -13.106,5.8769 -3.1577,0.21605 3.0489,1.4336 5.3547,0.35605 6.3347,-3.0329 12.819,-5.5291 19.655,-1.5848 0.96206,-2.55384 0.78043,-5.49588 4.2757,-6.48381 2.47806,-0.70042 4.60156,-3.1899 3.71705,-2.8826 -11.553,4.0142 4.08604,-4.2064 7.00684,-11.4976 l -13.494,2.5441 10.051,-11.724 c 0.76355,-2.9062 1.512,-5.9353 2.25,-9.0312 l -13.54,7.78 14.06,-10.06 c 0.92178,-3.9543 1.8354,-8.0372 2.7188,-12.25 l -18.188,12.875 18.906,-16.406 c 1.3869,-6.8048 2.7087,-13.9 3.9688,-21.125 l -19.875,22 20.96,-28.38 c 7.2214,-43.29 11.924,-90.896 11.906,-120.09 l -13,8.4375 12.969,-10.656 c -0.0506,-5.26738 -0.22316,-10.99106 -0.37495,-15.687 l -13.281,12.094 13.188,-15.031 c -0.5639,-15.697 -1.5394,-30.203 -3.5,-42.625 l -18.11,15.38 14.19,-32.69 c -6.41339,-14.04841 -22.03415,-48.83827 -35.28095,-50.219 z" />
|
||||
<path
|
||||
id="path854"
|
||||
style="fill:#f0e2e2;fill-rule:evenodd;stroke:#000000;stroke-width:0.30448;stroke-linecap:round"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 205.03,478.51 c 0.98759,-6.7e-4 1.7961,80.659 1.8047,180.04 0.009,99.385 -0.7859,180.05 -1.7735,180.05 -0.98759,6.7e-4 -1.7961,-80.659 -1.8047,-180.04 -0.009,-99.385 0.78591,-180.05 1.7735,-180.05 z" />
|
||||
<path
|
||||
id="path856"
|
||||
sodipodi:nodetypes="cccc"
|
||||
style="fill:#000000;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 202.28,842.66 c 2.174,-4.381 4.3103,-2.3783 5.4014,0.47766 l -2.514,-28.929 z" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
|
||||
<dc:publisher>
|
||||
<cc:Agent
|
||||
rdf:about="http://openclipart.org/">
|
||||
<dc:title>Openclipart</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
<dc:date>2012-09-02T06:27:26</dc:date>
|
||||
<dc:description>a blue feather</dc:description>
|
||||
<dc:source>https://openclipart.org/detail/172047/feather-by-t-i-n-a-172047</dc:source>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>T-i-n-a</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>bird</rdf:li>
|
||||
<rdf:li>blue</rdf:li>
|
||||
<rdf:li>feather</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 7.1 KiB |
@ -5,6 +5,7 @@
|
||||
|
||||
{% load bootstrap %}
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block configuration %}
|
||||
{{ block.super }}
|
||||
@ -14,12 +15,12 @@
|
||||
<div class="btn-toolbar">
|
||||
<a href="{% url 'featherwiki:create' %}" class="btn btn-default"
|
||||
role="button" title="{% trans 'Create Wiki' %}">
|
||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||
{% icon 'plus' %}
|
||||
{% trans 'Create Wiki' %}
|
||||
</a>
|
||||
<a href="{% url 'featherwiki:upload' %}" class="btn btn-default"
|
||||
role="button" title="{% trans 'Upload Wiki' %}">
|
||||
<span class="fa fa-upload" aria-hidden="true"></span>
|
||||
{% icon 'upload' %}
|
||||
{% trans 'Upload Wiki' %}
|
||||
</a>
|
||||
</div>
|
||||
@ -41,14 +42,14 @@
|
||||
class="wiki-edit btn btn-default btn-sm secondary"
|
||||
role="button"
|
||||
title="{% blocktrans %}Rename wiki {{ wiki }}{% endblocktrans %}">
|
||||
<span class="fa fa-pencil-square-o" aria-hidden="true"></span>
|
||||
{% icon 'pencil-square-o' %}
|
||||
</a>
|
||||
|
||||
<a href="{% url 'featherwiki:delete' wiki %}"
|
||||
class="wiki-delete btn btn-default btn-sm secondary"
|
||||
role="button"
|
||||
title="{% blocktrans %}Delete wiki {{ wiki }}{% endblocktrans %}">
|
||||
<span class="fa fa-trash-o" aria-hidden="true"></span>
|
||||
{% icon 'trash-o' %}
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
{% block page_head %}
|
||||
<link type="text/css" rel="stylesheet"
|
||||
href="{% static 'firewall/firewall.css' %}"/>
|
||||
href="{% static 'firewall/firewall.css' %}">
|
||||
{% endblock %}
|
||||
|
||||
{% block configuration %}
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
|
||||
{% load bootstrap %}
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block breadcrumbs %}
|
||||
{% endblock %}
|
||||
@ -15,7 +16,7 @@
|
||||
|
||||
<ol class='next-steps'>
|
||||
<li>
|
||||
<div class="app-icon fa fa-refresh"></div>
|
||||
{% icon 'refresh' class='svg-icon app-icon' %}
|
||||
<div class="step-text">
|
||||
{% url 'upgrades:index' as upgrades_url %}
|
||||
{% blocktrans trimmed %}
|
||||
@ -33,7 +34,7 @@
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<div class="app-icon fa fa-eye-slash"></div>
|
||||
{% icon 'eye-slash' class='svg-icon app-icon' %}
|
||||
<div class="step-text">
|
||||
{% url 'privacy:index' as privacy_url %}
|
||||
{% blocktrans trimmed %}
|
||||
@ -43,7 +44,7 @@
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<div class="app-icon fa fa-signal"></div>
|
||||
{% icon 'signal' class='svg-icon app-icon' %}
|
||||
<div class="step-text">
|
||||
{% url 'networks:index' as networks_url %}
|
||||
{% blocktrans trimmed %}
|
||||
@ -54,7 +55,7 @@
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<div class="app-icon fa fa-tags"></div>
|
||||
{% icon 'tags' class='svg-icon app-icon' %}
|
||||
<div class="step-text">
|
||||
{% url 'names:index' as names_url %}
|
||||
{% blocktrans trimmed %}
|
||||
@ -64,7 +65,7 @@
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<div class="app-icon fa fa-files-o"></div>
|
||||
{% icon 'files-o' class='svg-icon app-icon' %}
|
||||
<div class="step-text">
|
||||
{% url 'backups:index' as backups_url %}
|
||||
{% blocktrans trimmed %}
|
||||
@ -75,7 +76,7 @@
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<div class="app-icon fa fa-th"></div>
|
||||
{% icon 'th' class='svg-icon app-icon' %}
|
||||
<div class="step-text">
|
||||
{% url 'apps' as apps_url %}
|
||||
{% blocktrans trimmed %}
|
||||
|
||||
@ -14,7 +14,7 @@ no-brand
|
||||
{% block content %}
|
||||
<div class="logo">
|
||||
<img class="firstboot img-fluid" alt="{{ box_name }}"
|
||||
src="{% static 'theme/img/freedombox-logo-standard.svg' %}"/>
|
||||
src="{% static 'theme/img/freedombox-logo-standard.svg' %}">
|
||||
</div>
|
||||
|
||||
<form class="form form-start text-center" method="post">
|
||||
|
||||
@ -1,73 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 512 512"
|
||||
sodipodi:docname="gitweb.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs6" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#575757"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1020"
|
||||
id="namedview4"
|
||||
showgrid="true"
|
||||
inkscape:zoom="2"
|
||||
inkscape:cx="195.3288"
|
||||
inkscape:cy="254.07096"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="31"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
showguides="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid7767" />
|
||||
</sodipodi:namedview>
|
||||
viewBox="0 0 512 512" >
|
||||
<g
|
||||
id="g7765"
|
||||
transform="matrix(1.7663401,0,0,1.7663401,-4.5673475,9.5668645)">
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccccccccccccccscscccsc"
|
||||
style="display:inline;fill:#bf0303;stroke-width:0.31999999"
|
||||
d="M 11.7124,83.16759 V 70.847587 h 36.96 36.96 v 12.320003 12.32 h -36.96 -36.96 z m 98.88,0 V 70.847587 h 36.95999 36.96 v 12.320003 12.32 h -36.96 -36.95999 z m 98.75423,11.81382 c -0.10683,-0.27839 -0.19424,-5.59461 -0.19424,-11.81382 0,-6.219213 0.0874,-11.535437 0.19424,-11.81383 0.17556,-0.457517 3.74373,-0.506173 37.12,-0.506173 h 36.92576 v 12.320003 12.32 h -36.92576 c -33.37627,0 -36.94444,-0.0487 -37.12,-0.50618 z"
|
||||
id="path7107"
|
||||
inkscape:connector-curvature="0" />
|
||||
d="M 11.7124,83.16759 V 70.847587 h 36.96 36.96 v 12.320003 12.32 h -36.96 -36.96 z m 98.88,0 V 70.847587 h 36.95999 36.96 v 12.320003 12.32 h -36.96 -36.95999 z m 98.75423,11.81382 c -0.10683,-0.27839 -0.19424,-5.59461 -0.19424,-11.81382 0,-6.219213 0.0874,-11.535437 0.19424,-11.81383 0.17556,-0.457517 3.74373,-0.506173 37.12,-0.506173 h 36.92576 v 12.320003 12.32 h -36.92576 c -33.37627,0 -36.94444,-0.0487 -37.12,-0.50618 z" />
|
||||
<path
|
||||
style="display:inline;fill:#007f00;stroke-width:0.31999999"
|
||||
d="m 36.52795,207.93332 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.16,-12.16 0.16,-12.16 h 12.16 12.16 l 0.16,12.16 0.16,12.16 12.16,0.16 12.16,0.16 v 12.32 12.32 l -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0637,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.336,0 -11.69824,-0.1132 -11.91609,-0.25157 z m 98.88,0 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.16,-12.16 0.16,-12.16 h 12.15999 12.16 l 0.16,12.16 0.16,12.16 12.16,0.16 12.16,0.16 v 12.32 12.32 l -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0637,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.33599,0 -11.69823,-0.1132 -11.91608,-0.25157 z m 98.87999,0 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.0838,-12.24379 0.0838,-12.2438 12.2362,0.0838 12.23619,0.0838 0.16,12.16 0.16,12.16 12.16,0.16966 c 6.688,0.0933 12.19771,0.2013 12.2438,0.24 0.0461,0.0387 0.0461,5.57834 0,12.31034 l -0.0838,12.24 -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0638,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.336,0 -11.69824,-0.1132 -11.91609,-0.25157 z"
|
||||
id="path7105"
|
||||
inkscape:connector-curvature="0" />
|
||||
d="m 36.52795,207.93332 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.16,-12.16 0.16,-12.16 h 12.16 12.16 l 0.16,12.16 0.16,12.16 12.16,0.16 12.16,0.16 v 12.32 12.32 l -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0637,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.336,0 -11.69824,-0.1132 -11.91609,-0.25157 z m 98.88,0 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.16,-12.16 0.16,-12.16 h 12.15999 12.16 l 0.16,12.16 0.16,12.16 12.16,0.16 12.16,0.16 v 12.32 12.32 l -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0637,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.33599,0 -11.69823,-0.1132 -11.91608,-0.25157 z m 98.87999,0 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.0838,-12.24379 0.0838,-12.2438 12.2362,0.0838 12.23619,0.0838 0.16,12.16 0.16,12.16 12.16,0.16966 c 6.688,0.0933 12.19771,0.2013 12.2438,0.24 0.0461,0.0387 0.0461,5.57834 0,12.31034 l -0.0838,12.24 -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0638,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.336,0 -11.69824,-0.1132 -11.91609,-0.25157 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 2.2 KiB |
@ -6,6 +6,7 @@
|
||||
{% load bootstrap %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
{% load extras %}
|
||||
|
||||
{% block configuration %}
|
||||
{{ block.super }}
|
||||
@ -15,7 +16,7 @@
|
||||
<div class="btn-toolbar">
|
||||
<a href="{% url 'gitweb:create' %}" class="btn btn-default"
|
||||
role="button" title="{% trans 'Create repository' %}">
|
||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||
{% icon 'plus' %}
|
||||
{% trans 'Create repository' %}
|
||||
</a>
|
||||
</div>
|
||||
@ -44,20 +45,19 @@
|
||||
{% endif %}
|
||||
|
||||
{% if repo.access == 'private' %}
|
||||
<span class="repo-private-icon fa fa-lock secondary"
|
||||
aria-label="private"></span>
|
||||
{% icon 'lock' class='svg-icon repo-private-icon secondary' %}
|
||||
{% endif %}
|
||||
|
||||
<a class="repo-edit btn btn-sm btn-default secondary {% if 'clone_progress' in repo %} disabled {% endif %}"
|
||||
href="{% url 'gitweb:edit' repo.name %}">
|
||||
<span class="fa fa-pencil-square-o" aria-hidden="true"></span>
|
||||
{% icon 'pencil-square-o' %}
|
||||
</a>
|
||||
|
||||
<a href="{% url 'gitweb:delete' repo.name %}"
|
||||
class="btn btn-default btn-sm secondary {% if 'clone_progress' in repo %} disabled {% endif %}"
|
||||
role="button"
|
||||
title="{% blocktrans %}Delete repository {{ repo.name }}{% endblocktrans %}">
|
||||
<span class="fa fa-trash-o" aria-hidden="true"></span>
|
||||
{% icon 'trash-o' %}
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
@ -1,178 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="512"
|
||||
height="512"
|
||||
version="1.1"
|
||||
id="svg140"
|
||||
sodipodi:docname="gnome.svg"
|
||||
inkscape:export-filename="gnome.png"
|
||||
inkscape:export-xdpi="48"
|
||||
inkscape:export-ydpi="48"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview142"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.96950969"
|
||||
inkscape:cx="68.591372"
|
||||
inkscape:cy="440.42881"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2091"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg140" />
|
||||
<defs
|
||||
id="defs84">
|
||||
viewBox="0 0 512 512">
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="k">
|
||||
id="autoidmagic-k">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#d8dfd6"
|
||||
id="stop2" />
|
||||
stop-color="#d8dfd6" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#d8dfd6"
|
||||
stop-opacity="0"
|
||||
id="stop4" />
|
||||
stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="i">
|
||||
id="autoidmagic-i">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#9d9d9d"
|
||||
id="stop7" />
|
||||
stop-color="#9d9d9d" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#b9b9b9"
|
||||
id="stop9" />
|
||||
stop-color="#b9b9b9" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="g">
|
||||
id="autoidmagic-g">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#909090"
|
||||
id="stop12" />
|
||||
stop-color="#909090" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#bebebe"
|
||||
stop-opacity="0"
|
||||
id="stop14" />
|
||||
stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="f">
|
||||
id="autoidmagic-f">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#585956"
|
||||
id="stop17" />
|
||||
stop-color="#585956" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#bbbeb8"
|
||||
id="stop19" />
|
||||
stop-color="#bbbeb8" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="e">
|
||||
id="autoidmagic-e">
|
||||
<stop
|
||||
offset="0"
|
||||
id="stop22" />
|
||||
offset="0" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-opacity="0"
|
||||
id="stop24" />
|
||||
stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="d">
|
||||
id="autoidmagic-d">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#5b5b97"
|
||||
id="stop27" />
|
||||
stop-color="#5b5b97" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#1b1b43"
|
||||
id="stop29" />
|
||||
stop-color="#1b1b43" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="c">
|
||||
id="autoidmagic-c">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#fff"
|
||||
id="stop32" />
|
||||
stop-color="#fff" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#fcfcff"
|
||||
stop-opacity="0"
|
||||
id="stop34" />
|
||||
stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="h">
|
||||
id="autoidmagic-h">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#f9fff5"
|
||||
id="stop37" />
|
||||
stop-color="#f9fff5" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#f9fff5"
|
||||
stop-opacity="0"
|
||||
id="stop39" />
|
||||
stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="l">
|
||||
id="autoidmagic-l">
|
||||
<stop
|
||||
offset="0"
|
||||
id="stop42" />
|
||||
offset="0" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-opacity="0"
|
||||
id="stop44" />
|
||||
stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="b">
|
||||
id="autoidmagic-b">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#fff"
|
||||
id="stop47" />
|
||||
stop-color="#fff" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#fff"
|
||||
stop-opacity="0"
|
||||
id="stop49" />
|
||||
stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="j">
|
||||
id="autoidmagic-j">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#8f8f8f"
|
||||
id="stop52" />
|
||||
stop-color="#8f8f8f" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#494949"
|
||||
id="stop54" />
|
||||
stop-color="#494949" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="a">
|
||||
id="autoidmagic-a">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#dde1d9"
|
||||
id="stop57" />
|
||||
stop-color="#dde1d9" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#cacdc6"
|
||||
id="stop59" />
|
||||
stop-color="#cacdc6" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
xlink:href="#a"
|
||||
id="q"
|
||||
xlink:href="#autoidmagic-a"
|
||||
id="autoidmagic-q"
|
||||
x1="8.6116238"
|
||||
x2="34.784473"
|
||||
y1="7.2293582"
|
||||
@ -180,8 +126,8 @@
|
||||
gradientTransform="matrix(12.591195,0,0,9.8631362,-5.8847298,-27.860012)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#b"
|
||||
id="u"
|
||||
xlink:href="#autoidmagic-b"
|
||||
id="autoidmagic-u"
|
||||
x1="17.698339"
|
||||
x2="34.974548"
|
||||
y1="13.004725"
|
||||
@ -189,8 +135,8 @@
|
||||
gradientTransform="matrix(12.348367,0,0,10.057154,23.370366,-2.1800188)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#c"
|
||||
id="v"
|
||||
xlink:href="#autoidmagic-c"
|
||||
id="autoidmagic-v"
|
||||
x1="11.492236"
|
||||
x2="17.199417"
|
||||
y1="1.6537577"
|
||||
@ -198,8 +144,8 @@
|
||||
gradientTransform="matrix(13.807232,0,0,9.9844946,34.28426,-28.162594)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#d"
|
||||
id="s"
|
||||
xlink:href="#autoidmagic-d"
|
||||
id="autoidmagic-s"
|
||||
x1="19.150396"
|
||||
x2="16.315819"
|
||||
y1="32.622238"
|
||||
@ -207,8 +153,8 @@
|
||||
gradientTransform="matrix(13.084653,0,0,10.535901,30.091445,-28.162594)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#e"
|
||||
id="t"
|
||||
xlink:href="#autoidmagic-e"
|
||||
id="autoidmagic-t"
|
||||
x1="3.7069976"
|
||||
x2="3.7069974"
|
||||
y1="171.29134"
|
||||
@ -216,8 +162,8 @@
|
||||
gradientTransform="matrix(63.57848,0,0,1.9533258,23.182557,-20.895004)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#f"
|
||||
id="p"
|
||||
xlink:href="#autoidmagic-f"
|
||||
id="autoidmagic-p"
|
||||
x1="12.206709"
|
||||
x2="12.127711"
|
||||
y1="53.535141"
|
||||
@ -225,8 +171,8 @@
|
||||
gradientTransform="matrix(20.241462,0,0,6.1354577,10.917863,-13.32405)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#g"
|
||||
id="D"
|
||||
xlink:href="#autoidmagic-g"
|
||||
id="autoidmagic-D"
|
||||
x1="34.300991"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
@ -234,8 +180,8 @@
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98661,18.479522)" />
|
||||
<linearGradient
|
||||
xlink:href="#g"
|
||||
id="E"
|
||||
xlink:href="#autoidmagic-g"
|
||||
id="autoidmagic-E"
|
||||
x1="34.300991"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
@ -243,8 +189,8 @@
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.9866,41.946455)" />
|
||||
<linearGradient
|
||||
xlink:href="#g"
|
||||
id="F"
|
||||
xlink:href="#autoidmagic-g"
|
||||
id="autoidmagic-F"
|
||||
x1="34.300991"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
@ -252,8 +198,8 @@
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.9866,64.234517)" />
|
||||
<linearGradient
|
||||
xlink:href="#g"
|
||||
id="G"
|
||||
xlink:href="#autoidmagic-g"
|
||||
id="autoidmagic-G"
|
||||
x1="34.300991"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
@ -261,8 +207,8 @@
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98661,86.52258)" />
|
||||
<linearGradient
|
||||
xlink:href="#g"
|
||||
id="H"
|
||||
xlink:href="#autoidmagic-g"
|
||||
id="autoidmagic-H"
|
||||
x1="34.300991"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
@ -270,8 +216,8 @@
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98662,108.81063)" />
|
||||
<linearGradient
|
||||
xlink:href="#h"
|
||||
id="C"
|
||||
xlink:href="#autoidmagic-h"
|
||||
id="autoidmagic-C"
|
||||
x1="13.62871"
|
||||
x2="8.6485014"
|
||||
y1="101.2846"
|
||||
@ -279,8 +225,8 @@
|
||||
gradientTransform="matrix(23.88868,0,0,5.1986904,22.418008,-18.994423)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#i"
|
||||
id="z"
|
||||
xlink:href="#autoidmagic-i"
|
||||
id="autoidmagic-z"
|
||||
x1="8.1134243"
|
||||
x2="8.1134233"
|
||||
y1="88.509071"
|
||||
@ -288,8 +234,8 @@
|
||||
gradientTransform="matrix(25.74104,0,0,4.8245853,-142.74252,-13.32405)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#j"
|
||||
id="r"
|
||||
xlink:href="#autoidmagic-j"
|
||||
id="autoidmagic-r"
|
||||
x1="10.390738"
|
||||
x2="32.536823"
|
||||
y1="5.3817744"
|
||||
@ -297,8 +243,8 @@
|
||||
gradientTransform="matrix(12.307468,0,0,10.090586,12.22432,-13.32405)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#a"
|
||||
id="x"
|
||||
xlink:href="#autoidmagic-a"
|
||||
id="autoidmagic-x"
|
||||
x1="18.316999"
|
||||
x2="18.176752"
|
||||
y1="48.643234"
|
||||
@ -306,8 +252,8 @@
|
||||
gradientTransform="matrix(12.591195,0,0,9.8631362,11.239333,-13.32405)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#k"
|
||||
id="n"
|
||||
xlink:href="#autoidmagic-k"
|
||||
id="autoidmagic-n"
|
||||
x1="-23.8857"
|
||||
x2="-23.8857"
|
||||
y1="49.953003"
|
||||
@ -315,8 +261,8 @@
|
||||
gradientTransform="matrix(15.642886,0,0,7.018955,629.64278,25.916246)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#i"
|
||||
id="B"
|
||||
xlink:href="#autoidmagic-i"
|
||||
id="autoidmagic-B"
|
||||
x1="8.1134243"
|
||||
x2="8.1134233"
|
||||
y1="88.509071"
|
||||
@ -324,8 +270,8 @@
|
||||
gradientTransform="matrix(25.74104,0,0,4.8245853,55.242987,-13.32405)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#i"
|
||||
id="A"
|
||||
xlink:href="#autoidmagic-i"
|
||||
id="autoidmagic-A"
|
||||
x1="8.1134243"
|
||||
x2="8.1134233"
|
||||
y1="88.509071"
|
||||
@ -333,8 +279,8 @@
|
||||
gradientTransform="matrix(25.74104,0,0,4.8245853,50.810482,-13.32405)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
xlink:href="#j"
|
||||
id="y"
|
||||
xlink:href="#autoidmagic-j"
|
||||
id="autoidmagic-y"
|
||||
x1="10.390738"
|
||||
x2="32.536823"
|
||||
y1="5.3817744"
|
||||
@ -342,8 +288,8 @@
|
||||
gradientTransform="matrix(12.307468,0,0,10.090586,11.239333,-13.32405)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
xlink:href="#l"
|
||||
id="m"
|
||||
xlink:href="#autoidmagic-l"
|
||||
id="autoidmagic-m"
|
||||
cx="12.57571"
|
||||
cy="67.501709"
|
||||
r="8.7662792"
|
||||
@ -352,8 +298,8 @@
|
||||
gradientTransform="matrix(21.461174,0,0,7.9215182,244.5075,-162.63215)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
xlink:href="#l"
|
||||
id="o"
|
||||
xlink:href="#autoidmagic-l"
|
||||
id="autoidmagic-o"
|
||||
cx="12.57571"
|
||||
cy="67.501709"
|
||||
r="8.7662792"
|
||||
@ -362,8 +308,8 @@
|
||||
gradientTransform="matrix(21.461174,0,0,7.9215182,-13.890674,-225.29756)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
xlink:href="#l"
|
||||
id="w"
|
||||
xlink:href="#autoidmagic-l"
|
||||
id="autoidmagic-w"
|
||||
cx="12.57571"
|
||||
cy="67.501709"
|
||||
r="8.7662792"
|
||||
@ -372,9 +318,8 @@
|
||||
gradientTransform="matrix(27.135509,0,0,7.4720691,-85.249767,-57.904888)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5716"
|
||||
id="linearGradient32682"
|
||||
xlink:href="#autoidmagic-linearGradient5716"
|
||||
id="autoidmagic-linearGradient32682"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="29.089951"
|
||||
y1="11.772627"
|
||||
@ -382,15 +327,13 @@
|
||||
y2="9.7093649"
|
||||
gradientTransform="matrix(6.372617,0,0,6.372617,57.029062,91.84993)" />
|
||||
<linearGradient
|
||||
id="linearGradient5716">
|
||||
id="autoidmagic-linearGradient5716">
|
||||
<stop
|
||||
style="stop-color:#727272;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5718" />
|
||||
offset="0" />
|
||||
<stop
|
||||
style="stop-color:#484848;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5720" />
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path
|
||||
@ -400,105 +343,92 @@
|
||||
d="m 360.69169,353.53372 a 104.69169,43.902974 0 1 1 -209.38339,0 104.6917,43.902972 0 1 1 209.38339,0 z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="stroke-width:11.144;marker:none"
|
||||
id="path88" />
|
||||
style="stroke-width:11.144;marker:none" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke="#7b7f7a"
|
||||
d="m 354.43845,345.65284 a 98.438459,41.280646 0 1 1 -196.87691,0 98.438459,41.280646 0 1 1 196.87691,0 z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="stroke-width:10.4784;marker:none"
|
||||
id="path90" />
|
||||
style="stroke-width:10.4784;marker:none" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke="url(#n)"
|
||||
stroke="url(#autoidmagic-n)"
|
||||
stroke-width="7.13216"
|
||||
d="m 354.43845,337.29482 a 98.438459,41.280646 0 1 1 -196.87691,0 98.438459,41.280646 0 1 1 196.87691,0 z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="stroke:url(#n);marker:none"
|
||||
id="path92" />
|
||||
style="stroke:url(#autoidmagic-n);marker:none" />
|
||||
<path
|
||||
fill="#d0d0d0"
|
||||
fill-rule="evenodd"
|
||||
stroke="#979797"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="4.45761"
|
||||
d="m 137.35944,307.24786 -0.6965,11.14402 c 0,0 48.18799,40.10923 100.29629,46.83289 26.05413,3.36181 52.97509,7.82769 75.2222,13.23353 22.2471,5.40583 39.98875,12.47692 45.96913,18.4573 3.45923,3.45923 5.02666,6.39264 5.57202,8.70627 0.54538,2.31361 0.42593,3.95406 -1.04476,6.26852 -2.94127,4.62889 -12.03397,10.78355 -27.51182,15.6713 -30.95573,9.77548 -86.03665,16.01954 -162.28496,16.01954 v 11.14403 c 76.84921,0 132.20905,-5.88038 165.41922,-16.3678 16.60506,-5.2437 28.13802,-11.31885 33.78034,-20.19855 2.82115,-4.43986 3.98199,-9.90091 2.78601,-14.9748 -1.19599,-5.07389 -4.2855,-9.85751 -8.70629,-14.27828 -9.77966,-9.77968 -28.27059,-15.67342 -51.19288,-21.24332 -22.9223,-5.5699 -50.3235,-10.18931 -76.61521,-13.58178 -52.58341,-6.78496 -100.99279,-46.83287 -100.99279,-46.83287 z"
|
||||
id="path94" />
|
||||
d="m 137.35944,307.24786 -0.6965,11.14402 c 0,0 48.18799,40.10923 100.29629,46.83289 26.05413,3.36181 52.97509,7.82769 75.2222,13.23353 22.2471,5.40583 39.98875,12.47692 45.96913,18.4573 3.45923,3.45923 5.02666,6.39264 5.57202,8.70627 0.54538,2.31361 0.42593,3.95406 -1.04476,6.26852 -2.94127,4.62889 -12.03397,10.78355 -27.51182,15.6713 -30.95573,9.77548 -86.03665,16.01954 -162.28496,16.01954 v 11.14403 c 76.84921,0 132.20905,-5.88038 165.41922,-16.3678 16.60506,-5.2437 28.13802,-11.31885 33.78034,-20.19855 2.82115,-4.43986 3.98199,-9.90091 2.78601,-14.9748 -1.19599,-5.07389 -4.2855,-9.85751 -8.70629,-14.27828 -9.77966,-9.77968 -28.27059,-15.67342 -51.19288,-21.24332 -22.9223,-5.5699 -50.3235,-10.18931 -76.61521,-13.58178 -52.58341,-6.78496 -100.99279,-46.83287 -100.99279,-46.83287 z" />
|
||||
<path
|
||||
fill="url(#q)"
|
||||
fill="url(#autoidmagic-q)"
|
||||
fill-rule="evenodd"
|
||||
stroke="url(#r)"
|
||||
stroke="url(#autoidmagic-r)"
|
||||
d="M 91.134117,5.5720155 H 420.86588 c 10.15603,0 18.09954,6.5023395 18.57433,15.6193295 l 14.84434,285.043295 c 0.6487,12.45607 -10.04139,22.51435 -22.51434,22.51435 H 80.22979 c -12.472947,0 -23.163025,-10.05828 -22.514344,-22.51435 L 72.559783,21.191345 C 73.00871,12.571051 78.66117,5.5720155 91.134117,5.5720155 Z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="fill:url(#q);stroke:url(#r);stroke-width:11.144;marker:none"
|
||||
id="path100" />
|
||||
style="fill:url(#autoidmagic-q);stroke:url(#autoidmagic-r);stroke-width:11.144;marker:none" />
|
||||
<path
|
||||
fill="url(#s)"
|
||||
fill="url(#autoidmagic-s)"
|
||||
fill-rule="evenodd"
|
||||
stroke="#000079"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="5.57202"
|
||||
d="M 115.77466,34.660223 101.93161,280.33393 H 410.0684 L 395.19094,35.701393 Z"
|
||||
id="path102"
|
||||
style="fill:url(#s)" />
|
||||
style="fill:url(#autoidmagic-s)" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke="url(#t)"
|
||||
stroke="url(#autoidmagic-t)"
|
||||
stroke-linecap="round"
|
||||
stroke-opacity="0.248408"
|
||||
stroke-width="11.1015"
|
||||
d="M 80.880032,306.90848 H 431.11997"
|
||||
id="path104"
|
||||
style="stroke:url(#t)" />
|
||||
style="stroke:url(#autoidmagic-t)" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke="url(#u)"
|
||||
stroke="url(#autoidmagic-u)"
|
||||
stroke-opacity="0.700637"
|
||||
stroke-width="11.144"
|
||||
d="M 89.282836,16.835483 421.88205,16.414224 c 3.16154,-0.004 6.23288,2.64392 6.487,7.271968 l 15.17696,276.408168 c 0.6468,11.77959 -6.01498,19.9018 -17.81229,19.9018 H 85.573654 c -11.797326,0 -17.752602,-8.12167 -17.115799,-19.9018 L 83.21356,27.130602 c 0.431228,-7.977238 1.854204,-10.28978 6.069276,-10.295119 z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="stroke:url(#u);marker:none"
|
||||
id="path106" />
|
||||
style="stroke:url(#autoidmagic-u);marker:none" />
|
||||
<path
|
||||
fill="url(#v)"
|
||||
fill="url(#autoidmagic-v)"
|
||||
fill-rule="evenodd"
|
||||
d="M 124.78475,39.569563 115.84134,238.71708 C 238.92314,211.96439 243.12248,121.79169 396.15866,92.209285 l -1.79945,-51.903503 z"
|
||||
opacity="0.531429"
|
||||
id="path108"
|
||||
style="fill:url(#v);stroke-width:11.144" />
|
||||
style="fill:url(#autoidmagic-v);stroke-width:11.144" />
|
||||
<path
|
||||
fill="url(#w)"
|
||||
fill="url(#autoidmagic-w)"
|
||||
fill-rule="evenodd"
|
||||
d="m 493.87848,446.47497 a 237.8785,65.502559 0 1 1 -475.756961,0 237.8785,65.502559 0 1 1 475.756961,0 z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="fill:url(#w);stroke-width:14.2394;marker:none"
|
||||
id="path110" />
|
||||
style="fill:url(#autoidmagic-w);stroke-width:14.2394;marker:none" />
|
||||
<path
|
||||
fill="url(#x)"
|
||||
fill="url(#autoidmagic-x)"
|
||||
fill-rule="evenodd"
|
||||
stroke="url(#y)"
|
||||
stroke="url(#autoidmagic-y)"
|
||||
d="M 83.254112,396.97079 H 428.74589 c 12.47294,0 10.89167,3.0249 12.17182,6.82957 l 31.58938,93.88633 c 1.28012,3.80468 0.3011,6.82958 -12.17182,6.82958 H 51.664732 c -12.472947,0 -13.451955,-3.0249 -12.171817,-6.82958 l 31.58938,-93.88633 c 1.280137,-3.80468 -0.301134,-6.82957 12.171817,-6.82957 z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="fill:url(#x);stroke:url(#y);stroke-width:11.144;marker:none"
|
||||
id="path112" />
|
||||
style="fill:url(#autoidmagic-x);stroke:url(#autoidmagic-y);stroke-width:11.144;marker:none" />
|
||||
<path
|
||||
fill="#7a7d77"
|
||||
fill-rule="evenodd"
|
||||
d="m 122.03967,419.38879 -19.70005,57.13015 h 61.07015 l 5.91002,-22.65505 H 334.8002 l 6.12564,23.12514 h 68.73454 l -18.71502,-57.60024 z"
|
||||
id="path114"
|
||||
style="stroke-width:11.144" />
|
||||
<path
|
||||
fill="#777874"
|
||||
fill-rule="evenodd"
|
||||
d="m 178.67731,457.80391 -4.92502,18.71505 h 164.49542 l -4.92502,-19.70005 z"
|
||||
id="path116"
|
||||
style="stroke-width:11.144" />
|
||||
<path
|
||||
fill="#777a75"
|
||||
@ -506,44 +436,36 @@
|
||||
d="m 276.19255,419.38881 18.71505,56.14515 -61.07016,-0.98503 -16.74504,-54.17514 z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="stroke-width:11.144;marker:none"
|
||||
id="path118" />
|
||||
style="stroke-width:11.144;marker:none" />
|
||||
<path
|
||||
fill="url(#z)"
|
||||
fill="url(#autoidmagic-z)"
|
||||
fill-rule="evenodd"
|
||||
d="M 276.19255,413.47881 294.9076,469.62396 233.83744,468.63894 217.0924,414.4638 Z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="fill:url(#z);stroke-width:11.144;marker:none"
|
||||
id="path120" />
|
||||
style="fill:url(#autoidmagic-z);stroke-width:11.144;marker:none" />
|
||||
<path
|
||||
fill="url(#A)"
|
||||
fill="url(#autoidmagic-A)"
|
||||
fill-rule="evenodd"
|
||||
d="m 122.03967,412.49381 -19.70005,57.13015 h 61.07015 l 5.91002,-22.65506 H 334.8002 l 6.12564,23.12514 h 68.73454 l -18.71502,-57.60023 z"
|
||||
id="path122"
|
||||
style="fill:url(#A);stroke-width:11.144" />
|
||||
style="fill:url(#autoidmagic-A);stroke-width:11.144" />
|
||||
<path
|
||||
fill="url(#B)"
|
||||
fill="url(#autoidmagic-B)"
|
||||
fill-rule="evenodd"
|
||||
d="m 178.67731,451.89391 -4.92502,18.71506 h 164.49542 l -4.92502,-19.70006 z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="fill:url(#B);stroke-width:11.144;marker:none"
|
||||
id="path124" />
|
||||
style="fill:url(#autoidmagic-B);stroke-width:11.144;marker:none" />
|
||||
<path
|
||||
fill="none"
|
||||
stroke="url(#C)"
|
||||
stroke="url(#autoidmagic-C)"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="5.57202"
|
||||
d="m 79.56258,405.44765 h 354.66789 l 29.38879,90.18377 H 48.380735 Z"
|
||||
color="#000000"
|
||||
overflow="visible"
|
||||
style="stroke:url(#C);marker:none"
|
||||
id="path126" />
|
||||
style="stroke:url(#autoidmagic-C);marker:none" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
id="path5565"
|
||||
d="m 226.57187,106.62161 v 104.76731 l 23.65714,-23.09387 13.51835,27.59999 c 3.3112,7.46474 20.52532,1.46267 15.63062,-8.51939 l -13.37756,-28.65611 29.85305,-2.8e-4 z"
|
||||
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient32682);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:6.37262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#autoidmagic-linearGradient32682);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:6.37262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 16 KiB |
@ -5,12 +5,13 @@
|
||||
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
{% load extras %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<p class="text-center">
|
||||
<img src="{% static 'theme/img/freedombox-logo-250px.png' %}"
|
||||
class="main-graphic" />
|
||||
class="main-graphic">
|
||||
</p>
|
||||
|
||||
{% if version %}
|
||||
@ -18,10 +19,10 @@
|
||||
d-flex align-items-center">
|
||||
<div class="me-2">
|
||||
{% if new_version %}
|
||||
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
|
||||
{% icon 'exclamation-triangle' %}
|
||||
<span class="visually-hidden">{% trans "Caution:" %}</span>
|
||||
{% else %}
|
||||
<span class="fa fa-check-circle" aria-hidden="true"></span>
|
||||
{% icon 'check-circle' %}
|
||||
<span class="visually-hidden">{% trans "Success:" %}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
|
||||
<span class="navbar-brand">
|
||||
<img src="{% static 'theme/img/freedombox-logo-32px.png' %}"
|
||||
alt="{{ cfg.box_name }}" />
|
||||
alt="{{ cfg.box_name }}">
|
||||
<a href="{% url 'index' %}">
|
||||
{% blocktrans trimmed %}{{ box_name }} Setup{% endblocktrans %}
|
||||
</a>
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
{% endcomment %}
|
||||
|
||||
{% load i18n %}
|
||||
{% load extras %}
|
||||
|
||||
{% block content %}
|
||||
<h2>{% trans "Contribute" %}</h2>
|
||||
@ -55,7 +56,7 @@
|
||||
<a class="btn btn-default collapsed collapsible-button" role="button"
|
||||
data-bs-toggle="collapse" href="#collapse-issues" aria-expanded="false"
|
||||
aria-controls="collapse-issues">
|
||||
<span class="fa fa-chevron-right fa-fw" aria-hidden="true"></span>
|
||||
{% icon 'chevron-right' %}
|
||||
{% trans "Show issues" %}
|
||||
</a>
|
||||
|
||||
|
||||
@ -58,7 +58,7 @@
|
||||
|
||||
<span class="navbar-brand">
|
||||
<img src="{% static 'theme/img/freedombox-logo-32px.png' %}"
|
||||
alt="{{ cfg.box_name }}" />
|
||||
alt="{{ cfg.box_name }}">
|
||||
<a href="{% url 'index' %}">
|
||||
{% blocktrans trimmed %}{{ box_name }} Setup{% endblocktrans %}
|
||||
</a>
|
||||
|
||||