Compare commits

..

No commits in common. "79363b8e56ef3c05011530eb904cd8bd663b1df2" and "31925252cb7aa34103d3499b74008dea34c8ff2e" have entirely different histories.

296 changed files with 30273 additions and 27067 deletions

View File

@ -484,9 +484,6 @@ 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(
@ -689,27 +686,10 @@ def _verify_signature(hkp_client: str, data_file: pathlib.Path,
def _extract_image(compressed_file: pathlib.Path):
"""Extract the image file."""
# Strip the .xz extension, then replace .img with .raw
decompressed_file = compressed_file.with_suffix('').with_suffix('.raw')
older_image = compressed_file.with_suffix('')
decompressed_file = 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:
@ -732,8 +712,7 @@ 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)
# Strip the .xz extension, then replace .img with .raw
return compressed_image.with_suffix('').with_suffix('.raw')
return compressed_image.with_suffix('')
def _get_project_folder() -> pathlib.Path:
@ -967,7 +946,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, skip_install: bool = False):
def _setup_image(image_file: pathlib.Path):
"""Prepare the image for execution."""
setup_file = image_file.with_suffix(image_file.suffix + '.setup')
if setup_file.exists():
@ -979,10 +958,9 @@ def _setup_image(image_file: pathlib.Path, skip_install: bool = False):
_runc(image_file, ['tee', '/etc/apt/apt.conf.d/20auto-upgrades'],
input=contents.encode())
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: 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]
@ -1040,19 +1018,15 @@ def _is_provisioned(distribution: str) -> bool:
return provision_file.exists()
def _provision(image_file: pathlib.Path, machine_type: str, distribution: str,
skip_install: bool = False):
def _provision(image_file: pathlib.Path, machine_type: str, distribution: str):
"""Run app setup inside the container."""
if _is_provisioned(distribution):
return
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())
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()
@ -1355,8 +1329,9 @@ VirtualEthernet=yes
if result.returncode:
raise Exception(f'Image file {image_link} is not a symlink.')
# May be linked to wrong place (such as old .img file)
subprocess.run(['sudo', 'rm', '--force', str(image_link)], check=False)
subprocess.run(['sudo', 'rm', '--force',
str(image_link)], check=False)
subprocess.run([
'sudo', 'ln', '--symbolic',
str(image_file.resolve()),
@ -1501,11 +1476,10 @@ def subcommand_start(arguments: argparse.Namespace):
arguments.hkp_client)
_resize_disk_image(image_file, arguments.image_size,
arguments.distribution)
_setup_image(image_file, arguments.skip_install)
_setup_image(image_file)
machine.setup()
machine.launch()
_provision(image_file, arguments.machine_type, arguments.distribution,
arguments.skip_install)
_provision(image_file, arguments.machine_type, arguments.distribution)
_print_banner(arguments.machine_type, arguments.distribution)

97
debian/changelog vendored
View File

@ -1,100 +1,3 @@
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) unstable; urgency=medium
[ Jiří Podhorecký ]

1
debian/control vendored
View File

@ -78,6 +78,7 @@ Depends:
bind9-dnsutils,
curl,
debconf,
fonts-fork-awesome,
# sgdisk is used in storage app to expand GPT disks
gdisk,
gettext,

199
debian/copyright vendored
View File

@ -101,6 +101,14 @@ 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>
@ -113,6 +121,15 @@ 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
@ -144,6 +161,12 @@ 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
@ -317,6 +340,12 @@ 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
@ -328,85 +357,6 @@ 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/poweroff.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
@ -2898,94 +2848,3 @@ 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,25 +109,20 @@ manual-pages-xml:=$(patsubst %.raw.wiki, %.xml, $(manual-pages-raw-wiki))
manual-pages: $(manual-pages-part-html)
$(manual-pdfs): %.pdf: %.xml
@echo "[PDF] $<"
@xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf -o $(dir $@) $< 2> /dev/null
xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf -o $(dir $@) $<
$(manual-pages-part-html): %.part.html: %.xml
@echo "[XSLT] $<"
@xsltproc /usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml5/docbook.xsl $< 2> /dev/null | \
xsltproc /usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml5/docbook.xsl $< | \
perl -pe 'BEGIN {undef $$/} s/.*<body[^>]*>(.*)<\/body\s*>.*/$$1/si' > $@
@rm -f docbook.css
@rm -f $(dir $@)docbook.css
$(manual-xmls) $(manual-pages-xml): %.xml: %.raw.wiki $(SCRIPTS_DIR)/wikiparser.py
@echo "[WIKIPARSE] $<"
@$(SCRIPTS_DIR)/wikiparser.py $< | xmllint --format - > $@
$(SCRIPTS_DIR)/wikiparser.py $< | xmllint --format - > $@
%.1: %.xml
@echo "[MAN] $<"
@xmlto man $< 2> /dev/null
xmlto man $<
.PHONY: clean
clean:
@echo "[RM] {part-htmls} {xmls} {manuals} {outputs}"
@rm -f $(manual-pages-part-html) $(manual-pages-xml) $(manual-xmls)
@rm -f $(OUTPUTS)
rm -f $(manual-pages-part-html) $(manual-pages-xml) $(manual-xmls)
rm -f $(OUTPUTS)

View File

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

View File

@ -8,46 +8,7 @@ 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.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) ==
== FreedomBox 26.4.1 (2026-03-08) ==
=== Highlights ===
@ -57,7 +18,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, Russian, Turkish
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Turkish
* Vagrantfile: Enable public network for bridged networking
== FreedomBox 26.4 (2026-03-02) ==

View File

@ -8,46 +8,7 @@ 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.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) ==
== FreedomBox 26.4.1 (2026-03-08) ==
=== Highlights ===
@ -57,7 +18,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, Russian, Turkish
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, 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.5'
__version__ = '26.4.1'

View File

@ -18,6 +18,9 @@ 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.
@ -120,14 +123,6 @@ 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"""
@ -315,6 +310,43 @@ 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()
@ -437,31 +469,9 @@ def is_disk_image():
return os.path.exists('/var/lib/freedombox/is-freedombox-disk-image')
def run_apt_command(arguments, enable_triggers: bool = False,
allow_freedombox_restart=False):
def run_apt_command(arguments, enable_triggers: bool = False):
"""Run apt-get with provided 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
command = ['apt-get', '--assume-yes', '--quiet=2'] + arguments
env = os.environ.copy()
env['DEBIAN_FRONTEND'] = 'noninteractive'

View File

@ -574,19 +574,10 @@ class Info(FollowerComponent):
except ImproperlyConfigured:
# Hack to allow apps to be instantiated without Django
# initialization as required by privileged process.
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]
return [
tag._proxy____args[0] if isinstance(tag, Promise) else tag
for tag in self._tags
]
class EnableState(LeaderComponent):

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 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
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
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' 'unsafe-inline'",
'style-src': "'self'",
# 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 = 17
_version = 16
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-core',
'uwsgi-plugin-python3', 'libapache2-mod-auth-openidc'
'apache2', 'php-fpm', 'ssl-cert', 'uwsgi', 'uwsgi-plugin-python3',
'libapache2-mod-auth-openidc'
])
self.add(packages)
@ -134,7 +134,6 @@ 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,6 +210,42 @@ 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,30 +237,6 @@ 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)
@ -283,13 +259,6 @@ 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
@ -362,6 +331,18 @@ 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 (Webserver, WebserverRoot,
from plinth.modules.apache.components import (Uwsgi, Webserver, WebserverRoot,
check_url, diagnose_url,
diagnose_url_on_all)
@ -326,6 +326,81 @@ 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):
@ -398,10 +473,8 @@ 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

