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
This commit is contained in:
James Valleroy 2026-03-29 09:12:51 -04:00
commit 757df78aaf
306 changed files with 27193 additions and 30413 deletions

View File

@ -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
View File

@ -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
View File

@ -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
View File

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

View File

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

View File

@ -8,6 +8,3 @@ Webserver
.. autoclass:: plinth.modules.apache.components.WebserverRoot
:members:
.. autoclass:: plinth.modules.apache.components.Uwsgi
:members:

View File

@ -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) ==

View File

@ -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) ==

View File

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

View File

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

View File

@ -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):

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -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'",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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()

View File

@ -0,0 +1,5 @@
[Service]
User=bepasty
Group=bepasty
StateDirectory=bepasty
LoadCredential=bepasty-freedombox.conf:/etc/bepasty-freedombox.conf

View File

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

View File

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

View File

@ -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')]

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -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 %}

View File

@ -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):

View File

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

View File

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

View File

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

View File

@ -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 %}

View File

@ -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 %}

View File

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

View File

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

View File

@ -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 %}

View File

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

View File

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

View File

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

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

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

View File

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

View File

@ -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 %}

View File

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

View File

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

View File

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

View File

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

View File

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

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