@ -5,11 +5,10 @@
{% 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 %}
@ -18,28 +17,28 @@
<a title="{% trans 'Create a new backup' %}"
role="button" class="btn btn-primary"
href="{% url 'backups:create' %}">
{% icon 'plus' %}
<span class="fa fa-plus" aria-hidden="true"></span>
{% trans 'Create Backup' %}
</a>
<a title="{% trans 'Upload and restore a backup archive' %}"
role="button" class="btn btn-default"
href="{% url 'backups:upload' %}">
{% icon 'upload' %}
<span class="fa fa-upload" aria-hidden="true"></span>
{% trans 'Upload and Restore' %}
</a>
<a title="{% trans 'Add a backup location' %}"
role="button" class="btn btn-default"
href="{% url 'backups:add-repository' %}">
{% icon 'plus' %}
<span class="fa fa-plus" aria-hidden="true"></span>
{% 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' %}">
{% icon 'plus' %}
<span class="fa fa-plus" aria-hidden="true"></span>
{% trans 'Add Remote Backup Location' %}
</a>
</div>

View File

@ -6,10 +6,9 @@
{% load bootstrap %}
{% load i18n %}
{% load static %}
{% load extras %}
{% block page_js %}
<script src="{% static 'backups/backups_add_remote_repository.js' %}"
<script type="text/javascript" src="{% static 'backups/backups_add_remote_repository.js' %}"
defer></script>
{% endblock %}
@ -128,7 +127,7 @@
<div class="alert alert-warning d-flex align-items-center" role="alert">
<div class="me-2">
{% icon 'exclamation-triangle' %}
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
<span class="visually-hidden">{% trans "Caution:" %}</span>
</div>
<div>

View File

@ -3,7 +3,6 @@
{% endcomment %}
{% load i18n %}
{% load extras %}
<div class="table-responsive repository" data-repository-name="{{ repository.name }}">
<table class="table" class="archives-list">
@ -13,13 +12,14 @@
<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 }}">
{% icon 'chevron-right' %}
<span class="fa fa-chevron-right fa-fw" aria-hidden="true"></span>
{% if repository.error %}
<span title={{ repository.error }}>
{% icon 'exclamation-triangle' %}</span>
<span class="fa fa-exclamation-triangle mount-error"
aria-hidden="true" title="{{ repository.error }}">
</span>
{% elif repository.is_encrypted %}
<span title="{% trans "This repository is encrypted" %}">
{% icon 'lock' class='svg-icon encrypted' %}
<span class="fa fa-lock encrypted"
aria-hidden="true" title="{% trans "This repository is 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 %}">
{% icon 'clock-o' %}
<span class="fa fa-clock-o" aria-hidden="true"></span>
{% trans "Schedule" %}
</a>
@ -42,7 +42,7 @@
{% csrf_token %}
<button type="submit" class="btn btn-sm btn-default"
title="{% trans 'Unmount Location' %}">
{% icon 'eject' %}
<span class="fa fa-eject" aria-hidden="true"></span>
</button>
</form>
@ -53,7 +53,7 @@
{% csrf_token %}
<button type="submit" class="btn btn-sm btn-default"
title="{% trans 'Mount Location' %}">
{% icon 'eye' %}
<span class="fa fa-eye" aria-hidden="true"></span>
</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 %}">
{% icon 'trash-o' %}
<span class="fa fa-trash-o" aria-hidden="true"></span>
</a>
{% endif %}
@ -93,7 +93,8 @@
</a>
<a class="archive-delete btn btn-sm btn-default"
href="{% url 'backups:delete' uuid archive.name %}">
{% icon 'trash-o' %}
<span class="fa fa-trash-o" aria-hidden="true">
</span>
</a>
</td>
</tr>

View File

@ -5,7 +5,6 @@
{% load bootstrap %}
{% load i18n %}
{% load extras %}
{% block page_head %}
{% endblock %}
@ -25,7 +24,7 @@
{% if max_filesize %}
<div class="alert alert-warning d-flex align-items-center" role="alert">
<div class="me-2">
{% icon 'exclamation-triangle' %}
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
<span class="visually-hidden">{% trans "Caution:" %}</span>
</div>
<div>

View File

@ -5,7 +5,6 @@
{% load bootstrap %}
{% load i18n %}
{% load extras %}
{% block content %}
@ -24,7 +23,7 @@
{% if form.keyscan_error %}
<div class="alert alert-danger d-flex align-items-center">
<div class="me-2">
{% icon 'exclamation-triangle' %}
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
<span class="visually-hidden">{% trans "Caution:" %}</span>
</div>
<pre class="mb-0">{{ form.keyscan_error }}</pre>
@ -43,7 +42,7 @@
<p>
<a class="btn btn-default collapsed collapsible-button"
data-bs-toggle="collapse" href="#help" aria-expanded="false">
{% icon 'chevron-right' %}
<span class="fa fa-chevron-right fa-fw" aria-hidden="true"></span>
{% trans "How to verify?" %}
</a>
</p>

View File

@ -6,12 +6,10 @@ 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.daemon import Daemon
from plinth.modules.apache.components import Webserver
from plinth.modules.apache.components import Uwsgi, 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
@ -50,7 +48,7 @@ class BepastyApp(app_module.App):
app_id = 'bepasty'
_version = 4
_version = 3
def __init__(self) -> None:
"""Create components for the app."""
@ -85,9 +83,8 @@ class BepastyApp(app_module.App):
ports=['http', 'https'], is_external=True)
self.add(firewall)
daemon = Daemon('daemon-bepasty',
'uwsgi-app@bepasty-freedombox.socket')
self.add(daemon)
uwsgi = Uwsgi('uwsgi-bepasty', 'bepasty-freedombox')
self.add(uwsgi)
webserver = Webserver('webserver-bepasty', 'bepasty-freedombox',
urls=['https://{host}/bepasty/'])
@ -110,16 +107,6 @@ 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

@ -1,5 +0,0 @@
[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/bepasty-freedombox.socket|uwsgi://bepasty/
ProxyPass unix:/run/uwsgi/app/bepasty-freedombox/socket|uwsgi://bepasty/
</Location>

View File

@ -25,7 +25,7 @@ lazy-apps = true
# Module to import
module = bepasty.wsgi
env = BEPASTY_CONFIG=$(CREDENTIALS_DIRECTORY)/bepasty-freedombox.conf
env = BEPASTY_CONFIG=/etc/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', '/var/lib/private/bepasty']
'directories': ['/var/lib/bepasty']
},
'services': ['uwsgi-app@bepasty-freedombox.socket'],
'services': ['uwsgi'],
}
tags = [_('File sharing'), _('Pastebin')]

View File

@ -2,8 +2,11 @@
"""Configuration helper for bepasty."""
import collections
import grp
import json
import os
import pathlib
import pwd
import secrets
import shutil
import string
@ -14,10 +17,11 @@ from plinth import action_utils
from plinth.actions import privileged, secret_str
from plinth.modules import bepasty
CONF_FILE = pathlib.Path('/etc/bepasty-freedombox.conf')
DATA_DIR = '/var/lib/private/bepasty'
DATA_DIR = '/var/lib/bepasty'
PASSWORD_LENGTH = 20
SERVICE_NAME = 'uwsgi-app@bepasty-freedombox.service'
CONF_FILE = pathlib.Path('/etc/bepasty-freedombox.conf')
def _augeas_load():
@ -62,6 +66,26 @@ 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)]
@ -88,11 +112,7 @@ def setup(domain_name: str):
}
conf_file_write(conf)
CONF_FILE.chmod(0o640)
# 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)
shutil.chown(CONF_FILE, user='bepasty', group='bepasty')
@privileged
@ -112,8 +132,7 @@ def add_password(permissions: list[str], comment: str | None = None):
conf['PERMISSION_COMMENTS'][password] = comment
conf_file_write(conf)
# Service is started again by socket.
action_utils.service_stop(SERVICE_NAME)
action_utils.service_try_restart('uwsgi')
@privileged
@ -126,7 +145,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_stop(SERVICE_NAME)
action_utils.service_try_restart('uwsgi')
@privileged
@ -134,7 +153,7 @@ def set_default(permissions: list[str]):
"""Set default permissions."""
conf = {'DEFAULT_PERMISSIONS': _format_permissions(permissions)}
conf_file_write(conf)
action_utils.service_stop(SERVICE_NAME)
action_utils.service_try_restart('uwsgi')
def _format_permissions(permissions=None):
@ -154,3 +173,5 @@ 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,17 +1,81 @@
<?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">
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" />
<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"
style="fill:#0000ff;stroke-width:0.28447992" />
id="path3386"
style="fill:#0000ff;stroke-width:0.28447992"
inkscape:connector-curvature="0" />
<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>
@ -19,20 +83,43 @@
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"><tspan
y="219.26285"
id="text3398"><tspan
sodipodi:role="line"
id="tspan3400"
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: 3.4 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -5,7 +5,6 @@
{% load bootstrap %}
{% load i18n %}
{% load extras %}
{% block configuration %}
{{ block.super }}
@ -15,7 +14,7 @@
<div class="btn-toolbar">
<a href="{% url 'bepasty:add' %}" class="btn btn-default"
role="button" title="{% trans 'Add password' %}">
{% icon 'plus' %}
<span class="fa fa-plus" aria-hidden="true"></span>
{% trans 'Add password' %}
</a>
</div>
@ -44,10 +43,8 @@
<form class="form form-inline" method="post"
action="{% url 'bepasty:remove' password.password %}">
{% csrf_token %}
<button class="password-remove btn btn-sm btn-default"
type="submit">
{% icon 'trash-o' %}
</button>
<button class="password-remove btn btn-sm btn-default fa fa-trash-o"
type="submit"></button>
</form>
</td>
</tr>

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -4,7 +4,6 @@
{% endcomment %}
{% load i18n %}
{% load extras %}
{% block configuration %}
{{ block.super }}
@ -14,7 +13,7 @@
<div class="btn-toolbar">
<a href="{% url 'calibre:create-library' %}" class="btn btn-default"
role="button" title="{% trans 'Create Library' %}">
{% icon 'plus' %}
<span class="fa fa-plus" aria-hidden="true"></span>
{% trans 'Create Library' %}
</a>
</div>
@ -36,7 +35,7 @@
<a href="{% url 'calibre:delete-library' library %}"
class="btn btn-default btn-sm secondary" role="button"
title="{% blocktrans %}Delete library {{ library }}{% endblocktrans %}">
{% icon 'trash-o' %}
<span class="fa fa-trash-o" aria-hidden="true"></span>
</a>
</div>
{% endfor %}

View File

@ -1,15 +1,70 @@
<?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">
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" />
<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" />
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" />
<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: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,13 +1,67 @@
<?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"
fill="currentColor">
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>
<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" />
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" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,51 +1,82 @@
<?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"
viewBox="0 0 512 512">
<defs>
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">
<linearGradient
id="autoidmagic-linearGradient2973">
inkscape:collect="always"
id="linearGradient2973">
<stop
style="stop-color:#eeeeec;stop-opacity:1;"
offset="0" />
offset="0"
id="stop2975" />
<stop
style="stop-color:#eeeeec;stop-opacity:0;"
offset="1" />
offset="1"
id="stop2977" />
</linearGradient>
<linearGradient
id="autoidmagic-linearGradient4126">
id="linearGradient4126">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000" />
offset="0.0000000"
id="stop4128" />
<stop
style="stop-color:#ffffff;stop-opacity:0.16494845;"
offset="1.0000000" />
offset="1.0000000"
id="stop4130" />
</linearGradient>
<linearGradient
id="autoidmagic-linearGradient4114">
inkscape:collect="always"
id="linearGradient4114">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0" />
offset="0"
id="stop4116" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1" />
offset="1"
id="stop4118" />
</linearGradient>
<linearGradient
id="autoidmagic-linearGradient3962">
id="linearGradient3962">
<stop
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
offset="0.0000000" />
offset="0.0000000"
id="stop3964" />
<stop
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
offset="0.15517241" />
offset="0.15517241"
id="stop4134" />
<stop
style="stop-color:#4074ae;stop-opacity:1.0000000;"
offset="0.75000000" />
offset="0.75000000"
id="stop4346" />
<stop
style="stop-color:#36486c;stop-opacity:1.0000000;"
offset="1.0000000" />
offset="1.0000000"
id="stop3966" />
</linearGradient>
<radialGradient
r="13.994944"
@ -55,8 +86,9 @@
cx="-10.089286"
gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
gradientUnits="userSpaceOnUse"
id="autoidmagic-radialGradient4019"
xlink:href="#autoidmagic-linearGradient3993" />
id="radialGradient4019"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
<radialGradient
r="14.057444"
fy="31.329016"
@ -65,8 +97,9 @@
cx="-10.323107"
gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
gradientUnits="userSpaceOnUse"
id="autoidmagic-radialGradient4004"
xlink:href="#autoidmagic-linearGradient3993" />
id="radialGradient4004"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
@ -75,8 +108,9 @@
fx="-10.323107"
cy="31.329016"
cx="-10.323107"
id="autoidmagic-radialGradient3999"
xlink:href="#autoidmagic-linearGradient3993" />
id="radialGradient3999"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
@ -85,29 +119,35 @@
fx="61.662098"
cy="24.241488"
cx="61.662098"
id="autoidmagic-radialGradient3943"
xlink:href="#autoidmagic-linearGradient1312" />
id="radialGradient3943"
xlink:href="#linearGradient1312"
inkscape:collect="always" />
<linearGradient
id="autoidmagic-linearGradient1312">
id="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="autoidmagic-linearGradient3993">
id="linearGradient3993">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0" />
offset="0"
id="stop3995" />
<stop
style="stop-color:#000000;stop-opacity:0"
offset="1" />
offset="1"
id="stop3997" />
</linearGradient>
<radialGradient
xlink:href="#autoidmagic-linearGradient2973"
id="autoidmagic-radialGradient3866"
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient3866"
cx="-22.375"
cy="18.499998"
fx="-22.375"
@ -123,44 +163,55 @@
cy="63.965389"
cx="15.115514"
gradientTransform="scale(1.64399,0.608276)"
id="autoidmagic-radialGradient5000"
xlink:href="#autoidmagic-linearGradient4114" />
id="radialGradient5000"
xlink:href="#linearGradient4114"
inkscape:collect="always" />
<linearGradient
id="autoidmagic-linearGradient4989">
id="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="autoidmagic-linearGradient4977">
id="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="autoidmagic-linearGradient4825">
id="linearGradient4825"
inkscape:collect="always">
<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
xlink:href="#autoidmagic-linearGradient4114"
id="autoidmagic-radialGradient6090"
inkscape:collect="always"
xlink:href="#linearGradient4114"
id="radialGradient6090"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(1.64399,0.608276)"
cx="15.115514"
@ -169,8 +220,9 @@
fy="63.965389"
r="12.289036" />
<radialGradient
xlink:href="#autoidmagic-linearGradient4825"
id="autoidmagic-radialGradient6098"
inkscape:collect="always"
xlink:href="#linearGradient4825"
id="radialGradient6098"
gradientUnits="userSpaceOnUse"
cx="12.071323"
cy="12.493138"
@ -178,8 +230,9 @@
fy="12.493138"
r="6.7175145" />
<radialGradient
xlink:href="#autoidmagic-linearGradient2973"
id="autoidmagic-radialGradient6103"
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient6103"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.25463,-0.898371,0.979785,0.277703,-18.00903,32.03312)"
cx="17.903898"
@ -188,8 +241,9 @@
fy="40.159222"
r="14.33681" />
<radialGradient
xlink:href="#autoidmagic-linearGradient2973"
id="autoidmagic-radialGradient6106"
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient6106"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.583269,-0.431533,0.577146,0.78008,-5.80022,4.004109)"
cx="12.525543"
@ -198,8 +252,9 @@
fy="38.09042"
r="14.33681" />
<radialGradient
xlink:href="#autoidmagic-linearGradient1312"
id="autoidmagic-radialGradient6109"
inkscape:collect="always"
xlink:href="#linearGradient1312"
id="radialGradient6109"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.768231,1.13675,-0.820972,0.554824,-3.72248,-85.07126)"
cx="65.800331"
@ -208,8 +263,9 @@
fy="27.16758"
r="12.972491" />
<radialGradient
xlink:href="#autoidmagic-linearGradient4989"
id="autoidmagic-radialGradient6115"
inkscape:collect="always"
xlink:href="#linearGradient4989"
id="radialGradient6115"
cx="16.651781"
cy="32.187485"
fx="16.651781"
@ -218,40 +274,136 @@
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)"
style="fill:url(#autoidmagic-radialGradient6090);fill-opacity:1;stroke:none;stroke-opacity:1" />
id="path4112"
style="fill:url(#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(#autoidmagic-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(#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(#autoidmagic-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(#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(#autoidmagic-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(#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(#autoidmagic-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(#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(#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"
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"
transform="matrix(-0.829136,1.052307,1.239307,0.0758326,26.32898,25.58605)" />
</g>
</g>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -4,7 +4,6 @@
{% endcomment %}
{% load i18n %}
{% load extras %}
{% block content %}
@ -73,9 +72,9 @@
{% endwith %}
{% endfor %}
{% elif app_data.exception %}
{% icon 'exclamation-triangle' %}
<span class="fa fa-exclamation-triangle mx-1" aria-hidden="true"></span>
{% else %}
{% icon 'hourglass-o' %}
<span class="fa fa-hourglass-o mx-1"></span>
{% endif %}
{% if app_data.show_repair %}
@ -99,7 +98,7 @@
{% elif app_data.exception %}
<div class="alert alert-danger d-flex align-items-center" role="alert">
<div class="me-2">
{% icon 'exclamation-triangle' %}
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
<span class="visually-hidden">{% trans "Caution:" %}</span>
</div>
<div>
@ -108,7 +107,7 @@
</div>
{% else %}
<p class="text-center">
{% icon 'hourglass-o' %}
<span class="fa fa-hourglass-o me-2"></span>
{% trans "Running..." %}
</p>
{% endif %}

View File

@ -6,5 +6,6 @@
{% load static %}
{% block page_js %}
<script src="{% static 'dynamicdns/dynamicdns.js' %}" defer></script>
<script type="text/javascript" src="{% static 'dynamicdns/dynamicdns.js' %}"
defer></script>
{% endblock %}

View File

@ -5,7 +5,6 @@
{% load bootstrap %}
{% load i18n %}
{% load extras %}
{% block extra_content %}
<h3>{% trans "Domains" %}</h3>
@ -13,7 +12,7 @@
<div class="btn-toolbar">
<a href="{% url 'dynamicdns:domain-add' %}" class="btn btn-primary"
role="button" title="{% trans 'Add Domain' %}">
{% icon 'plus' %}
<span class="fa fa-plus" aria-hidden="true"></span>
{% trans 'Add Domain' %}
</a>
</div>
@ -73,14 +72,14 @@
title="{% blocktrans trimmed with domain=domain.domain %}
Edit domain {{ domain }}
{% endblocktrans %}">
{% icon 'pencil-square-o' %}
<span class="fa fa-pencil-square-o" aria-hidden="true"></span>
</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 %}">
{% icon 'trash' %}
<span class="fa fa-trash" aria-hidden="true"></span>
</a>
</td>
</tr>

View File

@ -1,22 +1,52 @@
<?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">
<defs>
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">
<linearGradient
id="autoidmagic-1">
inkscape:collect="always"
id="1">
<stop
style="stop-color:#3fb2f3;stop-opacity:1"
offset="0" />
offset="0"
id="stop5283" />
<stop
style="stop-color:#49c8c6;stop-opacity:1"
offset="1" />
offset="1"
id="stop5285" />
</linearGradient>
<linearGradient
xlink:href="#autoidmagic-1"
id="autoidmagic-linearGradient5291"
inkscape:collect="always"
xlink:href="#1"
id="linearGradient5291"
gradientUnits="userSpaceOnUse"
x1="506.164"
y1="897.51288"
@ -24,7 +54,30 @@
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(#autoidmagic-linearGradient5291);fill-opacity:1;stroke-width:0.6669755" />
style="display:inline;fill:url(#linearGradient5291);fill-opacity:1;stroke-width:0.6669755"
sodipodi:nodetypes="ssssssssssssssssssssssscssssssscssssssssssscsssscss" />
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -8,7 +8,8 @@
{% load static %}
{% block page_js %}
<script src="{% static 'ejabberd/ejabberd.js' %}" defer></script>
<script type="text/javascript" src="{% static 'ejabberd/ejabberd.js' %}"
defer></script>
{% endblock %}
{% block status %}

View File

@ -1,34 +1,64 @@
<?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"
viewBox="0 0 512 512">
<defs>
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">
<linearGradient
id="autoidmagic-a">
id="a">
<stop
offset="0"
stop-color="#9aa29a" />
stop-color="#9aa29a"
id="stop2" />
<stop
offset="1"
stop-color="#b5beb5" />
stop-color="#b5beb5"
id="stop4" />
</linearGradient>
<radialGradient
id="autoidmagic-b"
id="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" />
offset="0"
id="stop7" />
<stop
offset="1"
stop-opacity="0" />
stop-opacity="0"
id="stop9" />
</radialGradient>
<linearGradient
id="autoidmagic-i"
id="i"
x1="8.7799997"
x2="9.7620001"
y1="37.785"
@ -37,13 +67,15 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-opacity=".129" />
stop-opacity=".129"
id="stop12" />
<stop
offset="1"
stop-opacity="0" />
stop-opacity="0"
id="stop14" />
</linearGradient>
<linearGradient
id="autoidmagic-h"
id="h"
x1="11.233"
x2="21.112"
y1="13.686"
@ -52,22 +84,24 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#fff" />
stop-color="#fff"
id="stop17" />
<stop
offset="1"
stop-color="#ededed" />
stop-color="#ededed"
id="stop19" />
</linearGradient>
<linearGradient
id="autoidmagic-g"
id="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="#autoidmagic-a" />
xlink:href="#a" />
<linearGradient
id="autoidmagic-f"
id="f"
x1="10.184"
x2="15.311"
y1="15.148"
@ -76,13 +110,15 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#fff" />
stop-color="#fff"
id="stop23" />
<stop
offset="1"
stop-color="#dcdcdc" />
stop-color="#dcdcdc"
id="stop25" />
</linearGradient>
<linearGradient
id="autoidmagic-e"
id="e"
x1="5.8270001"
x2="13.467"
y1="7.2309999"
@ -91,13 +127,15 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ededed" />
stop-color="#ededed"
id="stop28" />
<stop
offset="1"
stop-color="#c8c8c8" />
stop-color="#c8c8c8"
id="stop30" />
</linearGradient>
<linearGradient
id="autoidmagic-c"
id="c"
x1="11.573"
x2="18.475"
y1="4.7459998"
@ -106,13 +144,15 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#fff" />
stop-color="#fff"
id="stop33" />
<stop
offset="1"
stop-color="#e2e2e2" />
stop-color="#e2e2e2"
id="stop35" />
</linearGradient>
<linearGradient
id="autoidmagic-d"
id="d"
x1="2.062"
x2="30.6"
y1="15.257"
@ -121,14 +161,17 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#989690" />
stop-color="#989690"
id="stop38" />
<stop
offset="1"
stop-color="#656460" />
stop-color="#656460"
id="stop40" />
</linearGradient>
<linearGradient
xlink:href="#autoidmagic-a"
id="autoidmagic-90"
inkscape:collect="always"
xlink:href="#a"
id="linearGradient90"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.4548,0,0,0.762,2.88,0.343)"
x1="8.9160004"
@ -137,60 +180,80 @@
y2="52.091" />
</defs>
<g
id="g197"
transform="matrix(12.823403,0,0,12.823403,-62.27045,-23.451719)">
<path
fill="url(#autoidmagic-c)"
fill="url(#c)"
fill-rule="evenodd"
stroke="url(#autoidmagic-d)"
stroke="url(#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" />
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)" />
<path
fill="url(#autoidmagic-e)"
fill="url(#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" />
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)" />
<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" />
d="m 19.078,30.018 -7.333,-8.746 24.818,-6.936 3.029,6.216 -7.416,9.44"
id="path51" />
<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" />
d="m 18.292,29.836 -7.483,-8.81 24.648,-6.893 3.174,6.271 -7.241,9.407"
id="path53" />
<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" />
d="m 18.775,29.957 -7.675,-8.66 24.968,-7.065 3.286,6.593 -7.48,9.107"
id="path55" />
<path
fill="url(#autoidmagic-f)"
fill="url(#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" />
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)" />
<path
fill="url(#autoidmagic-90)"
fill="url(#g)"
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" />
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)" />
<path
fill="url(#autoidmagic-g)"
fill="url(#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" />
color="#000000"
id="path61"
style="fill:url(#g)" />
<path
fill="none"
stroke="url(#autoidmagic-h)"
stroke="url(#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" />
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)" />
<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" />
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" />
<path
fill="url(#autoidmagic-i)"
fill="url(#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" />
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)" />
<path
fill="#b1b1b1"
fill-rule="evenodd"
d="M 41.813,17.848 31.861,30.479 30.793,29.624 Z"
color="#000000" />
color="#000000"
id="path69" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -4,12 +4,11 @@
{% endcomment %}
{% load i18n %}
{% load extras %}
{% block subsubmenu %}
<a class="btn btn-default" role="button" href="/rspamd/">
{% trans "Manage Spam" %}
{% icon 'external-link' %}
<span class="fa fa-external-link"></span>
</a>
<a class="btn btn-default" role="button"
href="{% url 'email:aliases' %}">
@ -35,7 +34,7 @@
<a href="{% url 'email:dns' domain %}"
title="{% blocktrans %}View domain: {{ domain }}{% endblocktrans %}">
{{ domain }}</a>
{% if domain == primary_domain %}{% icon 'tag' %}{% endif %}
{% if domain == primary_domain %}<div class="app-icon fa fa-tag"></div>{% endif %}
</div>
{% endfor %}
</div>

View File

@ -1,46 +1,159 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 512 512"
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)"
width="512"
height="512">
<g>
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">
<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: 7.1 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -5,7 +5,6 @@
{% load bootstrap %}
{% load i18n %}
{% load extras %}
{% block configuration %}
{{ block.super }}
@ -15,12 +14,12 @@
<div class="btn-toolbar">
<a href="{% url 'featherwiki:create' %}" class="btn btn-default"
role="button" title="{% trans 'Create Wiki' %}">
{% icon 'plus' %}
<span class="fa fa-plus" aria-hidden="true"></span>
{% trans 'Create Wiki' %}
</a>
<a href="{% url 'featherwiki:upload' %}" class="btn btn-default"
role="button" title="{% trans 'Upload Wiki' %}">
{% icon 'upload' %}
<span class="fa fa-upload" aria-hidden="true"></span>
{% trans 'Upload Wiki' %}
</a>
</div>
@ -42,14 +41,14 @@
class="wiki-edit btn btn-default btn-sm secondary"
role="button"
title="{% blocktrans %}Rename wiki {{ wiki }}{% endblocktrans %}">
{% icon 'pencil-square-o' %}
<span class="fa fa-pencil-square-o" aria-hidden="true"></span>
</a>
<a href="{% url 'featherwiki:delete' wiki %}"
class="wiki-delete btn btn-default btn-sm secondary"
role="button"
title="{% blocktrans %}Delete wiki {{ wiki }}{% endblocktrans %}">
{% icon 'trash-o' %}
<span class="fa fa-trash-o" aria-hidden="true"></span>
</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,7 +5,6 @@
{% load bootstrap %}
{% load i18n %}
{% load extras %}
{% block breadcrumbs %}
{% endblock %}
@ -16,7 +15,7 @@
<ol class='next-steps'>
<li>
{% icon 'refresh' class='svg-icon app-icon' %}
<div class="app-icon fa fa-refresh"></div>
<div class="step-text">
{% url 'upgrades:index' as upgrades_url %}
{% blocktrans trimmed %}
@ -34,7 +33,7 @@
</li>
<li>
{% icon 'eye-slash' class='svg-icon app-icon' %}
<div class="app-icon fa fa-eye-slash"></div>
<div class="step-text">
{% url 'privacy:index' as privacy_url %}
{% blocktrans trimmed %}
@ -44,7 +43,7 @@
</li>
<li>
{% icon 'signal' class='svg-icon app-icon' %}
<div class="app-icon fa fa-signal"></div>
<div class="step-text">
{% url 'networks:index' as networks_url %}
{% blocktrans trimmed %}
@ -55,7 +54,7 @@
</li>
<li>
{% icon 'tags' class='svg-icon app-icon' %}
<div class="app-icon fa fa-tags"></div>
<div class="step-text">
{% url 'names:index' as names_url %}
{% blocktrans trimmed %}
@ -65,7 +64,7 @@
</li>
<li>
{% icon 'files-o' class='svg-icon app-icon' %}
<div class="app-icon fa fa-files-o"></div>
<div class="step-text">
{% url 'backups:index' as backups_url %}
{% blocktrans trimmed %}
@ -76,7 +75,7 @@
</li>
<li>
{% icon 'th' class='svg-icon app-icon' %}
<div class="app-icon fa fa-th"></div>
<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,15 +1,73 @@
<?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" >
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>
<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" />
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" />
<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" />
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" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -6,7 +6,6 @@
{% load bootstrap %}
{% load i18n %}
{% load static %}
{% load extras %}
{% block configuration %}
{{ block.super }}
@ -16,7 +15,7 @@
<div class="btn-toolbar">
<a href="{% url 'gitweb:create' %}" class="btn btn-default"
role="button" title="{% trans 'Create repository' %}">
{% icon 'plus' %}
<span class="fa fa-plus" aria-hidden="true"></span>
{% trans 'Create repository' %}
</a>
</div>
@ -45,19 +44,20 @@
{% endif %}
{% if repo.access == 'private' %}
{% icon 'lock' class='svg-icon repo-private-icon secondary' %}
<span class="repo-private-icon fa fa-lock secondary"
aria-label="private"></span>
{% endif %}
<a class="repo-edit btn btn-sm btn-default secondary {% if 'clone_progress' in repo %} disabled {% endif %}"
href="{% url 'gitweb:edit' repo.name %}">
{% icon 'pencil-square-o' %}
<span class="fa fa-pencil-square-o" aria-hidden="true"></span>
</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 %}">
{% icon 'trash-o' %}
<span class="fa fa-trash-o" aria-hidden="true"></span>
</a>
</div>
{% endfor %}

View File

@ -1,124 +1,178 @@
<?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"
viewBox="0 0 512 512">
<defs>
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">
<linearGradient
id="autoidmagic-k">
id="k">
<stop
offset="0"
stop-color="#d8dfd6" />
stop-color="#d8dfd6"
id="stop2" />
<stop
offset="1"
stop-color="#d8dfd6"
stop-opacity="0" />
stop-opacity="0"
id="stop4" />
</linearGradient>
<linearGradient
id="autoidmagic-i">
id="i">
<stop
offset="0"
stop-color="#9d9d9d" />
stop-color="#9d9d9d"
id="stop7" />
<stop
offset="1"
stop-color="#b9b9b9" />
stop-color="#b9b9b9"
id="stop9" />
</linearGradient>
<linearGradient
id="autoidmagic-g">
id="g">
<stop
offset="0"
stop-color="#909090" />
stop-color="#909090"
id="stop12" />
<stop
offset="1"
stop-color="#bebebe"
stop-opacity="0" />
stop-opacity="0"
id="stop14" />
</linearGradient>
<linearGradient
id="autoidmagic-f">
id="f">
<stop
offset="0"
stop-color="#585956" />
stop-color="#585956"
id="stop17" />
<stop
offset="1"
stop-color="#bbbeb8" />
stop-color="#bbbeb8"
id="stop19" />
</linearGradient>
<linearGradient
id="autoidmagic-e">
<stop
offset="0" />
<stop
offset="1"
stop-opacity="0" />
</linearGradient>
<linearGradient
id="autoidmagic-d">
id="e">
<stop
offset="0"
stop-color="#5b5b97" />
id="stop22" />
<stop
offset="1"
stop-color="#1b1b43" />
stop-opacity="0"
id="stop24" />
</linearGradient>
<linearGradient
id="autoidmagic-c">
id="d">
<stop
offset="0"
stop-color="#fff" />
stop-color="#5b5b97"
id="stop27" />
<stop
offset="1"
stop-color="#1b1b43"
id="stop29" />
</linearGradient>
<linearGradient
id="c">
<stop
offset="0"
stop-color="#fff"
id="stop32" />
<stop
offset="1"
stop-color="#fcfcff"
stop-opacity="0" />
stop-opacity="0"
id="stop34" />
</linearGradient>
<linearGradient
id="autoidmagic-h">
id="h">
<stop
offset="0"
stop-color="#f9fff5" />
stop-color="#f9fff5"
id="stop37" />
<stop
offset="1"
stop-color="#f9fff5"
stop-opacity="0" />
stop-opacity="0"
id="stop39" />
</linearGradient>
<linearGradient
id="autoidmagic-l">
<stop
offset="0" />
<stop
offset="1"
stop-opacity="0" />
</linearGradient>
<linearGradient
id="autoidmagic-b">
id="l">
<stop
offset="0"
stop-color="#fff" />
id="stop42" />
<stop
offset="1"
stop-opacity="0"
id="stop44" />
</linearGradient>
<linearGradient
id="b">
<stop
offset="0"
stop-color="#fff"
id="stop47" />
<stop
offset="1"
stop-color="#fff"
stop-opacity="0" />
stop-opacity="0"
id="stop49" />
</linearGradient>
<linearGradient
id="autoidmagic-j">
id="j">
<stop
offset="0"
stop-color="#8f8f8f" />
stop-color="#8f8f8f"
id="stop52" />
<stop
offset="1"
stop-color="#494949" />
stop-color="#494949"
id="stop54" />
</linearGradient>
<linearGradient
id="autoidmagic-a">
id="a">
<stop
offset="0"
stop-color="#dde1d9" />
stop-color="#dde1d9"
id="stop57" />
<stop
offset="1"
stop-color="#cacdc6" />
stop-color="#cacdc6"
id="stop59" />
</linearGradient>
<linearGradient
xlink:href="#autoidmagic-a"
id="autoidmagic-q"
xlink:href="#a"
id="q"
x1="8.6116238"
x2="34.784473"
y1="7.2293582"
@ -126,8 +180,8 @@
gradientTransform="matrix(12.591195,0,0,9.8631362,-5.8847298,-27.860012)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-b"
id="autoidmagic-u"
xlink:href="#b"
id="u"
x1="17.698339"
x2="34.974548"
y1="13.004725"
@ -135,8 +189,8 @@
gradientTransform="matrix(12.348367,0,0,10.057154,23.370366,-2.1800188)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-c"
id="autoidmagic-v"
xlink:href="#c"
id="v"
x1="11.492236"
x2="17.199417"
y1="1.6537577"
@ -144,8 +198,8 @@
gradientTransform="matrix(13.807232,0,0,9.9844946,34.28426,-28.162594)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-d"
id="autoidmagic-s"
xlink:href="#d"
id="s"
x1="19.150396"
x2="16.315819"
y1="32.622238"
@ -153,8 +207,8 @@
gradientTransform="matrix(13.084653,0,0,10.535901,30.091445,-28.162594)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-e"
id="autoidmagic-t"
xlink:href="#e"
id="t"
x1="3.7069976"
x2="3.7069974"
y1="171.29134"
@ -162,8 +216,8 @@
gradientTransform="matrix(63.57848,0,0,1.9533258,23.182557,-20.895004)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-f"
id="autoidmagic-p"
xlink:href="#f"
id="p"
x1="12.206709"
x2="12.127711"
y1="53.535141"
@ -171,8 +225,8 @@
gradientTransform="matrix(20.241462,0,0,6.1354577,10.917863,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-g"
id="autoidmagic-D"
xlink:href="#g"
id="D"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -180,8 +234,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98661,18.479522)" />
<linearGradient
xlink:href="#autoidmagic-g"
id="autoidmagic-E"
xlink:href="#g"
id="E"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -189,8 +243,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.9866,41.946455)" />
<linearGradient
xlink:href="#autoidmagic-g"
id="autoidmagic-F"
xlink:href="#g"
id="F"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -198,8 +252,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.9866,64.234517)" />
<linearGradient
xlink:href="#autoidmagic-g"
id="autoidmagic-G"
xlink:href="#g"
id="G"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -207,8 +261,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98661,86.52258)" />
<linearGradient
xlink:href="#autoidmagic-g"
id="autoidmagic-H"
xlink:href="#g"
id="H"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -216,8 +270,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98662,108.81063)" />
<linearGradient
xlink:href="#autoidmagic-h"
id="autoidmagic-C"
xlink:href="#h"
id="C"
x1="13.62871"
x2="8.6485014"
y1="101.2846"
@ -225,8 +279,8 @@
gradientTransform="matrix(23.88868,0,0,5.1986904,22.418008,-18.994423)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-i"
id="autoidmagic-z"
xlink:href="#i"
id="z"
x1="8.1134243"
x2="8.1134233"
y1="88.509071"
@ -234,8 +288,8 @@
gradientTransform="matrix(25.74104,0,0,4.8245853,-142.74252,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-j"
id="autoidmagic-r"
xlink:href="#j"
id="r"
x1="10.390738"
x2="32.536823"
y1="5.3817744"
@ -243,8 +297,8 @@
gradientTransform="matrix(12.307468,0,0,10.090586,12.22432,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-a"
id="autoidmagic-x"
xlink:href="#a"
id="x"
x1="18.316999"
x2="18.176752"
y1="48.643234"
@ -252,8 +306,8 @@
gradientTransform="matrix(12.591195,0,0,9.8631362,11.239333,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-k"
id="autoidmagic-n"
xlink:href="#k"
id="n"
x1="-23.8857"
x2="-23.8857"
y1="49.953003"
@ -261,8 +315,8 @@
gradientTransform="matrix(15.642886,0,0,7.018955,629.64278,25.916246)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-i"
id="autoidmagic-B"
xlink:href="#i"
id="B"
x1="8.1134243"
x2="8.1134233"
y1="88.509071"
@ -270,8 +324,8 @@
gradientTransform="matrix(25.74104,0,0,4.8245853,55.242987,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-i"
id="autoidmagic-A"
xlink:href="#i"
id="A"
x1="8.1134243"
x2="8.1134233"
y1="88.509071"
@ -279,8 +333,8 @@
gradientTransform="matrix(25.74104,0,0,4.8245853,50.810482,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-j"
id="autoidmagic-y"
xlink:href="#j"
id="y"
x1="10.390738"
x2="32.536823"
y1="5.3817744"
@ -288,8 +342,8 @@
gradientTransform="matrix(12.307468,0,0,10.090586,11.239333,-13.32405)"
gradientUnits="userSpaceOnUse" />
<radialGradient
xlink:href="#autoidmagic-l"
id="autoidmagic-m"
xlink:href="#l"
id="m"
cx="12.57571"
cy="67.501709"
r="8.7662792"
@ -298,8 +352,8 @@
gradientTransform="matrix(21.461174,0,0,7.9215182,244.5075,-162.63215)"
gradientUnits="userSpaceOnUse" />
<radialGradient
xlink:href="#autoidmagic-l"
id="autoidmagic-o"
xlink:href="#l"
id="o"
cx="12.57571"
cy="67.501709"
r="8.7662792"
@ -308,8 +362,8 @@
gradientTransform="matrix(21.461174,0,0,7.9215182,-13.890674,-225.29756)"
gradientUnits="userSpaceOnUse" />
<radialGradient
xlink:href="#autoidmagic-l"
id="autoidmagic-w"
xlink:href="#l"
id="w"
cx="12.57571"
cy="67.501709"
r="8.7662792"
@ -318,8 +372,9 @@
gradientTransform="matrix(27.135509,0,0,7.4720691,-85.249767,-57.904888)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#autoidmagic-linearGradient5716"
id="autoidmagic-linearGradient32682"
inkscape:collect="always"
xlink:href="#linearGradient5716"
id="linearGradient32682"
gradientUnits="userSpaceOnUse"
x1="29.089951"
y1="11.772627"
@ -327,13 +382,15 @@
y2="9.7093649"
gradientTransform="matrix(6.372617,0,0,6.372617,57.029062,91.84993)" />
<linearGradient
id="autoidmagic-linearGradient5716">
id="linearGradient5716">
<stop
style="stop-color:#727272;stop-opacity:1;"
offset="0" />
offset="0"
id="stop5718" />
<stop
style="stop-color:#484848;stop-opacity:1;"
offset="1" />
offset="1"
id="stop5720" />
</linearGradient>
</defs>
<path
@ -343,92 +400,105 @@
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" />
style="stroke-width:11.144;marker:none"
id="path88" />
<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" />
style="stroke-width:10.4784;marker:none"
id="path90" />
<path
fill="none"
stroke="url(#autoidmagic-n)"
stroke="url(#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(#autoidmagic-n);marker:none" />
style="stroke:url(#n);marker:none"
id="path92" />
<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" />
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" />
<path
fill="url(#autoidmagic-q)"
fill="url(#q)"
fill-rule="evenodd"
stroke="url(#autoidmagic-r)"
stroke="url(#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(#autoidmagic-q);stroke:url(#autoidmagic-r);stroke-width:11.144;marker:none" />
style="fill:url(#q);stroke:url(#r);stroke-width:11.144;marker:none"
id="path100" />
<path
fill="url(#autoidmagic-s)"
fill="url(#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"
style="fill:url(#autoidmagic-s)" />
id="path102"
style="fill:url(#s)" />
<path
fill="none"
stroke="url(#autoidmagic-t)"
stroke="url(#t)"
stroke-linecap="round"
stroke-opacity="0.248408"
stroke-width="11.1015"
d="M 80.880032,306.90848 H 431.11997"
style="stroke:url(#autoidmagic-t)" />
id="path104"
style="stroke:url(#t)" />
<path
fill="none"
stroke="url(#autoidmagic-u)"
stroke="url(#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(#autoidmagic-u);marker:none" />
style="stroke:url(#u);marker:none"
id="path106" />
<path
fill="url(#autoidmagic-v)"
fill="url(#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"
style="fill:url(#autoidmagic-v);stroke-width:11.144" />
id="path108"
style="fill:url(#v);stroke-width:11.144" />
<path
fill="url(#autoidmagic-w)"
fill="url(#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(#autoidmagic-w);stroke-width:14.2394;marker:none" />
style="fill:url(#w);stroke-width:14.2394;marker:none"
id="path110" />
<path
fill="url(#autoidmagic-x)"
fill="url(#x)"
fill-rule="evenodd"
stroke="url(#autoidmagic-y)"
stroke="url(#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(#autoidmagic-x);stroke:url(#autoidmagic-y);stroke-width:11.144;marker:none" />
style="fill:url(#x);stroke:url(#y);stroke-width:11.144;marker:none"
id="path112" />
<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"
@ -436,36 +506,44 @@
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" />
style="stroke-width:11.144;marker:none"
id="path118" />
<path
fill="url(#autoidmagic-z)"
fill="url(#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(#autoidmagic-z);stroke-width:11.144;marker:none" />
style="fill:url(#z);stroke-width:11.144;marker:none"
id="path120" />
<path
fill="url(#autoidmagic-A)"
fill="url(#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"
style="fill:url(#autoidmagic-A);stroke-width:11.144" />
id="path122"
style="fill:url(#A);stroke-width:11.144" />
<path
fill="url(#autoidmagic-B)"
fill="url(#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(#autoidmagic-B);stroke-width:11.144;marker:none" />
style="fill:url(#B);stroke-width:11.144;marker:none"
id="path124" />
<path
fill="none"
stroke="url(#autoidmagic-C)"
stroke="url(#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(#autoidmagic-C);marker:none" />
style="stroke:url(#C);marker:none"
id="path126" />
<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(#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" />
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" />
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -5,13 +5,12 @@
{% 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 %}
@ -19,10 +18,10 @@
d-flex align-items-center">
<div class="me-2">
{% if new_version %}
{% icon 'exclamation-triangle' %}
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
<span class="visually-hidden">{% trans "Caution:" %}</span>
{% else %}
{% icon 'check-circle' %}
<span class="fa fa-check-circle" aria-hidden="true"></span>
<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,7 +4,6 @@
{% endcomment %}
{% load i18n %}
{% load extras %}
{% block content %}
<h2>{% trans "Contribute" %}</h2>
@ -56,7 +55,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">
{% icon 'chevron-right' %}
<span class="fa fa-chevron-right fa-fw" aria-hidden="true"></span>
{% 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>

View File

@ -5,17 +5,16 @@
{% load i18n %}
{% load static %}
{% load extras %}
{% block page_head %}
<link type="text/css" rel="stylesheet"
href="{% static 'help/help.css' %}">
href="{% static 'help/help.css' %}"/>
{% endblock %}
{% block content %}
<a href="{% url 'help:download-manual' %}" class="btn btn-default pdf"
role="button">
{% icon 'download' %}
<span class="fa fa-download fa-fw fa-lg"></span>
{% trans 'Download as PDF' %}
</a>
{{ content|safe }}

View File

@ -1,13 +1,70 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg2"
width="512"
height="512"
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg">
<g>
sodipodi:docname="homeassistant.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
inkscape:export-filename="homeassistant.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">
<defs
id="defs6">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect10481"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,16 @ F,0,0,1,0,7.4006832,0,16 @ F,0,0,1,0,6.8476415,0,16 @ F,0,0,1,0,0,0,16 @ F,0,0,1,0,13,0,16 @ F,0,0,1,0,0,0,16 @ F,0,0,1,0,6.8398548,0,16 @ F,0,0,1,0,7.0625983,0,16 @ F,0,0,1,0,0,0,16 @ F,0,0,1,0,5.7657568,0,16 @ F,0,0,1,0,13,0,16"
unit="px"
method="auto"
mode="C"
radius="13"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
</defs>
<sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="1.4142136"
inkscape:cx="109.9551"
inkscape:cy="229.1026"
inkscape:window-width="2054"
inkscape:window-height="1424"
inkscape:window-x="26"
inkscape:window-y="23"
inkscape:window-maximized="0"
inkscape:current-layer="g8" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g8">
<g
id="g10867"
transform="matrix(1.4584376,0,0,1.4559519,-35.756104,-35.922376)">
<rect
style="display:inline;fill:#3db7ed;fill-opacity:1;stroke:none;stroke-width:6;stroke-dasharray:none;stroke-opacity:1"
id="rect10535"
width="351.06061"
height="351.65997"
x="24.516718"
@ -16,95 +73,116 @@
ry="27.427588" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 93.540138,214.62714 -0.703144,95.63584 a 7.3637398,7.3637398 45.277884 0 0 7.346256,7.41786 l 202.50305,0.47543 a 6.8319137,6.8319137 135.06864 0 0 6.84795,-6.83156 l 0.005,-96.58845 28.86224,0.19532 a 5.2986741,5.2986741 112.56308 0 0 3.76544,-9.06234 l -33.64783,-33.34198 0.25133,-44.31303 a 6.8858444,6.8858444 45.516933 0 0 -6.80054,-6.92437 l -19.3796,-0.23979 a 6.9883849,6.9883849 135.40629 0 0 -7.07484,6.97521 l -0.0213,11.78286 -69.96618,-70.708974 a 5.7338785,5.7338785 0.14370144 0 0 -8.13135,-0.02039 L 60.681075,205.86618 a 5.3083747,5.3083747 67.196859 0 0 3.809347,9.06069 z" />
<g>
d="m 93.540138,214.62714 -0.703144,95.63584 a 7.3637398,7.3637398 45.277884 0 0 7.346256,7.41786 l 202.50305,0.47543 a 6.8319137,6.8319137 135.06864 0 0 6.84795,-6.83156 l 0.005,-96.58845 28.86224,0.19532 a 5.2986741,5.2986741 112.56308 0 0 3.76544,-9.06234 l -33.64783,-33.34198 0.25133,-44.31303 a 6.8858444,6.8858444 45.516933 0 0 -6.80054,-6.92437 l -19.3796,-0.23979 a 6.9883849,6.9883849 135.40629 0 0 -7.07484,6.97521 l -0.0213,11.78286 -69.96618,-70.708974 a 5.7338785,5.7338785 0.14370144 0 0 -8.13135,-0.02039 L 60.681075,205.86618 a 5.3083747,5.3083747 67.196859 0 0 3.809347,9.06069 z"
id="path2919"
sodipodi:nodetypes="cccccccccccc"
inkscape:original-d="m 93.540138,214.62714 -0.757555,103.03632 216.751337,0.50889 0.005,-103.43609 41.86194,0.2833 -42.88209,-42.4923 0.29012,-51.15277 -33.28099,-0.4118 -0.0341,18.84545 L 201.4722,65.00069 51.491114,215.061 Z"
inkscape:path-effect="#path-effect10481" />
<g
id="g10604">
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326"
cx="179.24469"
cy="149.3372"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-1"
cx="169.45244"
cy="190.98294"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-2"
cx="138.19283"
cy="222.78395"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-70"
cx="141.91083"
cy="257.76157"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-9"
cx="179.11179"
cy="262.82785"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-36"
cx="147.65073"
cy="294.24802"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-0"
cx="255.81784"
cy="294.59372"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-6"
cx="274.44196"
cy="259.56049"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-26"
cx="225.69614"
cy="227.99767"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-18"
cx="251.68121"
cy="165.4055"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-3"
cx="223.96227"
cy="149.19836"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-7"
cx="229.48242"
cy="192.50766"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-3-5"
cx="274.20001"
cy="192.36882"
rx="7.3252597"
ry="7.3252592" />
<ellipse
style="fill:none;stroke:#3db7ed;stroke-width:4.9;stroke-dasharray:none;stroke-opacity:1"
id="path326-35"
cx="142.36525"
cy="164.90781"
rx="7.3252597"
ry="7.3252592" />
<path
id="path2657"
style="fill:none;stroke:#3db7ed;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 251.49286,172.81947 0.0666,61.7281 -49.7452,49.80448 m 66.78444,-86.57997 -16.96839,16.54133 -15.64318,-15.88293 m 30.5797,60.84935 -40.48194,0.22401 -0.14847,-22.94487 m 23.03301,58.54101 -24.716,0.0115 -22.8132,22.58867 m 17.48042,-163.52317 -17.1326,16.68666 -0.37143,145.80773 -54.16934,-54.41329 m 32.00458,8.05924 -0.0525,23.92802 -23.86244,-0.18309 m 45.55819,-40.76105 -58.50429,-57.16861 -0.0519,-22.53777 m 27.22317,25.92054 0.24132,23.39815 -24.00093,0.0152 m 39.09799,-67.98579 16.75747,16.12059" />
d="m 251.49286,172.81947 0.0666,61.7281 -49.7452,49.80448 m 66.78444,-86.57997 -16.96839,16.54133 -15.64318,-15.88293 m 30.5797,60.84935 -40.48194,0.22401 -0.14847,-22.94487 m 23.03301,58.54101 -24.716,0.0115 -22.8132,22.58867 m 17.48042,-163.52317 -17.1326,16.68666 -0.37143,145.80773 -54.16934,-54.41329 m 32.00458,8.05924 -0.0525,23.92802 -23.86244,-0.18309 m 45.55819,-40.76105 -58.50429,-57.16861 -0.0519,-22.53777 m 27.22317,25.92054 0.24132,23.39815 -24.00093,0.0152 m 39.09799,-67.98579 16.75747,16.12059"
sodipodi:nodetypes="ccccccccccccccccccccccccccc" />
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -1,24 +1,115 @@
<?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.0"
width="512"
height="512"
viewBox="0 0 512 512">
id="svg6600"
class="mozwebext"
sodipodi:docname="ikiwiki.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1814"
inkscape:window-height="2096"
id="namedview25962"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.56645005"
inkscape:cx="-236.71902"
inkscape:cy="-1044.7313"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="logo" />
<defs
id="defs6602" />
<metadata
id="metadata6605">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Recai Oktaş</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title>GPL</dc:title>
</cc:Agent>
</dc:rights>
<dc:subject>
<rdf:Bag>
<rdf:li>ikiwiki</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/GPL/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:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
<cc:requires
rdf:resource="http://web.resource.org/cc/SourceCode" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="logo"
transform="translate(-196.12392,-109.04327)">
<g
id="g9008"
transform="matrix(3.5859,0,0,3.5859,-507.15684,-1664.7313)">
<path
transform="scale(-1,1)"
d="m -328.19676,621.04327 v -66.36423 h -10.70861 v -11.65563 h 24.76821 v 78.01986 h -14.0596 m 86.25165,0 -24.47682,-39.04635 -12.09271,12.45695 v 26.5894 H -292.3557 V 511.04328 h 13.84106 v 68.25827 l 29.86754,-36.27814 h 16.17219 l -24.98675,29.649 30.52317,48.37086 h -15.00662 m 31.76159,0 v -66.36423 h -10.70861 v -11.65563 h 24.76821 v 78.01986 h -14.0596"
style="fill:currentColor;fill-opacity:1;stroke:none"/>
id="text2097"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:149.19204712px;line-height:125%;font-family:'Trebuchet MS';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
inkscape:connector-curvature="0" />
<path
d="m 138.39009,589.48792 h 14.586 v 14.61204 h -14.586 z"
transform="matrix(-0.699056,0.715067,0.715067,0.699056,0,0)"
style="fill:#c00040;fill-opacity:0.94117647;stroke:none" />
id="rect2103"
style="fill:#c00040;fill-opacity:0.94117647;stroke:none"
inkscape:connector-curvature="0" />
<path
d="m 221.10176,504.88187 h 14.586 v 14.61205 h -14.586 z"
transform="matrix(-0.699056,0.715067,0.715067,0.699056,0,0)"
style="fill:#c00040;fill-opacity:0.94117647;stroke:none" />
id="rect2105"
style="fill:#c00040;fill-opacity:0.94117647;stroke:none"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

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