Compare commits

...

69 Commits

Author SHA1 Message Date
Burak Yavuz
79363b8e56
Translated using Weblate (Turkish)
Currently translated at 100.0% (1908 of 1908 strings)
2026-03-25 08:09:49 +01:00
James Valleroy
94f10a3bb5
Release v26.5 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-23 20:38:37 -04:00
James Valleroy
ee9be81b38
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-23 20:24:51 -04:00
James Valleroy
bdf75fdb66
locale: Update translation strings
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-23 20:03:41 -04:00
Ettore Atalan
53563461c8
Translated using Weblate (German)
Currently translated at 97.3% (1859 of 1910 strings)
2026-03-22 23:09:49 +00:00
Sunil Mohan Adapa
db92e23c75
action_utils: Don't restart web interface when installing an app
Tests:

- systemd-run --pipe
--property=BindReadOnlyPaths=/usr/share/freedombox/etc/needrestart/conf.d/freedombox-self.conf:/etc/needrestart/conf.d/freedombox-self.conf
ls -la /etc/needrestart/conf.d/ shows that the new configuration is listed as
expected.

- Running about command with 'cat /etc/needrestart/conf.d/freedombox-self.conf'
shows that configuration content is as expected.

- Running functional tests for coturn app work as expected. systemd journal
shows that transient services are being created to run apt commands.

- After the execution of an operation an empty file is created as
/etc/needrestart/conf.d/freedombox-self.conf.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-21 11:10:25 -04:00
James Valleroy
0e698eb4b4
apache: Use a Uwsgi native socket systemd unit for each app
[Sunil]:

- Drop Uwsgi component entirely. After the changes, it mostly looks like Daemon
component minus some features. One change that Uwsgi component does is when
component is disabled, it also stops and disables the .service unit. Stopping
the service is useful and we can add this to Daemon component.

- Use /run instead of /var/run/ as 1) /var/run is a symlink to /run 2) /run/
path is what is listed in uwsgi-app@.socket unit file.

- Implement upgrade for apps from older version. Disable and mask uwsgi init.d
script. Enable the daemon component if the webserver component is enabled.

- Update manifest files to deal with .socket units instead of 'uwsgi' service.
Backup the /var/lib/private directories as that is actual directory to backup
with DynamicUser=yes.

- For bepasty load the configuration as a systemd provided credential since
DynamicUser=yes.

- Remove the /var/lib/private directories during uninstall.

- Don't create user/group for bepasty as it is not needed with DynamicUser=yes.

Tests:

- Radicale

  - Functional tests pass

  - Freshly install radicale.

  - Web interface works.

  - Create and edit calendars

  - Path of the storage directory is in /var/lib/private/radicale (after
  accessing web interface)

  - Permissions on the storage folder and files inside are set to nobody:nobody.

  - Uninstall removes the /var/lib/private/radicale directory.

  - Create a calender and backup the app. Uninstall the app. Re-install the app.
  The calendar is not available. After restoring the backup, the calendar is
  available.

  - Install radicale without patch and create a calendar. Apply patches and
  start plinth.service. Setup is run. UWSGI is disabled and masked. Service is
  running. Old calender is visible.

  - Install radicale without patch. Disable and apply patches and start
  plinth.service. Setup is run. UWSGI is disabled and masked. Service is not
  running. Enabling the service works.

  - After upgrade, data storage path got migrated to /var/lib/private/radicale.
  Old data is accessible.

  - After upgrade the directory is still owned by radicale:radicale.

  - Freshly install radicale with patch and restore an old backup. The data is
  available in the web interface and data was migrated to
  /var/lib/private/radicale.

- Bepasty

  - Functional tests pass

  - Freshly install bepasy.

  - Enabling and disabling rapidly works.

  - Uploading files works.

  - Path of the storage directory is /var/lib/private/bepasty.

  - Permissions on the storage folder are as expect 755 but on the parent are
  700.

  - Permissions on the stored files are 644 and owned by nobody:nobody.

  - Uninstall removes the /var/lib/private/bepasty directory.

  - Upload a picture and backup the app. Uninstall the app. Re-install the app.
  The uploaded file is not available. After restoring the backup, the uploaded
  file is available.

  - Install bepasty without patch and upload a file. Apply patches and start
  plinth.service. Setup is run. UWSGI is disabled and masked. Service is
  running. Old uploaded picture is visible.

  - Install bepasty without patch. Disable app. Apply patches and start
  plinth.service. Setup is run. UWSGI is disabled and masked. Service is not
  running. Enabling the service works.

  - After upgrade, data storage path got migrated to /var/lib/private/bepasty.
  Old data is accessible.

  - After upgrade the directory is still owned by bepasty:bepasty.

  - Freshly install bepasty with patch and restore an old backup. The uploaded
  file is available in the web interface and data was migrated to
  /var/lib/private/bepasty.

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-21 07:45:51 -07:00
Sunil Mohan Adapa
7cbbc3633b
action_utils: Stop associated service when stopping a socket unit
Tests:

- Unit tests pass.

- Radicale and Bepasty functional tests pass with changes to migrate to new
systemd socket-activated units.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-21 07:45:47 -07:00
Joseph Nuthalapati
65fecdc4cd
container: Fix image extension to .raw for systemd v260
The new version of systemd in Debian testing expects the symlinked file
to be ending with .raw as well. So, our .img files weren't being
recognized by machinectl as machine images.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
[sunil: Remove old symlink forcefully]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-20 17:02:17 -07:00
Joseph Nuthalapati
2307f5fbf2
container: Add option to skip install
Fixes #2561

- Running functional tests against the container works.

```
./container start --skip-install
./container run-tests --pytest-args --include-functional -m syncthing
```

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
[sunil: Ran yapf]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org
2026-03-20 13:41:13 -07:00
Sunil Mohan Adapa
9169ef89d9
apache: Increase OpenID Connect RP session timeout activity
Tests:

- Without patch, open FeatherWiki wiki and save after 5 minutes. Save fails.

- Apply the patch, Apache app setup is run and mod_auth_openidc configuration
is updated. Open FeatherWiki wiki and save after 5 minutes. Save works, wiki
contents are saved.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Joseph Nuthalapati <njoseph@riseup.net>
2026-03-20 23:58:48 +05:30
Sunil Mohan Adapa
c66e78c203
app: Fix build issue with Django 5.x
Closes: #1131272 (Debian)

Tests:

- With Django 4.2 (stable container), syncthing app installs properly and home
page shows the tags properly.

- With Django 6.0 (unstable+experimental container), syncthing app installs
properly and home page shows the tags properly.

- With a cowbuilder base image of Ubuntu resolute distribution, freedombox
package builds successfully with gbp.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Joseph Nuthalapati <njoseph@riseup.net>
2026-03-20 23:44:38 +05:30
Sunil Mohan Adapa
7d3c4812e9
doc: Reduce verbosity when building documentation
- Also remove docbook.css file properly

Tests:

- 'make clean ; make' in doc/ directory yields terse output. dockbook.css is not
created.

- 'make build' in main directory does not result in creation of docbook.css.

[Joseph Nuthalapati]

- Align the prefixes so that the sentences start at the same position.
- Add a space in the redirection: `2> /dev/null`

Reviewed-by: Joseph Nuthalapati <njoseph@riseup.net>
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-03-20 23:31:53 +05:30
Sunil Mohan Adapa
adfbb1e2a4
janus: Drop unused reference to font-awesome
In the upstream demo, https://janus.conf.meetecho.com/demos/videoroom.html, the
font-awesome glyphicons were only being used to show the 'user' icon next to
alias text field. We have replaced that with a simple unicode character. We also
seem to have dropped the dependency on Debian package. However, we seem to
forgotten to remove the inclusion of the JS file. This leads to a 404 error when
loading Janus room.

Tests:

- The page loads and works as expected. The 'user' icon shows up. There are no
404 errors in the browser console.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-20 06:58:46 -04:00
Sunil Mohan Adapa
1d14d4a4d6
ui: Rename 'plinth_extras' template tags module to 'extras'
- Remove yet another reference to 'plinth'.

Tests:

- Some basic pages work.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:58 -04:00
Sunil Mohan Adapa
20ed01dfbc
ui: Drop fonts-fork-awesome as dependency
Closes: #2343.

- SVG icons from the project have been imported into the static/theme/icons
directory. In future, more icons from this and projects will be included in this
directory. We no longer use glyphicons from a font file.

- SVG icons are more flexible as we can mix and match icons from different
projects like fork-awesome. Each file can be individually tweaked to our needs.

- They do not get anti-aliased like icons from font files.

- They could end being much smaller than a font file which usually 100KiB+. Only
icons used on a page are included in the page.

- They work when font resources are blocked for security reasons like in case of
NoScript extension.

- They don't require separate resource to be loaded as SVG is typically inlined
in the HTML file. This should improve page load time.

- They can be animated and tweaked with CSS/JS.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:55 -04:00
Sunil Mohan Adapa
f768195a13
ui: Use inline SVG icons for theme switcher menu
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:53 -04:00
Sunil Mohan Adapa
bfa5f4b622
upgrades: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:49 -04:00
Sunil Mohan Adapa
07955b4e64
ui: Use inline SVG icons for navigation bar at the top
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:47 -04:00
Sunil Mohan Adapa
d0f1f95bbb
ui: Better placement for dropdown indicator in dropdown button
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:44 -04:00
Sunil Mohan Adapa
33d7bf641f
ui: Use inline SVG icons for all error/warn/info/success messages
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:42 -04:00
Sunil Mohan Adapa
53ee9c4ee2
ui: Use inline SVG icons for all spinners
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:39 -04:00
Sunil Mohan Adapa
928794ea1f
ui: Use inline SVG icons for all collapse buttons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:37 -04:00
Sunil Mohan Adapa
76caaaa4e3
ui: Use inline SVG icons for app install page
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:34 -04:00
Sunil Mohan Adapa
bd5b1730bc
backups: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:32 -04:00
Sunil Mohan Adapa
91d5a980c4
ui: Use inline SVG icons for operation waiting notifcation
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:29 -04:00
Sunil Mohan Adapa
310fa40a1e
ui: Use inline SVG icons for app's log page
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:27 -04:00
Sunil Mohan Adapa
4b1d14fa7f
ui: Use inline SVG icons for app's service-not-running message
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:24 -04:00
Sunil Mohan Adapa
e70478711a
firstboot: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:21 -04:00
Sunil Mohan Adapa
bcc6bdc922
networks: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:19 -04:00
Sunil Mohan Adapa
663a2eb5c4
ui: Use inline SVG icons for clients launch buttons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:17 -04:00
Sunil Mohan Adapa
bd20469ed0
ui: Use inline SVG icons for tag search
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:14 -04:00
Sunil Mohan Adapa
a2c362a1b3
gitweb: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:11 -04:00
Sunil Mohan Adapa
d8909277a5
storage: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:09 -04:00
Sunil Mohan Adapa
1b24a03774
diagnostics: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:06 -04:00
Sunil Mohan Adapa
fad1f7d58b
snapshot: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:04 -04:00
Sunil Mohan Adapa
fbdd0c269d
sharing: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:14:01 -04:00
Sunil Mohan Adapa
5533ac419a
security: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:58 -04:00
Sunil Mohan Adapa
887514a523
kiwix: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:55 -04:00
Sunil Mohan Adapa
1212504a10
calibre: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:53 -04:00
Sunil Mohan Adapa
54b270d8f3
bepasty: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:50 -04:00
Sunil Mohan Adapa
cc716e20e4
matrixsynapse: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:47 -04:00
Sunil Mohan Adapa
236f90bbd9
help: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:45 -04:00
Sunil Mohan Adapa
59218c16a8
email: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:42 -04:00
Sunil Mohan Adapa
d0d26866bd
users: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:39 -04:00
Sunil Mohan Adapa
66f2307a19
miniflux: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:37 -04:00
Sunil Mohan Adapa
340b7e6101
samba: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:34 -04:00
Sunil Mohan Adapa
165828934e
ikiwiki: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:31 -04:00
Sunil Mohan Adapa
acd5477b11
pagekite: Fix issue with adding custom services
Tests:

- Adding and deleting a custom service no longer results in an error message.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:28 -04:00
Sunil Mohan Adapa
6bb6969eef
pagekite: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:26 -04:00
Sunil Mohan Adapa
cc13bbb0e3
power: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:23 -04:00
Sunil Mohan Adapa
66a6783a43
ui: Use inline SVG icons for port fowarding info
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:19 -04:00
Sunil Mohan Adapa
69c44af700
help: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:16 -04:00
Sunil Mohan Adapa
7c07126fe9
dynamicdns: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:13 -04:00
Sunil Mohan Adapa
941b586cb9
wireguard: Use inline SVG icons
Tests:

- All the icons appear as before in both light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:10 -04:00
Sunil Mohan Adapa
72dd357d43
tiddlywiki: Use inline SVG icons for app
Tests:

- The icons appears as before in the app page in light/dark themes.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:06 -04:00
Sunil Mohan Adapa
536c4bb30b
featherwiki: Use inline SVG icons for app
Tests:

- The icons appears as before in the app page in light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:13:01 -04:00
Sunil Mohan Adapa
811b18c239
names: Use inline SVG icons for main app page
Tests:

- The icons appears as before on the add/edit/delete buttons in light/dark
themes.

- The icon appears as before on the error message.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:57 -04:00
Sunil Mohan Adapa
3e6c8e9b06
ui: Use inline SVG icons for internal zone message
Tests:

- In Privoxy app with only internal interface defined, the icon appears as
before in message in light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:53 -04:00
Sunil Mohan Adapa
f56d5f1b0f
ui: Use inline SVG icons for notification dropdown
Tests:

- The icon appears as before in navbar in light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:50 -04:00
Sunil Mohan Adapa
a951b5f606
ui: Use inline SVG icons for app toolbar
Tests:

- The icons appears as before in toolbar in light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:46 -04:00
Sunil Mohan Adapa
80730bc9b3
ui: Use inline SVG icons for breadcrumbs
Tests:

- The home icon appears as before in breadcrumb in light/dark themes.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:42 -04:00
Sunil Mohan Adapa
c12e4079c6
ui: Add rest of the icons used from fork-awesome set
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:38 -04:00
Sunil Mohan Adapa
aed23630fb
ui: Use inline SVG icons for system and help section page
Tests:

- All the icons appear as before.

- They change colors in light/dark mode.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:33 -04:00
Sunil Mohan Adapa
d02154e2f0
clients: Use SVG icons when showing external links
Tests:

- Icons works in light/dark mode.

- All icons appear as expected.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:28 -04:00
Sunil Mohan Adapa
4a3ca01059
html: Drop trailing slash from void elements
See: https://github.com/validator/validator/wiki/Markup-%C2%BB-Void-elements

Tests:

- Fewer info messages in w3c HTML validator.

- Page loads and works as usual.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:20 -04:00
Sunil Mohan Adapa
144efd71b8
html: Drop type attribute value of text/javascript
As is encouraged[1]

https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/script#attribute_is_not_set_default_an_empty_string_or_a_javascript_mime_type

Links:

- Apps page loads and javascript works as expected.

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:14 -04:00
Sunil Mohan Adapa
6defd3e8ce
ui: Use inline SVG images for app icons for dark mode adaptation
- Use 'currentColor' as color in SVG images to make them adapt to light/dark
modes.

- Introduce a new {% icon %} template tag to read SVG files, attach attributes,
remove <?xml> header, and make all IDs inside unique.

- Use the {% icon %} template tag to inline SVGs in app page, home page,
app pages, and notifications.

- Relax the content security policy to allow inline styling with 'style='
attribute.

Tests:

- Allow the icons looks as before in the following pages: home page, apps page,
app specific page, and in notifications.

- Icons that are fully dark become white when theme is switched to dark mode.

- All the inlined SVG icons have a prefixed unique ID.

- W3C HTML validator shows no new errors.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:12:04 -04:00
Sunil Mohan Adapa
c0dcd15169
ui: Simplify SVG app icons for using them inline in HTML
- Drop unnecessary inkscape markup.

- Ensure that all the SVGs have viewBox='' attribute.

- Drop unnecessary id='' attributes.

- Prefix all IDs with 'autoidmagic-'. This will be replaced with a random string
for each inlining in HTML to avoid duplicate IDs.

Tests:

- All SVGs appear the same as before.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-03-19 19:11:54 -04:00
296 changed files with 27057 additions and 30263 deletions

View File

@ -484,6 +484,9 @@ def parse_arguments() -> argparse.Namespace:
help='Disk image size to resize to after download')
subparser.add_argument('--hkp-client', choices=('gpg', 'wget'),
default='gpg', help='Client for key retrieval')
subparser.add_argument(
'--skip-install', action='store_true',
help='Skip running make provision-dev in the container')
# Print IP address
subparser = subparsers.add_parser(
@ -686,10 +689,27 @@ def _verify_signature(hkp_client: str, data_file: pathlib.Path,
def _extract_image(compressed_file: pathlib.Path):
"""Extract the image file."""
decompressed_file = compressed_file.with_suffix('')
# Strip the .xz extension, then replace .img with .raw
decompressed_file = compressed_file.with_suffix('').with_suffix('.raw')
older_image = compressed_file.with_suffix('')
if decompressed_file.exists():
return decompressed_file
# Rename older image and its corresponding state files.
if older_image.exists():
logger.info('Renaming .img file to .raw')
older_image.rename(decompressed_file)
for ext in ['.setup', '.provisioned']:
old_state = older_image.with_suffix(older_image.suffix + ext)
new_state = decompressed_file.with_suffix(
decompressed_file.suffix + ext)
if old_state.exists():
old_state.rename(new_state)
return decompressed_file
logger.info('Decompressing file %s', compressed_file)
partial_file = compressed_file.with_suffix('.partial')
with partial_file.open('w', encoding='utf-8') as file_handle:
@ -712,7 +732,8 @@ def _get_compressed_image_path(distribution: str) -> pathlib.Path:
def _get_image_file(distribution: str) -> pathlib.Path:
"""Return the path of the image file."""
compressed_image = _get_compressed_image_path(distribution)
return compressed_image.with_suffix('')
# Strip the .xz extension, then replace .img with .raw
return compressed_image.with_suffix('').with_suffix('.raw')
def _get_project_folder() -> pathlib.Path:
@ -946,7 +967,7 @@ def _setup_ssh(image_file: pathlib.Path):
_runc(image_file, ['chown', 'fbx:fbx', '/home/fbx/.ssh/authorized_keys'])
def _setup_image(image_file: pathlib.Path):
def _setup_image(image_file: pathlib.Path, skip_install: bool = False):
"""Prepare the image for execution."""
setup_file = image_file.with_suffix(image_file.suffix + '.setup')
if setup_file.exists():
@ -958,9 +979,10 @@ def _setup_image(image_file: pathlib.Path):
_runc(image_file, ['tee', '/etc/apt/apt.conf.d/20auto-upgrades'],
input=contents.encode())
logger.info('In image: Disabling FreedomBox service')
_runc(image_file, ['systemctl', 'disable', 'plinth'],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
if not skip_install:
logger.info('In image: Disabling FreedomBox service')
_runc(image_file, ['systemctl', 'disable', 'plinth'],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
logger.info('In image: Creating virtiofs mount at /freedombox')
mount = '''[Unit]
@ -1018,15 +1040,19 @@ def _is_provisioned(distribution: str) -> bool:
return provision_file.exists()
def _provision(image_file: pathlib.Path, machine_type: str, distribution: str):
def _provision(image_file: pathlib.Path, machine_type: str, distribution: str,
skip_install: bool = False):
"""Run app setup inside the container."""
if _is_provisioned(distribution):
return
machine = Machine.get_instance(machine_type, distribution)
ssh_command = machine.get_ssh_command()
subprocess.run(ssh_command + ['bash'], check=True,
input=PROVISION_SCRIPT.encode())
if skip_install:
logger.info('Skipping provision step (--skip-install)')
else:
machine = Machine.get_instance(machine_type, distribution)
ssh_command = machine.get_ssh_command()
subprocess.run(ssh_command + ['bash'], check=True,
input=PROVISION_SCRIPT.encode())
provision_file = image_file.with_suffix(image_file.suffix + '.provisioned')
provision_file.touch()
@ -1329,9 +1355,8 @@ VirtualEthernet=yes
if result.returncode:
raise Exception(f'Image file {image_link} is not a symlink.')
subprocess.run(['sudo', 'rm', '--force',
str(image_link)], check=False)
# May be linked to wrong place (such as old .img file)
subprocess.run(['sudo', 'rm', '--force', str(image_link)], check=False)
subprocess.run([
'sudo', 'ln', '--symbolic',
str(image_file.resolve()),
@ -1476,10 +1501,11 @@ def subcommand_start(arguments: argparse.Namespace):
arguments.hkp_client)
_resize_disk_image(image_file, arguments.image_size,
arguments.distribution)
_setup_image(image_file)
_setup_image(image_file, arguments.skip_install)
machine.setup()
machine.launch()
_provision(image_file, arguments.machine_type, arguments.distribution)
_provision(image_file, arguments.machine_type, arguments.distribution,
arguments.skip_install)
_print_banner(arguments.machine_type, arguments.distribution)

97
debian/changelog vendored
View File

@ -1,3 +1,100 @@
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,7 +78,6 @@ 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,14 +101,6 @@ Copyright: 2020 Adwaita Icon Theme Authors, GNOME Project
Comment: https://github.com/GNOME/adwaita-icon-theme/ http://www.gnome.org
License: LGPL-3 or CC-BY-SA-3.0-US
Files: static/themes/default/icons/f-droid.png
static/themes/default/icons/f-droid.svg
Copyright: 2012 William Theaker
2013 Robert Martinez
2015 Andrew Nayenko
Comment: https://gitlab.com/fdroid/artwork/blob/master/fdroid-logo-2015/fdroid-logo.svg
License: CC-BY-SA-3.0 or GPL-3+
Files: plinth/modules/featherwiki/static/icons/featherwiki.png
plinth/modules/featherwiki/static/icons/featherwiki.svg
Copyright: 2022 Robbie Antenesse <dev@alamantus.com>
@ -121,15 +113,6 @@ Copyright: 2010 Git Authors
Comment: https://github.com/git/git/blob/master/gitweb/static/git-logo.png
License: GPL-2
Files: static/themes/default/icons/google-play.png
Copyright: Chameleon Design (https://thenounproject.com/Chamedesign/)
Comment: https://thenounproject.com/icon/887917/
License: CC-BY-3.0-US
Files: static/themes/default/icons/gnu-linux.png
Copyright: 2017 Cowemoji
License: CC0-1.0
Files: plinth/modules/homeassistant/static/icons/homeassistant.png
plinth/modules/homeassistant/static/icons/homeassistant.svg
Copyright: Home Assistant Core Developers
@ -161,12 +144,6 @@ Copyright: 2020 The other Kiwix guy
Comment: https://commons.wikimedia.org/wiki/File:Kiwix_logo_v3.svg
License: CC-BY-SA-4.0
Files: static/themes/default/icons/macos.png
static/themes/default/icons/macos.svg
Copyright: Vectors Market (https://thenounproject.com/vectorsmarket/)
Comment: https://thenounproject.com/icon/1203053/
License: CC-BY-SA-3.0
Files: plinth/modules/matrixsynapse/static/icons/matrixsynapse.png
Copyright: 2017 Kishan Raval
Comment: https://github.com/thekishanraval/Logos
@ -340,12 +317,6 @@ Copyright: 2011-2021 WordPress Contributors
Comment: https://github.com/WordPress/wordpress-develop/blob/master/src/wp-admin/images/wordpress-logo.svg
License: GPL-2+
Files: static/themes/default/icons/windows.png
static/themes/default/icons/windows.svg
Copyright: 2007 ruli (https://thenounproject.com/2007ruli/)
Comment: https://thenounproject.com/icon/1206946/
License: CC-BY-SA-3.0
Files: plinth/modules/wireguard/static/icons/wireguard.png
plinth/modules/wireguard/static/icons/wireguard.svg
Copyright: 2019 WireGuard LLC
@ -357,6 +328,85 @@ Copyright: 2008 GNOME icon artists
Comment: https://commons.wikimedia.org/wiki/File:Gnome-computer.svg
License: LGPL-3+ or CC-BY-SA-3.0
Files: static/themes/default/icons/adjust.svg
static/themes/default/icons/android.svg
static/themes/default/icons/arrow-right.svg
static/themes/default/icons/ban.svg
static/themes/default/icons/bar-chart.svg
static/themes/default/icons/bars.svg
static/themes/default/icons/bell-o.svg
static/themes/default/icons/book.svg
static/themes/default/icons/check-circle.svg
static/themes/default/icons/check.svg
static/themes/default/icons/chevron-right.svg
static/themes/default/icons/clock-o.svg
static/themes/default/icons/cog.svg
static/themes/default/icons/comments.svg
static/themes/default/icons/compass.svg
static/themes/default/icons/debian.svg
static/themes/default/icons/download.svg
static/themes/default/icons/eject.svg
static/themes/default/icons/exclamation-triangle.svg
static/themes/default/icons/external-link.svg
static/themes/default/icons/eye-slash.svg
static/themes/default/icons/eye.svg
static/themes/default/icons/f-droid.svg
static/themes/default/icons/files-o.svg
static/themes/default/icons/film.svg
static/themes/default/icons/flag.svg
static/themes/default/icons/freedombox.svg
static/themes/default/icons/frown-o.svg
static/themes/default/icons/globe-w.svg
static/themes/default/icons/gnu-linux.svg
static/themes/default/icons/google-play.svg
static/themes/default/icons/hdd-o.svg
static/themes/default/icons/heartbeat.svg
static/themes/default/icons/heart.svg
static/themes/default/icons/home.svg
static/themes/default/icons/hourglass-o.svg
static/themes/default/icons/info-circle.svg
static/themes/default/icons/key.svg
static/themes/default/icons/life-ring.svg
static/themes/default/icons/line-chart.svg
static/themes/default/icons/lock.svg
static/themes/default/icons/macos.svg
static/themes/default/icons/moon.svg
static/themes/default/icons/pencil-square-o.svg
static/themes/default/icons/plus.svg
static/themes/default/icons/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
@ -2848,3 +2898,94 @@ License: Zlib
.
3. This notice may not be removed or altered from any source
distribution.
License: OFL-1.1
This Font Software is licensed under the SIL Open Font License,
Version 1.1.
.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
.
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
.
PREAMBLE The goals of the Open Font License (OFL) are to stimulate
worldwide development of collaborative font projects, to support the font
creation efforts of academic and linguistic communities, and to provide
a free and open framework in which fonts may be shared and improved in
partnership with others.
.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves.
The fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply to
any document created using the fonts or their derivatives.
.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such.
This may include source files, build scripts and documentation.
.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
.
"Original Version" refers to the collection of Font Software components
as distributed by the Copyright Holder(s).
.
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting ? in part or in whole ?
any of the components of the Original Version, by changing formats or
by porting the Font Software to a new environment.
.
"Author" refers to any designer, engineer, programmer, technical writer
or other person who contributed to the Font Software.
.
PERMISSION & CONDITIONS
.
Permission is hereby granted, free of charge, to any person obtaining a
copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
.
1) Neither the Font Software nor any of its individual components, in
Original or Modified Versions, may be sold by itself.
.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the
corresponding Copyright Holder. This restriction only applies to the
primary font name as presented to the users.
.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
.
5) The Font Software, modified or unmodified, in part or in whole, must
be distributed entirely under this license, and must not be distributed
under any other license. The requirement for fonts to remain under
this license does not apply to any document created using the Font
Software.
.
TERMINATION
This license becomes null and void if any of the above conditions are not met.
.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
DEALINGS IN THE FONT SOFTWARE.

View File

@ -109,20 +109,25 @@ manual-pages-xml:=$(patsubst %.raw.wiki, %.xml, $(manual-pages-raw-wiki))
manual-pages: $(manual-pages-part-html)
$(manual-pdfs): %.pdf: %.xml
xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf -o $(dir $@) $<
@echo "[PDF] $<"
@xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf -o $(dir $@) $< 2> /dev/null
$(manual-pages-part-html): %.part.html: %.xml
xsltproc /usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml5/docbook.xsl $< | \
@echo "[XSLT] $<"
@xsltproc /usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml5/docbook.xsl $< 2> /dev/null | \
perl -pe 'BEGIN {undef $$/} s/.*<body[^>]*>(.*)<\/body\s*>.*/$$1/si' > $@
@rm -f $(dir $@)docbook.css
@rm -f docbook.css
$(manual-xmls) $(manual-pages-xml): %.xml: %.raw.wiki $(SCRIPTS_DIR)/wikiparser.py
$(SCRIPTS_DIR)/wikiparser.py $< | xmllint --format - > $@
@echo "[WIKIPARSE] $<"
@$(SCRIPTS_DIR)/wikiparser.py $< | xmllint --format - > $@
%.1: %.xml
xmlto man $<
@echo "[MAN] $<"
@xmlto man $< 2> /dev/null
.PHONY: clean
clean:
rm -f $(manual-pages-part-html) $(manual-pages-xml) $(manual-xmls)
rm -f $(OUTPUTS)
@echo "[RM] {part-htmls} {xmls} {manuals} {outputs}"
@rm -f $(manual-pages-part-html) $(manual-pages-xml) $(manual-xmls)
@rm -f $(OUTPUTS)

View File

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

View File

@ -8,7 +8,46 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== FreedomBox 26.4.1 (2026-03-08) ==
== FreedomBox 26.5 (2026-03-23) ==
=== Highlights ===
* action_utils: Don't restart web interface when installing an app
* apache: Use a Uwsgi native socket systemd unit for each app
* ui: Use inline SVG icons for all apps
* wireguard: Fix freedombox VPN IP for services
=== Other Changes ===
* action_utils: Stop associated service when stopping a socket unit
* apache: Increase OpenID Connect RP session timeout activity
* apache: Minor improvement to getting the request host
* app: Fix build issue with Django 5.x
* clients: Fix formatting of package row in table
* clients: Fix show empty clients in Desktop section
* clients: Use SVG icons when showing external links
* container: Add option to skip install
* container: Fix image extension to .raw for systemd v260
* doc: Reduce verbosity when building documentation
* html: Drop trailing slash from void elements
* html: Drop type attribute value of text/javascript
* janus: Drop unused reference to font-awesome
* letsencrypt: Don't perform operations on apps that are not installed
* locale: Update translations for German, Russian, Swedish
* pagekite: Fix issue with adding custom services
* tests: functional: Drop undefined 'sso' pytest mark
* ui: Add rest of the icons used from fork-awesome set
* ui: Better placement for dropdown indicator in dropdown button
* ui: Drop fonts-fork-awesome as dependency
* ui: Rename 'plinth_extras' template tags module to 'extras'
* ui: Simplify SVG app icons for using them inline in HTML
* ui: Use inline SVG icons for buttons, messages, spinners, etc.
* wireguard: Add button for direct APK download
* wireguard: Add entries for Homebrew and RPM packages
* wireguard: Remove client entry for F-Droid which is not available
* wireguard: Update windows client link
== FreedomBox 26.4.2 (2026-03-08) ==
=== Highlights ===
@ -18,7 +57,7 @@ The following are the release notes for each !FreedomBox version.
* container: Hold freedombox packages during test setup
* d/control: Trim deps for nocheck build profile
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Turkish
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Russian, Turkish
* Vagrantfile: Enable public network for bridged networking
== FreedomBox 26.4 (2026-03-02) ==

View File

@ -8,7 +8,46 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== FreedomBox 26.4.1 (2026-03-08) ==
== FreedomBox 26.5 (2026-03-23) ==
=== Highlights ===
* action_utils: Don't restart web interface when installing an app
* apache: Use a Uwsgi native socket systemd unit for each app
* ui: Use inline SVG icons for all apps
* wireguard: Fix freedombox VPN IP for services
=== Other Changes ===
* action_utils: Stop associated service when stopping a socket unit
* apache: Increase OpenID Connect RP session timeout activity
* apache: Minor improvement to getting the request host
* app: Fix build issue with Django 5.x
* clients: Fix formatting of package row in table
* clients: Fix show empty clients in Desktop section
* clients: Use SVG icons when showing external links
* container: Add option to skip install
* container: Fix image extension to .raw for systemd v260
* doc: Reduce verbosity when building documentation
* html: Drop trailing slash from void elements
* html: Drop type attribute value of text/javascript
* janus: Drop unused reference to font-awesome
* letsencrypt: Don't perform operations on apps that are not installed
* locale: Update translations for German, Russian, Swedish
* pagekite: Fix issue with adding custom services
* tests: functional: Drop undefined 'sso' pytest mark
* ui: Add rest of the icons used from fork-awesome set
* ui: Better placement for dropdown indicator in dropdown button
* ui: Drop fonts-fork-awesome as dependency
* ui: Rename 'plinth_extras' template tags module to 'extras'
* ui: Simplify SVG app icons for using them inline in HTML
* ui: Use inline SVG icons for buttons, messages, spinners, etc.
* wireguard: Add button for direct APK download
* wireguard: Add entries for Homebrew and RPM packages
* wireguard: Remove client entry for F-Droid which is not available
* wireguard: Update windows client link
== FreedomBox 26.4.2 (2026-03-08) ==
=== Highlights ===
@ -18,7 +57,7 @@ The following are the release notes for each !FreedomBox version.
* container: Hold freedombox packages during test setup
* d/control: Trim deps for nocheck build profile
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Turkish
* locale: Update translations for Albanian, Chinese (Simplified Han script), Czech, Russian, Turkish
* Vagrantfile: Enable public network for bridged networking
== FreedomBox 26.4 (2026-03-02) ==

View File

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

View File

@ -18,9 +18,6 @@ from . import actions
logger = logging.getLogger(__name__)
UWSGI_ENABLED_PATH = '/etc/uwsgi/apps-enabled/{config_name}.ini'
UWSGI_AVAILABLE_PATH = '/etc/uwsgi/apps-available/{config_name}.ini'
# Flag on disk to indicate if freedombox package was held by
# plinth. This is a backup in case the process is interrupted and hold
# is not released.
@ -123,6 +120,14 @@ def service_disable(service_name: str, check: bool = False):
except subprocess.CalledProcessError:
pass
if service_name.endswith('.socket'):
# Instead, may need to query the unit for associated .service file.
base_name = service_name.rpartition('.')[0]
try:
service_stop(f'{base_name}.service', check=check)
except subprocess.CalledProcessError:
pass
def service_mask(service_name: str, check: bool = False):
"""Mask a service"""
@ -310,43 +315,6 @@ class WebserverChange:
self.actions_required.add(action_required)
def uwsgi_is_enabled(config_name):
"""Return whether a uwsgi config is enabled."""
enabled_path = UWSGI_ENABLED_PATH.format(config_name=config_name)
return os.path.exists(enabled_path)
def uwsgi_enable(config_name):
"""Enable a uwsgi configuration that runs under uwsgi."""
if uwsgi_is_enabled(config_name):
return
# uwsgi is started/stopped using init script. We don't know if it can
# handle some configuration already running against newly enabled
# configuration. So, stop first before enabling new configuration.
service_stop('uwsgi')
enabled_path = UWSGI_ENABLED_PATH.format(config_name=config_name)
available_path = UWSGI_AVAILABLE_PATH.format(config_name=config_name)
os.symlink(available_path, enabled_path)
service_enable('uwsgi')
service_start('uwsgi')
def uwsgi_disable(config_name):
"""Disable a uwsgi configuration that runs under uwsgi."""
if not uwsgi_is_enabled(config_name):
return
# If uwsgi is restarted later, it won't stop the just disabled
# configuration due to how init scripts are written for uwsgi.
service_stop('uwsgi')
enabled_path = UWSGI_ENABLED_PATH.format(config_name=config_name)
os.unlink(enabled_path)
service_start('uwsgi')
def get_addresses() -> list[dict[str, str | bool]]:
"""Return a list of IP addresses and hostnames."""
addresses = get_ip_addresses()
@ -469,9 +437,31 @@ def is_disk_image():
return os.path.exists('/var/lib/freedombox/is-freedombox-disk-image')
def run_apt_command(arguments, enable_triggers: bool = False):
def run_apt_command(arguments, enable_triggers: bool = False,
allow_freedombox_restart=False):
"""Run apt-get with provided arguments."""
command = ['apt-get', '--assume-yes', '--quiet=2'] + arguments
command = []
if not allow_freedombox_restart:
# Don't restart the freedombox web service. This configuration is only
# used when apt command is invoked from freedombox web service itself
# (such as during an app's installation/uninstallation).
#
# If this is not done, a freedombox web service restart is attempted.
# needsrestart will wait until the restart is completed. apt command
# will wait until needsrestart is completed. The restart mechanism in
# service will wait until all currently running threads are completed.
# One thread that has invoked this apt command will not finish as it
# waits for apt command to finish. This results in a deadlock. Avoid
# this by not attempting to restart freedombox web service when apt
# command is invoked from freedombox web service.
mount_path = '/etc/needrestart/conf.d/freedombox-self.conf'
orig_path = f'/usr/share/freedombox{mount_path}'
command = [
'systemd-run', '--pipe',
f'--property=BindReadOnlyPaths={orig_path}:{mount_path}'
]
command += ['apt-get', '--assume-yes', '--quiet=2'] + arguments
env = os.environ.copy()
env['DEBIAN_FRONTEND'] = 'noninteractive'

View File

@ -574,10 +574,19 @@ class Info(FollowerComponent):
except ImproperlyConfigured:
# Hack to allow apps to be instantiated without Django
# initialization as required by privileged process.
return [
tag._proxy____args[0] if isinstance(tag, Promise) else tag
for tag in self._tags
]
def _make_str(tag):
"""Return the string without casting."""
if not isinstance(tag, Promise):
return tag
# Django 4.2
if hasattr(tag, '_proxy____args'):
return tag._proxy____args[0]
# Django 5.x
return tag._args[0]
return [_make_str(tag) for tag in self._tags]
class EnableState(LeaderComponent):

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -24,14 +24,14 @@ class Menu(app.FollowerComponent):
name is the label of the menu item.
icon is the icon to be displayed for the menu item. Icon can be the
name of a glyphicon from the Fork Awesome font's icon set:
https://forkawesome.github.io/Fork-Awesome/icons/. In this case, the
icon name starts with the string 'fa-'. Alternatively, the icon can
also be a file under the directory plinth/modules/<app>/static/icons/,
provided without an extension. SVG icons are preferred. Currently, both
PNG and SVG icons with the same name are used. For example, if the
value of icon is 'myicon' and app_id in App class is 'myapp', then two
icons files plinth/modules/myapp/static/icons/myicon.svg and
name of an SVG icon from the static/theme/icons directory. In this
case, the icon name starts with the string 'fa-' (a tribute to the
fork-awesome project). Alternatively, the icon can also be a file under
the directory plinth/modules/<app>/static/icons/, provided without an
extension. SVG icons are preferred. Currently, both PNG and SVG icons
with the same name are used. For example, if the value of icon is
'myicon' and app_id in App class is 'myapp', then two icons files
plinth/modules/myapp/static/icons/myicon.svg and
plinth/modules/myapp/static/icons/myicon.png are used in the interface.
tags is a list of tags that describe the app. Tags help users to find

View File

@ -230,7 +230,7 @@ CONTENT_SECURITY_POLICY = CSPDict({
# scripts).
'script-src': "'self'",
# Allow inline CSS and CSS files from Freedombox itself.
'style-src': "'self'",
'style-src': "'self' 'unsafe-inline'",
# Web worker sources are allowed only from FreedomBox itself (for
# JSXC).
'worker-src': "'self'",

View File

@ -86,7 +86,7 @@ class ApacheApp(app_module.App):
app_id = 'apache'
_version = 16
_version = 17
def __init__(self) -> None:
"""Create components for the app."""
@ -97,8 +97,8 @@ class ApacheApp(app_module.App):
self.add(info)
packages = Packages('packages-apache', [
'apache2', 'php-fpm', 'ssl-cert', 'uwsgi', 'uwsgi-plugin-python3',
'libapache2-mod-auth-openidc'
'apache2', 'php-fpm', 'ssl-cert', 'uwsgi-core',
'uwsgi-plugin-python3', 'libapache2-mod-auth-openidc'
])
self.add(packages)
@ -134,6 +134,7 @@ class ApacheApp(app_module.App):
daemon = Daemon('daemon-apache', 'apache2')
self.add(daemon)
# To be able to disable the old uwsgi init.d script.
related_daemon = RelatedDaemon('related-daemon-apache', 'uwsgi')
self.add(related_daemon)

View File

@ -210,42 +210,6 @@ class WebserverRoot(app.FollowerComponent):
kvstore.delete(self._key_get(), ignore_missing=True)
class Uwsgi(app.LeaderComponent):
"""Component to enable/disable uWSGI configuration."""
def __init__(self, component_id: str, uwsgi_name: str):
"""Initialize the uWSGI component.
component_id should be a unique ID across all components of an app and
across all components.
uwsgi_name is the primary part of the configuration file path which
must be enabled/disabled by this component.
"""
super().__init__(component_id)
self.uwsgi_name = uwsgi_name
def is_enabled(self) -> bool:
"""Return whether the uWSGI configuration is enabled."""
return action_utils.uwsgi_is_enabled(self.uwsgi_name) \
and action_utils.service_is_enabled('uwsgi')
def enable(self) -> None:
"""Enable the uWSGI configuration."""
privileged.uwsgi_enable(self.uwsgi_name)
def disable(self) -> None:
"""Disable the uWSGI configuration."""
privileged.uwsgi_disable(self.uwsgi_name)
def is_running(self) -> bool:
"""Return whether the uWSGI daemon is running with configuration."""
return action_utils.uwsgi_is_enabled(self.uwsgi_name) \
and action_utils.service_is_running('uwsgi')
def diagnose_url(url: str, kind: str | None = None,
env: dict[str, str] | None = None,
check_certificate: bool = True,

View File

@ -237,6 +237,30 @@ def _setup_oidc_config():
Keep the metadata directory and configuration file unreadable by non-admin
users since they contain module's crypto secret and OIDC client secret.
# Session management
When apps like Syncthing are protected with mod_auth_openidc, there a
session maintained using server-side session storage and a cookie on the
client side. This session is different from the session managed by the
OpenID Connect Provider (FreedomBox web interface). As long as this session
is valid, no further authentication mechanisms are triggered.
When the session expires, if the request is a GET request (due to page
reload), the browser is redirected to OP, a fresh token is created, and the
page is loaded. However, for POST requests, 401 error is returned and if
the application is unaware, it won't do much about it. So, this
necessitates keeping the session timeout value high.
When logout is performed on FreedomBox web interface, mod_auth_openidc
cookie is also removed and logout feels instantaneous. However, this won't
work for applications not using mod_auth_openidc and for applications
hosted on other domains. A better way to do this is to implement OpenID
Connect's Back-Channel Logout or using OpenID Connect Session Management.
For more about session management see:
https://github.com/OpenIDC/mod_auth_openidc/wiki/Sessions-and-Timeouts and
https://github.com/OpenIDC/mod_auth_openidc/wiki/Session-Management-Settings
"""
metadata_dir_path.parent.mkdir(mode=0o700, parents=True, exist_ok=True)
metadata_dir_path.mkdir(mode=0o700, exist_ok=True)
@ -259,6 +283,13 @@ def _setup_oidc_config():
OIDCSSLValidateServer Off
OIDCProviderMetadataRefreshInterval 86400
# Expire the mod_auth_openidc session (not the OpenID Conneect Provider
# session) after 10 hours of idle with a maximum session duration equal to
# the expiry time of the ID token (10 hours). This allows applications such
# as FeatherWiki to have long editing sessions before save.
OIDCSessionInactivityTimeout 36000
OIDCSessionMaxDuration 0
# Use relative URL to return to the original domain
OIDCRedirectURI /apache/oidc/callback
OIDCRemoteUserClaim sub
@ -331,18 +362,6 @@ def unlink_root(domain: str):
action_utils.service_reload('apache2')
@privileged
def uwsgi_enable(name: str):
"""Enable uWSGI configuration and reload."""
action_utils.uwsgi_enable(name)
@privileged
def uwsgi_disable(name: str):
"""Disable uWSGI configuration and reload."""
action_utils.uwsgi_disable(name)
@privileged
def domain_setup(domain: str):
"""Add site specific configuration for a domain."""

View File

@ -10,7 +10,7 @@ import pytest
from plinth import app, kvstore
from plinth.diagnostic_check import DiagnosticCheck, Result
from plinth.modules.apache.components import (Uwsgi, Webserver, WebserverRoot,
from plinth.modules.apache.components import (Webserver, WebserverRoot,
check_url, diagnose_url,
diagnose_url_on_all)
@ -326,81 +326,6 @@ def test_webserver_root_uninstall(component_app, enable, disable):
assert kvstore.get_default('test-webserver_domain', 'x-value') == 'x-value'
def test_uwsgi_init():
"""Test that uWSGI component can be initialized."""
with pytest.raises(ValueError):
Uwsgi(None, None)
uwsgi = Uwsgi('test-uwsgi', 'test-config')
assert uwsgi.component_id == 'test-uwsgi'
assert uwsgi.uwsgi_name == 'test-config'
@patch('plinth.action_utils.service_is_enabled')
@patch('plinth.action_utils.uwsgi_is_enabled')
def test_uwsgi_is_enabled(uwsgi_is_enabled, service_is_enabled):
"""Test that checking uwsgi configuration enabled works."""
uwsgi = Uwsgi('test-uwsgi', 'test-config')
uwsgi_is_enabled.return_value = True
service_is_enabled.return_value = True
assert uwsgi.is_enabled()
uwsgi_is_enabled.assert_has_calls([call('test-config')])
service_is_enabled.assert_has_calls([call('uwsgi')])
service_is_enabled.return_value = False
assert not uwsgi.is_enabled()
uwsgi_is_enabled.return_value = False
assert not uwsgi.is_enabled()
service_is_enabled.return_value = False
assert not uwsgi.is_enabled()
@patch('plinth.modules.apache.privileged.uwsgi_enable')
def test_uwsgi_enable(enable):
"""Test that enabling uwsgi configuration works."""
uwsgi = Uwsgi('test-uwsgi', 'test-config')
uwsgi.enable()
enable.assert_has_calls([call('test-config')])
@patch('plinth.modules.apache.privileged.uwsgi_disable')
def test_uwsgi_disable(disable):
"""Test that disabling uwsgi configuration works."""
uwsgi = Uwsgi('test-uwsgi', 'test-config')
uwsgi.disable()
disable.assert_has_calls([call('test-config')])
@patch('plinth.action_utils.service_is_running')
@patch('plinth.action_utils.uwsgi_is_enabled')
def test_uwsgi_is_running(uwsgi_is_enabled, service_is_running):
"""Test checking whether uwsgi is running with a configuration."""
uwsgi = Uwsgi('test-uwsgi', 'test-config')
uwsgi_is_enabled.return_value = True
service_is_running.return_value = True
assert uwsgi.is_running()
uwsgi_is_enabled.assert_has_calls([call('test-config')])
service_is_running.assert_has_calls([call('uwsgi')])
uwsgi_is_enabled.return_value = False
service_is_running.return_value = True
assert not uwsgi.is_running()
uwsgi_is_enabled.return_value = True
service_is_running.return_value = False
assert not uwsgi.is_running()
uwsgi_is_enabled.return_value = False
service_is_running.return_value = False
assert not uwsgi.is_running()
@patch('plinth.modules.apache.components.check_url')
@patch('plinth.action_utils.get_addresses')
def test_diagnose_url(get_addresses, check):
@ -473,8 +398,10 @@ def test_diagnose_url(get_addresses, check):
def test_check_url(run):
"""Test checking whether a URL is accessible."""
url = 'http://localhost/test'
basic_command = ['curl', '--location', '--cookie', '', '--fail',
'--write-out', '%{response_code}']
basic_command = [
'curl', '--location', '--cookie', '', '--fail', '--write-out',
'%{response_code}'
]
extra_args = {'env': None, 'check': True, 'stdout': -1, 'stderr': -1}
# Basic

View File

@ -5,10 +5,11 @@
{% load i18n %}
{% load static %}
{% load extras %}
{% block page_head %}
<link type="text/css" rel="stylesheet"
href="{% static 'backups/backups.css' %}"/>
href="{% static 'backups/backups.css' %}">
{% endblock %}
{% block configuration %}
@ -17,28 +18,28 @@
<a title="{% trans 'Create a new backup' %}"
role="button" class="btn btn-primary"
href="{% url 'backups:create' %}">
<span class="fa fa-plus" aria-hidden="true"></span>
{% icon 'plus' %}
{% trans 'Create Backup' %}
</a>
<a title="{% trans 'Upload and restore a backup archive' %}"
role="button" class="btn btn-default"
href="{% url 'backups:upload' %}">
<span class="fa fa-upload" aria-hidden="true"></span>
{% icon 'upload' %}
{% trans 'Upload and Restore' %}
</a>
<a title="{% trans 'Add a backup location' %}"
role="button" class="btn btn-default"
href="{% url 'backups:add-repository' %}">
<span class="fa fa-plus" aria-hidden="true"></span>
{% icon 'plus' %}
{% trans 'Add Backup Location' %}
</a>
<a title="{% trans 'Add a remote backup location' %}"
role="button" class="btn btn-default"
href="{% url 'backups:add-remote-repository' %}">
<span class="fa fa-plus" aria-hidden="true"></span>
{% icon 'plus' %}
{% trans 'Add Remote Backup Location' %}
</a>
</div>

View File

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

View File

@ -3,6 +3,7 @@
{% endcomment %}
{% load i18n %}
{% load extras %}
<div class="table-responsive repository" data-repository-name="{{ repository.name }}">
<table class="table" class="archives-list">
@ -12,14 +13,13 @@
<div class="d-sm-flex flex-sm-row">
<div class="flex-sm-grow-1 lh-lg collapsible-button"
data-bs-toggle="collapse" data-bs-target="#{{ uuid }}">
<span class="fa fa-chevron-right fa-fw" aria-hidden="true"></span>
{% icon 'chevron-right' %}
{% if repository.error %}
<span class="fa fa-exclamation-triangle mount-error"
aria-hidden="true" title="{{ repository.error }}">
</span>
<span title={{ repository.error }}>
{% icon 'exclamation-triangle' %}</span>
{% elif repository.is_encrypted %}
<span class="fa fa-lock encrypted"
aria-hidden="true" title="{% trans "This repository is encrypted" %}">
<span title="{% trans "This repository is encrypted" %}">
{% icon 'lock' class='svg-icon encrypted' %}
</span>
{% endif %}
@ -29,7 +29,7 @@
<div class="text-end">
<a class="repository-schedule btn btn-sm btn-primary"
href="{% url 'backups:schedule' uuid %}">
<span class="fa fa-clock-o" aria-hidden="true"></span>
{% icon 'clock-o' %}
{% trans "Schedule" %}
</a>
@ -42,7 +42,7 @@
{% csrf_token %}
<button type="submit" class="btn btn-sm btn-default"
title="{% trans 'Unmount Location' %}">
<span class="fa fa-eject" aria-hidden="true"></span>
{% icon 'eject' %}
</button>
</form>
@ -53,7 +53,7 @@
{% csrf_token %}
<button type="submit" class="btn btn-sm btn-default"
title="{% trans 'Mount Location' %}">
<span class="fa fa-eye" aria-hidden="true"></span>
{% icon 'eye' %}
</button>
</form>
@ -66,7 +66,7 @@
<a title="{% trans 'Remove Backup Location. This will not delete the remote backup.' %}"
role="button" class="repository-remove btn btn-sm btn-default"
href="{% url 'backups:repository-remove' uuid %}">
<span class="fa fa-trash-o" aria-hidden="true"></span>
{% icon 'trash-o' %}
</a>
{% endif %}
@ -93,8 +93,7 @@
</a>
<a class="archive-delete btn btn-sm btn-default"
href="{% url 'backups:delete' uuid archive.name %}">
<span class="fa fa-trash-o" aria-hidden="true">
</span>
{% icon 'trash-o' %}
</a>
</td>
</tr>

View File

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

View File

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

View File

@ -6,10 +6,12 @@ from django.utils.translation import gettext_lazy as _
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.config import DropinConfigs
from plinth.modules.apache.components import Uwsgi, Webserver
from plinth.daemon import Daemon
from plinth.modules.apache.components import Webserver
from plinth.modules.backups.components import BackupRestore
from plinth.modules.firewall.components import Firewall
from plinth.package import Packages
from plinth.privileged import service as service_privileged
from . import manifest, privileged
@ -48,7 +50,7 @@ class BepastyApp(app_module.App):
app_id = 'bepasty'
_version = 3
_version = 4
def __init__(self) -> None:
"""Create components for the app."""
@ -83,8 +85,9 @@ class BepastyApp(app_module.App):
ports=['http', 'https'], is_external=True)
self.add(firewall)
uwsgi = Uwsgi('uwsgi-bepasty', 'bepasty-freedombox')
self.add(uwsgi)
daemon = Daemon('daemon-bepasty',
'uwsgi-app@bepasty-freedombox.socket')
self.add(daemon)
webserver = Webserver('webserver-bepasty', 'bepasty-freedombox',
urls=['https://{host}/bepasty/'])
@ -107,6 +110,16 @@ class BepastyApp(app_module.App):
# value.
privileged.set_default(['read'])
if old_version and old_version <= 3:
webserver = self.get_component('webserver-bepasty')
daemon = self.get_component('daemon-bepasty')
if webserver.is_enabled():
daemon.enable()
# Vanquish the old uwsgi init.d script.
service_privileged.disable('uwsgi')
service_privileged.mask('uwsgi')
def uninstall(self):
"""De-configure and uninstall the app."""
super().uninstall()

View File

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

View File

@ -12,5 +12,5 @@
</Location>
<Location /bepasty/>
ProxyPass unix:/run/uwsgi/app/bepasty-freedombox/socket|uwsgi://bepasty/
ProxyPass unix:/run/uwsgi/bepasty-freedombox.socket|uwsgi://bepasty/
</Location>

View File

@ -25,7 +25,7 @@ lazy-apps = true
# Module to import
module = bepasty.wsgi
env = BEPASTY_CONFIG=/etc/bepasty-freedombox.conf
env = BEPASTY_CONFIG=$(CREDENTIALS_DIRECTORY)/bepasty-freedombox.conf
pythonpath = /usr/lib/python3/dist-packages/
buffer-size = 32768

View File

@ -15,9 +15,9 @@ backup = {
'files': ['/etc/bepasty-freedombox.conf']
},
'data': {
'directories': ['/var/lib/bepasty']
'directories': ['/var/lib/bepasty', '/var/lib/private/bepasty']
},
'services': ['uwsgi'],
'services': ['uwsgi-app@bepasty-freedombox.socket'],
}
tags = [_('File sharing'), _('Pastebin')]

View File

@ -2,11 +2,8 @@
"""Configuration helper for bepasty."""
import collections
import grp
import json
import os
import pathlib
import pwd
import secrets
import shutil
import string
@ -17,11 +14,10 @@ from plinth import action_utils
from plinth.actions import privileged, secret_str
from plinth.modules import bepasty
DATA_DIR = '/var/lib/bepasty'
PASSWORD_LENGTH = 20
CONF_FILE = pathlib.Path('/etc/bepasty-freedombox.conf')
DATA_DIR = '/var/lib/private/bepasty'
PASSWORD_LENGTH = 20
SERVICE_NAME = 'uwsgi-app@bepasty-freedombox.service'
def _augeas_load():
@ -66,26 +62,6 @@ def conf_file_write(conf):
@privileged
def setup(domain_name: str):
"""Post installation actions for bepasty."""
# Create bepasty group if needed.
try:
grp.getgrnam('bepasty')
except KeyError:
action_utils.run(['addgroup', '--system', 'bepasty'], check=True)
# Create bepasty user if needed.
try:
pwd.getpwnam('bepasty')
except KeyError:
action_utils.run([
'adduser', '--system', '--ingroup', 'bepasty', '--home',
'/var/lib/bepasty', '--gecos', 'bepasty file sharing', 'bepasty'
], check=True)
# Create data directory if needed.
if not os.path.exists(DATA_DIR):
os.makedirs(DATA_DIR, mode=0o750)
shutil.chown(DATA_DIR, user='bepasty', group='bepasty')
# Create configuration file if needed.
if not CONF_FILE.is_file():
passwords = [_generate_password() for _ in range(3)]
@ -112,7 +88,11 @@ def setup(domain_name: str):
}
conf_file_write(conf)
CONF_FILE.chmod(0o640)
shutil.chown(CONF_FILE, user='bepasty', group='bepasty')
# Migrate from old bepasty:bepasty ownership to root:root
shutil.chown(CONF_FILE, user='root', group='root')
action_utils.run(['deluser', 'bepasty'], check=False)
action_utils.run(['delgroup', 'bepasty'], check=False)
@privileged
@ -132,7 +112,8 @@ def add_password(permissions: list[str], comment: str | None = None):
conf['PERMISSION_COMMENTS'][password] = comment
conf_file_write(conf)
action_utils.service_try_restart('uwsgi')
# Service is started again by socket.
action_utils.service_stop(SERVICE_NAME)
@privileged
@ -145,7 +126,7 @@ def remove_password(password: secret_str):
if password in conf['PERMISSION_COMMENTS']:
del conf['PERMISSION_COMMENTS'][password]
conf_file_write(conf)
action_utils.service_try_restart('uwsgi')
action_utils.service_stop(SERVICE_NAME)
@privileged
@ -153,7 +134,7 @@ def set_default(permissions: list[str]):
"""Set default permissions."""
conf = {'DEFAULT_PERMISSIONS': _format_permissions(permissions)}
conf_file_write(conf)
action_utils.service_try_restart('uwsgi')
action_utils.service_stop(SERVICE_NAME)
def _format_permissions(permissions=None):
@ -173,5 +154,3 @@ def uninstall():
"""Remove bepasty user, group and data."""
shutil.rmtree(DATA_DIR, ignore_errors=True)
CONF_FILE.unlink(missing_ok=True)
action_utils.run(['deluser', 'bepasty'], check=False)
action_utils.run(['delgroup', 'bepasty'], check=False)

View File

@ -1,81 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 512 512"
id="svg3384"
version="1.1"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="bepasty.svg"
inkscape:export-filename="bepasty.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<metadata
id="metadata3392">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs3390">
<linearGradient
id="linearGradient4986"
osb:paint="solid">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4988" />
</linearGradient>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2220"
inkscape:window-height="1580"
id="namedview3388"
showgrid="false"
inkscape:zoom="0.45479912"
inkscape:cx="-148.23239"
inkscape:cy="423.53358"
inkscape:window-x="819"
inkscape:window-y="309"
inkscape:window-maximized="0"
inkscape:current-layer="svg3384"
scale-x="2.1" />
viewBox="0 0 512 512">
<path
d="m 455.13594,110.31437 q 7.96543,7.96544 13.65503,21.62047 5.6896,13.65504 5.6896,25.03423 v 327.72086 q 0,11.3792 -7.96544,19.34463 Q 458.5497,512 447.1705,512 H 64.8295 q -11.3792,0 -19.34463,-7.96544 -7.96544,-7.96543 -7.96544,-19.34463 V 29.522074 q 0,-11.379196 7.96544,-19.344634 Q 53.4503,2.212003 64.8295,2.212003 h 254.894 q 11.3792,0 25.03423,5.6895981 13.65504,5.6895979 21.62047,13.6550359 z M 328.82686,40.901271 V 147.86572 H 435.7913 q -2.8448,-8.24992 -6.25856,-11.66368 L 340.49053,47.159829 Q 337.07677,43.74607 328.82686,40.901271 Z M 438.06714,475.58657 V 184.27914 H 319.7235 q -11.3792,0 -19.34463,-7.96543 -7.96544,-7.96544 -7.96544,-19.34464 V 38.625431 H 73.93286 V 475.58657 Z"
id="path3386"
style="fill:#0000ff;stroke-width:0.28447992"
inkscape:connector-curvature="0" />
style="fill:#0000ff;stroke-width:0.28447992" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.41375899px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.28447992px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="21.294685"
y="467.65359"
id="text3394"
transform="scale(0.95420813,1.0479894)"><tspan
sodipodi:role="line"
id="tspan3396"
x="21.294685"
y="467.65359"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:641.4967041px;line-height:1.25;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">B</tspan></text>
@ -83,43 +19,20 @@
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:3.41375899px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:0.28447992px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="402.81888"
y="219.26285"
id="text3398"><tspan
sodipodi:role="line"
id="tspan3400"
y="219.26285"><tspan
x="402.81888"
y="219.26285"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">p</tspan><tspan
sodipodi:role="line"
x="402.81888"
y="278.71915"
id="tspan3402"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">a</tspan><tspan
sodipodi:role="line"
x="402.81888"
y="338.17545"
id="tspan3404"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">s</tspan><tspan
sodipodi:role="line"
x="402.81888"
y="397.63174"
id="tspan3406"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">t</tspan><tspan
sodipodi:role="line"
x="402.81888"
y="457.08804"
id="tspan3408"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:67.5639801px;line-height:87.99999952%;font-family:'Cabin Condensed';-inkscape-font-specification:'Cabin Condensed, ';fill:#0000ff;stroke-width:0.28447992px">y</tspan></text>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="E"
style="display:inline;opacity:0.578"
transform="translate(0,-1280)" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Deck"
style="display:inline;opacity:1"
transform="translate(0,-1280)" />
</svg>

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

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

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

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

View File

@ -1,70 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="0 0 512 512"
version="1.1"
id="svg90114"
sodipodi:docname="cockpit.svg"
width="512"
height="512"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata90120">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs90118" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3628"
inkscape:window-height="2133"
id="namedview90116"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.978022"
inkscape:cx="-82.324146"
inkscape:cy="2.3236654"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg90114" />
height="512">
<g
id="g867"
transform="scale(8)">
<path
d="M 32,0 C 14.354,0 0,14.353 0,32 0,49.647 14.354,64 32,64 49.646,64 64,49.646 64,32 64,14.354 49.646,0 32,0 Z m 0,4.795 c 15.057,0 27.218,12.148 27.218,27.204 C 59.218,47.055 47.057,59.204 32,59.204 16.944,59.204 4.796,47.056 4.796,32 4.796,16.944 16.944,4.795 32,4.795 Z"
style="color:#000000;text-indent:0;text-decoration:none;text-decoration-line:none;text-transform:none;fill:#3465a4;fill-opacity:1;stroke-width:1.36899996"
id="path90108"
inkscape:connector-curvature="0" />
style="color:#000000;text-indent:0;text-decoration:none;text-decoration-line:none;text-transform:none;fill:#3465a4;fill-opacity:1;stroke-width:1.36899996" />
<path
sodipodi:nodetypes="cccccccccccccccccccccc"
d="m 42.707,18.892 c -1.306,-0.048 -3.285,0.978 -5.064,2.747 l -3.836,3.815 -11.496,-3.86 -2.242,2.314 8.668,6.587 -1.938,1.928 c -0.641243,0.636519 -1.212499,1.33986 -1.704,2.098 l -5.223,-0.39 -1.274,1.292 5.194,3.846 3.798,5.184 1.28,-1.283 -0.386,-5.274 c 0.658,-0.431 1.33,-0.966 1.977,-1.61 l 2.04,-2.029 6.652,8.735 2.314,-2.242 -3.878,-11.552 3.716,-3.695 c 2.372,-2.36 3.465,-5.121 2.451,-6.191 -0.253,-0.268 -0.613,-0.404 -1.049,-0.42 z"
id="path90110"
inkscape:connector-curvature="0"
style="fill:#3465a4;fill-opacity:1;stroke-width:1.36899996" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,67 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="0 0 512 512"
x="0px"
y="0px"
version="1.1"
id="svg12"
sodipodi:docname="coturn.svg"
width="512"
height="512"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
inkscape:export-filename="coturn.png"
inkscape:export-xdpi="48"
inkscape:export-ydpi="48">
<metadata
id="metadata18">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Communication, video, call, camera, talk, record, media</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs16" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1782"
inkscape:window-height="1122"
id="namedview14"
showgrid="false"
inkscape:zoom="0.73750001"
inkscape:cx="23.98607"
inkscape:cy="48.884982"
inkscape:window-x="1233"
inkscape:window-y="454"
inkscape:window-maximized="0"
inkscape:current-layer="svg12" />
<title
id="title2">Communication, video, call, camera, talk, record, media</title>
fill="currentColor">
<g
data-name="Video Call"
id="g6"
transform="matrix(10.24,0,0,10.24,-71.68,-71.68)">
<path
d="m 36.1963,35.02 -5,-1 a 0.9967,0.9967 0 0 0 -1.1025,0.5576 l -2.1484,4.6061 a 19.09,19.09 0 0 1 -9.1286,-9.1286 l 4.6061,-2.1483 a 1.0008,1.0008 0 0 0 0.5576,-1.1026 l -1,-5 A 1,1 0 0 0 22,21 h -6 a 1,1 0 0 0 -1,1 21.0508,21.0508 0 0 0 21,21 1,1 0 0 0 1,-1 V 36 A 1,1 0 0 0 36.1963,35.02 Z M 21.8652,26.4258 18.06,28.2009 A 16.9646,16.9646 0 0 1 17.0507,23 h 4.13 z m 9.709,9.709 L 35,36.82 v 4.13 A 17.4236,17.4236 0 0 1 29.8,39.9381 Z M 56.5254,20.1494 A 0.9978,0.9978 0 0 0 55.5527,20.1055 L 45,25.3818 V 19 A 3.0033,3.0033 0 0 0 42,16 H 10 a 3.0033,3.0033 0 0 0 -3,3 v 26 a 3.0033,3.0033 0 0 0 3,3 h 32 a 3.0033,3.0033 0 0 0 3,-3 v -6.3818 l 10.5527,5.2763 A 1,1 0 0 0 57,43 V 21 A 1,1 0 0 0 56.5254,20.1494 Z M 43,45 a 1.0009,1.0009 0 0 1 -1,1 H 10 A 1.0013,1.0013 0 0 1 9,45 V 19 a 1.0013,1.0013 0 0 1 1,-1 h 32 a 1.0009,1.0009 0 0 1 1,1 z m 12,-3.6182 -10,-5 v -8.7636 l 10,-5 z"
id="path4"
inkscape:connector-curvature="0" />
d="m 36.1963,35.02 -5,-1 a 0.9967,0.9967 0 0 0 -1.1025,0.5576 l -2.1484,4.6061 a 19.09,19.09 0 0 1 -9.1286,-9.1286 l 4.6061,-2.1483 a 1.0008,1.0008 0 0 0 0.5576,-1.1026 l -1,-5 A 1,1 0 0 0 22,21 h -6 a 1,1 0 0 0 -1,1 21.0508,21.0508 0 0 0 21,21 1,1 0 0 0 1,-1 V 36 A 1,1 0 0 0 36.1963,35.02 Z M 21.8652,26.4258 18.06,28.2009 A 16.9646,16.9646 0 0 1 17.0507,23 h 4.13 z m 9.709,9.709 L 35,36.82 v 4.13 A 17.4236,17.4236 0 0 1 29.8,39.9381 Z M 56.5254,20.1494 A 0.9978,0.9978 0 0 0 55.5527,20.1055 L 45,25.3818 V 19 A 3.0033,3.0033 0 0 0 42,16 H 10 a 3.0033,3.0033 0 0 0 -3,3 v 26 a 3.0033,3.0033 0 0 0 3,3 h 32 a 3.0033,3.0033 0 0 0 3,-3 v -6.3818 l 10.5527,5.2763 A 1,1 0 0 0 57,43 V 21 A 1,1 0 0 0 56.5254,20.1494 Z M 43,45 a 1.0009,1.0009 0 0 1 -1,1 H 10 A 1.0013,1.0013 0 0 1 9,45 V 19 a 1.0013,1.0013 0 0 1 1,-1 h 32 a 1.0009,1.0009 0 0 1 1,1 z m 12,-3.6182 -10,-5 v -8.7636 l 10,-5 z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,82 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
id="svg3440"
sodipodi:version="0.32"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="Deluge-Logo.svg"
inkscape:export-filename="deluge.png"
inkscape:export-xdpi="480"
inkscape:export-ydpi="480"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
sodipodi:modified="TRUE"
version="1.1">
<defs
id="defs3">
viewBox="0 0 512 512">
<defs>
<linearGradient
inkscape:collect="always"
id="linearGradient2973">
id="autoidmagic-linearGradient2973">
<stop
style="stop-color:#eeeeec;stop-opacity:1;"
offset="0"
id="stop2975" />
offset="0" />
<stop
style="stop-color:#eeeeec;stop-opacity:0;"
offset="1"
id="stop2977" />
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient4126">
id="autoidmagic-linearGradient4126">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop4128" />
offset="0.0000000" />
<stop
style="stop-color:#ffffff;stop-opacity:0.16494845;"
offset="1.0000000"
id="stop4130" />
offset="1.0000000" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4114">
id="autoidmagic-linearGradient4114">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop4116" />
offset="0" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop4118" />
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3962">
id="autoidmagic-linearGradient3962">
<stop
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop3964" />
offset="0.0000000" />
<stop
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
offset="0.15517241"
id="stop4134" />
offset="0.15517241" />
<stop
style="stop-color:#4074ae;stop-opacity:1.0000000;"
offset="0.75000000"
id="stop4346" />
offset="0.75000000" />
<stop
style="stop-color:#36486c;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop3966" />
offset="1.0000000" />
</linearGradient>
<radialGradient
r="13.994944"
@ -86,9 +55,8 @@
cx="-10.089286"
gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
gradientUnits="userSpaceOnUse"
id="radialGradient4019"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
id="autoidmagic-radialGradient4019"
xlink:href="#autoidmagic-linearGradient3993" />
<radialGradient
r="14.057444"
fy="31.329016"
@ -97,9 +65,8 @@
cx="-10.323107"
gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
gradientUnits="userSpaceOnUse"
id="radialGradient4004"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
id="autoidmagic-radialGradient4004"
xlink:href="#autoidmagic-linearGradient3993" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
@ -108,9 +75,8 @@
fx="-10.323107"
cy="31.329016"
cx="-10.323107"
id="radialGradient3999"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
id="autoidmagic-radialGradient3999"
xlink:href="#autoidmagic-linearGradient3993" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
@ -119,35 +85,29 @@
fx="61.662098"
cy="24.241488"
cx="61.662098"
id="radialGradient3943"
xlink:href="#linearGradient1312"
inkscape:collect="always" />
id="autoidmagic-radialGradient3943"
xlink:href="#autoidmagic-linearGradient1312" />
<linearGradient
id="linearGradient1312">
id="autoidmagic-linearGradient1312">
<stop
id="stop1314"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop1316"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient3993">
id="autoidmagic-linearGradient3993">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3995" />
offset="0" />
<stop
style="stop-color:#000000;stop-opacity:0"
offset="1"
id="stop3997" />
offset="1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient3866"
xlink:href="#autoidmagic-linearGradient2973"
id="autoidmagic-radialGradient3866"
cx="-22.375"
cy="18.499998"
fx="-22.375"
@ -163,55 +123,44 @@
cy="63.965389"
cx="15.115514"
gradientTransform="scale(1.64399,0.608276)"
id="radialGradient5000"
xlink:href="#linearGradient4114"
inkscape:collect="always" />
id="autoidmagic-radialGradient5000"
xlink:href="#autoidmagic-linearGradient4114" />
<linearGradient
id="linearGradient4989">
id="autoidmagic-linearGradient4989">
<stop
id="stop4991"
offset="0.0000000"
style="stop-color:#d3e9ff;stop-opacity:1.0000000;" />
<stop
id="stop4993"
offset="0.15517241"
style="stop-color:#d3e9ff;stop-opacity:1.0000000;" />
<stop
id="stop4995"
offset="0.75000000"
style="stop-color:#4074ae;stop-opacity:1.0000000;" />
<stop
id="stop4997"
offset="1.0000000"
style="stop-color:#36486c;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient4977">
id="autoidmagic-linearGradient4977">
<stop
id="stop4979"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop4981"
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.16494845;" />
</linearGradient>
<linearGradient
id="linearGradient4825"
inkscape:collect="always">
id="autoidmagic-linearGradient4825">
<stop
id="stop4827"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop4829"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4114"
id="radialGradient6090"
xlink:href="#autoidmagic-linearGradient4114"
id="autoidmagic-radialGradient6090"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(1.64399,0.608276)"
cx="15.115514"
@ -220,9 +169,8 @@
fy="63.965389"
r="12.289036" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4825"
id="radialGradient6098"
xlink:href="#autoidmagic-linearGradient4825"
id="autoidmagic-radialGradient6098"
gradientUnits="userSpaceOnUse"
cx="12.071323"
cy="12.493138"
@ -230,9 +178,8 @@
fy="12.493138"
r="6.7175145" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient6103"
xlink:href="#autoidmagic-linearGradient2973"
id="autoidmagic-radialGradient6103"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.25463,-0.898371,0.979785,0.277703,-18.00903,32.03312)"
cx="17.903898"
@ -241,9 +188,8 @@
fy="40.159222"
r="14.33681" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient6106"
xlink:href="#autoidmagic-linearGradient2973"
id="autoidmagic-radialGradient6106"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.583269,-0.431533,0.577146,0.78008,-5.80022,4.004109)"
cx="12.525543"
@ -252,9 +198,8 @@
fy="38.09042"
r="14.33681" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1312"
id="radialGradient6109"
xlink:href="#autoidmagic-linearGradient1312"
id="autoidmagic-radialGradient6109"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.768231,1.13675,-0.820972,0.554824,-3.72248,-85.07126)"
cx="65.800331"
@ -263,9 +208,8 @@
fy="27.16758"
r="12.972491" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4989"
id="radialGradient6115"
xlink:href="#autoidmagic-linearGradient4989"
id="autoidmagic-radialGradient6115"
cx="16.651781"
cy="32.187485"
fx="16.651781"
@ -274,136 +218,40 @@
gradientTransform="matrix(1.486175,-1.536108,0.932321,0.902016,-38.10476,31.42646)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.17254902"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1.4142136"
inkscape:cx="302.26512"
inkscape:cy="189.18337"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="2004"
inkscape:window-height="1280"
inkscape:window-x="909"
inkscape:window-y="619"
inkscape:showpageshadow="false"
inkscape:window-maximized="0" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Internet Category</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:contributor>
<cc:Agent>
<dc:title>Tuomas Kuosmanen</dc:title>
</cc:Agent>
</dc:contributor>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
<dc:source>http://jimmac.musichall.cz</dc:source>
<dc:subject>
<rdf:Bag>
<rdf:li>internet</rdf:li>
<rdf:li>tools</rdf:li>
<rdf:li>applications</rdf:li>
<rdf:li>category</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,464)">
<g
id="g874"
transform="matrix(10.934561,0,0,10.934561,-15.037742,-474.45489)">
<ellipse
ry="7.4751287"
rx="20.203051"
cy="38.908627"
cx="24.849752"
inkscape:export-ydpi="480"
inkscape:export-xdpi="480"
transform="matrix(0.947409,0,0,1.17786,1.244375,-6.853427)"
id="path4112"
style="fill:url(#radialGradient6090);fill-opacity:1;stroke:none;stroke-opacity:1" />
style="fill:url(#autoidmagic-radialGradient6090);fill-opacity:1;stroke:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
id="path2069"
d="M 23.942923,0.9561338 37.330543,18.266721 C 46.998995,29.84687 41.49692,43.923891 26.7742,45.000491 6.0597413,45.582655 6.5086231,27.37483 11.255313,18.609381 Z"
style="fill:url(#radialGradient6115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
style="fill:url(#autoidmagic-radialGradient6115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscscc"
id="path2969"
d="M 35.111358,26.143133 C 28.972772,13.030586 17.560684,17.697957 17.274449,26.949974 16.894738,39.223415 34.748874,37.615429 36.715244,41.468778 28.821643,47.675479 14.973233,45.226508 10.962289,39.715204 6.9574776,34.212326 7.2383598,25.630263 10.784249,19.587632 24.158625,0.978654 39.749127,24.383766 35.111358,26.143133 Z"
style="fill:#1b4075;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
id="path2071"
d="m 23.996861,3.5433428 12.06049,15.6077022 c 8.71239,10.431485 3.361995,23.263047 -9.93217,24.357476 C 7.3917365,44.015286 7.4275065,28.119221 12.17284,20.333442 Z"
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.1000706;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.36612022" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc"
id="path3945"
d="M 23.940758,0.96491709 34.727367,14.909752 c 7.919841,9.482559 5.719937,5.374223 -6.364886,6.369094 C 25.083165,11.203805 18.13871,11.859899 13.523802,15.675236 Z"
style="opacity:0.46000001;fill:url(#radialGradient6109);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
style="opacity:0.46000001;fill:url(#autoidmagic-radialGradient6109);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscscc"
id="path3868"
d="M 35.159701,26.173667 C 29.021115,13.06112 18.734027,17.978491 18.447792,27.230508 18.068081,39.503949 34.797217,37.645963 36.763587,41.499312 28.869986,47.706013 15.021576,45.257042 11.010632,39.745738 7.0058197,34.24286 7.2867027,25.660797 10.832592,19.618166 24.206968,1.0091879 39.79747,24.4143 35.159701,26.173667 Z"
style="fill:url(#radialGradient6106);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
style="fill:url(#autoidmagic-radialGradient6106);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscscc"
id="path4874"
d="M 35.120795,26.14195 C 28.553327,12.814962 15.685968,17.224233 15.399733,26.47625 15.020022,38.749691 32.874158,37.141705 34.840528,40.995054 26.946927,47.201755 13.098517,44.752784 9.0875727,39.24148 5.0827617,33.738602 5.3636437,25.156539 8.9095327,19.113908 22.315509,0.47615954 40.03233,23.660113 35.120795,26.14195 Z"
style="fill:url(#radialGradient6103);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
style="fill:url(#autoidmagic-radialGradient6103);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<circle
r="6.7175145"
cy="12.493138"
cx="12.071323"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.21999996;fill:url(#radialGradient6098);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
id="path4941"
inkscape:r_cx="true"
inkscape:r_cy="true"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.21999996;fill:url(#autoidmagic-radialGradient6098);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
transform="matrix(-0.829136,1.052307,1.239307,0.0758326,26.32898,25.58605)" />
</g>
</g>

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

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

View File

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

View File

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

View File

@ -1,52 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg4670"
width="512"
height="512"
viewBox="0 0 512 512"
sodipodi:docname="ejabberd.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata4676">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs4674">
viewBox="0 0 512 512">
<defs>
<linearGradient
inkscape:collect="always"
id="1">
id="autoidmagic-1">
<stop
style="stop-color:#3fb2f3;stop-opacity:1"
offset="0"
id="stop5283" />
offset="0" />
<stop
style="stop-color:#49c8c6;stop-opacity:1"
offset="1"
id="stop5285" />
offset="1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#1"
id="linearGradient5291"
xlink:href="#autoidmagic-1"
id="autoidmagic-linearGradient5291"
gradientUnits="userSpaceOnUse"
x1="506.164"
y1="897.51288"
@ -54,30 +24,7 @@
y2="128.18068"
gradientTransform="matrix(0.66697552,0,0,0.66697552,-85.307583,-85.482171)" />
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2406"
inkscape:window-height="1596"
id="namedview4672"
showgrid="false"
inkscape:zoom="0.4609375"
inkscape:cx="679.76068"
inkscape:cy="684.56784"
inkscape:window-x="360"
inkscape:window-y="176"
inkscape:window-maximized="0"
inkscape:current-layer="svg4670" />
<path
inkscape:connector-curvature="0"
id="path55690"
d="m 22.71497,365.69226 c 0,-96.78776 -0.40234,-141.38713 1.20287,-156.02866 6.44884,-58.82121 33.72282,-112.060031 77.15278,-150.593881 15.86816,-14.07925 29.94351,-24.1697 48.85857,-33.81826 24.2013,-12.34507 45.75644,-18.7887797 75.51234,-23.3636597 13.30553,-2.04567999 45.02409,-2.89686 61.2289,-0.1279 28.13604,4.80767 51.05526,11.0185897 75.25656,23.3636597 13.71286,6.99492 22.05918,12.44601 33.56017,21.05403 53.34559,39.92696 86.57853,98.036001 93.21856,164.381301 1.01407,10.13231 0.84226,35.9671 -0.31003,46.82589 -5.57194,52.50759 -28.16943,100.36301 -65.32657,138.34413 -18.74038,19.15597 -37.94156,33.00688 -60.80864,44.56419 -26.40718,13.34652 -47.90913,19.84352 -79.93665,24.2163 -3.91319,0.53428 -33.22101,1.03784 -93.76027,1.34066 -94.78589,0.47414 -90.7228,-0.061 -105.3743,3.67775 -13.03428,3.32612 -26.47548,9.60448 -36.56103,16.8188 -7.03893,5.03503 -15.61484,12.9312 -19.75722,19.02725 C 25.06379,508.03342 23.57162,512 23.08611,512 22.35645,512 22.71497,487.47538 22.71497,365.69226 Z m 241.16185,17.65451 c 31.82882,-2.12959 53.76526,-9.35719 72.30888,-23.25032 5.28214,-3.95745 7.91313,-8.79737 9.16787,-15.98467 1.75999,-10.08148 -1.65009,-19.68856 -9.04886,-27.59787 -6.60742,-7.06336 -14.66683,-10.12814 -24.21989,-9.62673 -4.87238,0.25573 -7.24389,1.15 -12.7562,3.8417 -8.31896,4.06221 -23.36809,8.8061 -30.7782,9.79291 -7.87584,1.04883 -22.38658,0.41053 -29.8358,-1.28946 -8.35089,-1.90576 -13.01891,-3.46467 -22.06018,-7.80658 -16.41488,-7.88297 -26.19927,-16.47647 -38.27486,-32.48721 -5.04709,-6.6918 -11.92086,-16.51795 -11.92086,-18.03369 0,-0.98364 8.99373,-0.17118 107.74764,-0.18178 117.20682,-0.0126 113.30384,0.21449 120.84512,-3.60697 7.54482,-3.82325 14.73542,-13.65006 16.36528,-22.42176 0.84963,-4.5726 0.74455,-15.87294 -0.71526,-25.5975 -6.14544,-40.93802 -33.2388,-82.65846 -70.06043,-107.3262 -34.70077,-23.246921 -73.69502,-31.573231 -111.5199,-23.941861 -29.41553,5.93474 -61.58044,24.527611 -83.72636,47.927721 -21.23185,22.43426 -34.9718,49.54515 -40.87774,80.89661 -1.71868,9.1235 -1.44292,37.07177 0.28921,46.6106 5.71134,31.45233 17.71104,56.86846 39.82451,81.65652 19.51009,21.8698 52.61186,40.85283 80.94991,46.26207 13.1122,2.50289 23.68465,3.14209 38.29612,2.16447 z M 166.01784,196.72721 c 0,-0.74011 1.97739,-3.62392 3.84154,-6.62954 17.15641,-27.66182 43.80669,-46.26482 72.32639,-51.01387 9.59204,-1.59725 20.85634,-1.64826 28.78687,-0.45061 19.7296,2.97955 37.31724,12.15074 53.99369,27.9141 10.7124,10.12586 22.24569,25.4918 23.29409,29.19751 l 0.18087,1.51413 -90.71432,-0.0904 c -91.5303,-0.0912 -91.70913,0.90175 -91.70913,-0.44128 z"
style="display:inline;fill:url(#linearGradient5291);fill-opacity:1;stroke-width:0.6669755"
sodipodi:nodetypes="ssssssssssssssssssssssscssssssscssssssssssscsssscss" />
style="display:inline;fill:url(#autoidmagic-linearGradient5291);fill-opacity:1;stroke-width:0.6669755" />
</svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

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

View File

@ -1,64 +1,34 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="512"
height="512"
version="1.1"
id="svg71"
sodipodi:docname="Internet-mail.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview73"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="0.25455729"
inkscape:cx="-718.89514"
inkscape:cy="-544.08184"
inkscape:window-width="1852"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg71" />
<defs
id="defs43">
viewBox="0 0 512 512">
<defs>
<linearGradient
id="a">
id="autoidmagic-a">
<stop
offset="0"
stop-color="#9aa29a"
id="stop2" />
stop-color="#9aa29a" />
<stop
offset="1"
stop-color="#b5beb5"
id="stop4" />
stop-color="#b5beb5" />
</linearGradient>
<radialGradient
id="b"
id="autoidmagic-b"
cx="6.7030001"
cy="73.615997"
r="7.2280002"
gradientTransform="matrix(3.4251013,0,0,1.0381524,2.0723312,-20.765398)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
id="stop7" />
offset="0" />
<stop
offset="1"
stop-opacity="0"
id="stop9" />
stop-opacity="0" />
</radialGradient>
<linearGradient
id="i"
id="autoidmagic-i"
x1="8.7799997"
x2="9.7620001"
y1="37.785"
@ -67,15 +37,13 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-opacity=".129"
id="stop12" />
stop-opacity=".129" />
<stop
offset="1"
stop-opacity="0"
id="stop14" />
stop-opacity="0" />
</linearGradient>
<linearGradient
id="h"
id="autoidmagic-h"
x1="11.233"
x2="21.112"
y1="13.686"
@ -84,24 +52,22 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#fff"
id="stop17" />
stop-color="#fff" />
<stop
offset="1"
stop-color="#ededed"
id="stop19" />
stop-color="#ededed" />
</linearGradient>
<linearGradient
id="g"
id="autoidmagic-g"
x1="8.9160004"
x2="9.8859997"
y1="37.196999"
y2="52.091"
gradientTransform="matrix(2.4548,0,0,0.762,2.88,0.343)"
gradientUnits="userSpaceOnUse"
xlink:href="#a" />
xlink:href="#autoidmagic-a" />
<linearGradient
id="f"
id="autoidmagic-f"
x1="10.184"
x2="15.311"
y1="15.148"
@ -110,15 +76,13 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#fff"
id="stop23" />
stop-color="#fff" />
<stop
offset="1"
stop-color="#dcdcdc"
id="stop25" />
stop-color="#dcdcdc" />
</linearGradient>
<linearGradient
id="e"
id="autoidmagic-e"
x1="5.8270001"
x2="13.467"
y1="7.2309999"
@ -127,15 +91,13 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#ededed"
id="stop28" />
stop-color="#ededed" />
<stop
offset="1"
stop-color="#c8c8c8"
id="stop30" />
stop-color="#c8c8c8" />
</linearGradient>
<linearGradient
id="c"
id="autoidmagic-c"
x1="11.573"
x2="18.475"
y1="4.7459998"
@ -144,15 +106,13 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#fff"
id="stop33" />
stop-color="#fff" />
<stop
offset="1"
stop-color="#e2e2e2"
id="stop35" />
stop-color="#e2e2e2" />
</linearGradient>
<linearGradient
id="d"
id="autoidmagic-d"
x1="2.062"
x2="30.6"
y1="15.257"
@ -161,17 +121,14 @@
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#989690"
id="stop38" />
stop-color="#989690" />
<stop
offset="1"
stop-color="#656460"
id="stop40" />
stop-color="#656460" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#a"
id="linearGradient90"
xlink:href="#autoidmagic-a"
id="autoidmagic-90"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.4548,0,0,0.762,2.88,0.343)"
x1="8.9160004"
@ -180,80 +137,60 @@
y2="52.091" />
</defs>
<g
id="g197"
transform="matrix(12.823403,0,0,12.823403,-62.27045,-23.451719)">
<path
fill="url(#c)"
fill="url(#autoidmagic-c)"
fill-rule="evenodd"
stroke="url(#d)"
stroke="url(#autoidmagic-d)"
stroke-linejoin="round"
stroke-width="0.857"
d="m 6.333,16.972 v 24.51 H 43.306 L 43.244,17.09 C 43.241,15.712 31.396,2.412 29.211,2.412 H 20.66 c -2.297,0 -14.326,13.262 -14.326,14.56 z"
id="path47"
style="fill:url(#c);stroke:url(#d)" />
d="m 6.333,16.972 v 24.51 H 43.306 L 43.244,17.09 C 43.241,15.712 31.396,2.412 29.211,2.412 H 20.66 c -2.297,0 -14.326,13.262 -14.326,14.56 z" />
<path
fill="url(#e)"
fill="url(#autoidmagic-e)"
fill-rule="evenodd"
d="M 6.923,16.787 C 6.525,16.357 18.81,3.093 20.667,3.093 h 8.376 c 1.747,0 14.037,13.128 13.427,13.886 L 31.61,30.474 19.295,30.156 6.923,16.786 Z"
id="path49"
style="fill:url(#e)" />
d="M 6.923,16.787 C 6.525,16.357 18.81,3.093 20.667,3.093 h 8.376 c 1.747,0 14.037,13.128 13.427,13.886 L 31.61,30.474 19.295,30.156 6.923,16.786 Z" />
<path
fill-opacity="0.146"
fill-rule="evenodd"
d="m 19.078,30.018 -7.333,-8.746 24.818,-6.936 3.029,6.216 -7.416,9.44"
id="path51" />
d="m 19.078,30.018 -7.333,-8.746 24.818,-6.936 3.029,6.216 -7.416,9.44" />
<path
fill-opacity="0.146"
fill-rule="evenodd"
d="m 18.292,29.836 -7.483,-8.81 24.648,-6.893 3.174,6.271 -7.241,9.407"
id="path53" />
d="m 18.292,29.836 -7.483,-8.81 24.648,-6.893 3.174,6.271 -7.241,9.407" />
<path
fill-opacity="0.146"
fill-rule="evenodd"
d="m 18.775,29.957 -7.675,-8.66 24.968,-7.065 3.286,6.593 -7.48,9.107"
id="path55" />
d="m 18.775,29.957 -7.675,-8.66 24.968,-7.065 3.286,6.593 -7.48,9.107" />
<path
fill="url(#f)"
fill="url(#autoidmagic-f)"
fill-rule="evenodd"
d="m 18.594,30.441 -7.333,-8.746 24.712,-6.894 3.11,6.388 -7.12,8.986"
id="path57"
style="fill:url(#f)" />
d="m 18.594,30.441 -7.333,-8.746 24.712,-6.894 3.11,6.388 -7.12,8.986" />
<path
fill="url(#g)"
fill="url(#autoidmagic-90)"
fill-rule="evenodd"
d="M 20.488,29.064 7.092,40.036 21.001,30.432 h 9.018 l 12.42,9.482 -11.864,-10.85 z"
id="path59"
style="fill:url(#linearGradient90)" />
d="M 20.488,29.064 7.092,40.036 21.001,30.432 h 9.018 l 12.42,9.482 -11.864,-10.85 z" />
<path
fill="url(#g)"
fill="url(#autoidmagic-g)"
fill-rule="evenodd"
d="M 6.963,16.885 18.48,31.201 19.548,30.347 6.964,16.885 Z"
color="#000000"
id="path61"
style="fill:url(#g)" />
color="#000000" />
<path
fill="none"
stroke="url(#h)"
stroke="url(#autoidmagic-h)"
stroke-width="0.857"
d="m 7.308,17.131 0.03,23.211 H 42.284 L 42.221,17.258 C 42.219,16.508 31.005,3.459 28.837,3.459 h -7.895 c -2.253,0 -13.635,12.892 -13.634,13.672 z"
id="path63"
style="stroke:url(#h)" />
d="m 7.308,17.131 0.03,23.211 H 42.284 L 42.221,17.258 C 42.219,16.508 31.005,3.459 28.837,3.459 h -7.895 c -2.253,0 -13.635,12.892 -13.634,13.672 z" />
<path
fill="#ffffff"
fill-rule="evenodd"
d="m 20.957,30.453 -11.941,8.271 2.219,0.006 9.998,-6.869 8.822,-1.423 z m -9.529,-8.783 1.324,1.411 22.791,-6.884 2.915,5.682 0.614,-0.712 -3.069,-6.378 z"
id="path65" />
d="m 20.957,30.453 -11.941,8.271 2.219,0.006 9.998,-6.869 8.822,-1.423 z m -9.529,-8.783 1.324,1.411 22.791,-6.884 2.915,5.682 0.614,-0.712 -3.069,-6.378 z" />
<path
fill="url(#i)"
fill="url(#autoidmagic-i)"
fill-rule="evenodd"
d="m 13.308,23.636 6.026,6.454 1.197,-1.026 10.087,0.043 0.812,0.727 3.975,-4.744 C 34.251,23.679 13.308,23.636 13.308,23.636 Z"
id="path67"
style="fill:url(#i)" />
d="m 13.308,23.636 6.026,6.454 1.197,-1.026 10.087,0.043 0.812,0.727 3.975,-4.744 C 34.251,23.679 13.308,23.636 13.308,23.636 Z" />
<path
fill="#b1b1b1"
fill-rule="evenodd"
d="M 41.813,17.848 31.861,30.479 30.793,29.624 Z"
color="#000000"
id="path69" />
color="#000000" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

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

View File

@ -1,159 +1,46 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg2"
sodipodi:docname="featherwiki.svg"
viewBox="0 0 511.99998 511.99999"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
viewBox="0 0 512 512"
width="512"
height="512"
inkscape:export-filename="featherwiki.png"
inkscape:export-xdpi="48"
inkscape:export-ydpi="48"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs11" />
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="23"
pagecolor="#ffffff"
inkscape:window-height="1429"
inkscape:window-maximized="0"
inkscape:zoom="1.4283557"
inkscape:window-x="26"
showgrid="false"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="175.37648"
inkscape:cy="344.45202"
inkscape:window-width="1789"
inkscape:pageopacity="0.0"
inkscape:document-units="px"
inkscape:document-rotation="0"
inkscape:snap-global="false"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<g
id="layer1"
inkscape:label="Vrstva 1"
inkscape:groupmode="layer">
height="512">
<g>
<g
id="g907"
transform="matrix(0.51715286,0,0,0.51715286,-2.4633634,-2.5670809)">
<g
id="g850"
transform="matrix(-2.53053,-0.03341354,-0.03341354,-2.53053,1038.0811,2209.6311)">
<path
id="path844"
sodipodi:nodetypes="cccccccsccccccccccsscscsscscaaacsscccccccccccccccccccccc"
style="color:#000000;opacity:1;fill:#19457c;fill-opacity:1;fill-rule:evenodd"
inkscape:connector-curvature="0"
d="m 205.22,478.53 c -23.15688,16.34454 -41.83323,53.12276 -43.6252,79.5 l 18.34,27.97 -18.6,-19.53 c -0.0333,8.4167 0.51776,17.394 1.125,27.094 l 12,14.844 -11.531,-6.375 c 0.34608,5.9871 0.66846,12.155 0.8125,18.688 0.53129,24.095 3.2621,61.668 7.8125,98.219 l 15.16,31.78 -14.03,-23.22 c 1.2784,9.6063 2.6675,19.06 4.1875,28.094 l 14.156,17 -13.5,-13.312 c 1.3937,8.0034 2.8954,15.596 4.4688,22.656 l 14,9.1562 -18.741,-5.1097 c 2.2337,8.2287 16.005,10.247 20.225,13.24 0,0 -18.352,-1.4767 -16.481,0.0653 5.136,4.2312 12.223,5.0179 14.951,6.2104 5.2176,2.2806 3.3255,2.0318 3.3255,2.0318 -1.7183,-0.31873 -8.3403,4.3107 -12.856,4.275 -3.2433,-0.0256 2.6433,0.16019 6.3662,-0.25953 14.31,-4.1628 7.819,-1.0595 8.9684,-1.9324 1.8048,-1.3706 -10.876,5.7242 -13.106,5.8769 -3.1577,0.21605 3.0489,1.4336 5.3547,0.35605 6.3347,-3.0329 12.819,-5.5291 19.655,-1.5848 4.907,2.8316 9.6512,-0.21607 7.8019,-1.3297 -1.7484,-1.8359 0.41271,0.30444 0.2971,0.43753 -1.4859,1.7106 -6.0522,-0.7293 -6.1023,-2.9946 -0.0714,-3.2319 9.9407,-1.7546 8.5089,-4.6529 -0.29476,-0.59665 4.1858,1.4365 -1.8251,0.80916 -2.1331,-0.31119 -2.9558,-0.90497 -4.4048,1.2467 0,0 1.8069,-3.3305 0.92239,-3.0232 -11.553,4.0142 6.8807,-4.0658 9.8015,-11.357 l -13.494,2.5441 10.051,-11.724 c 0.76355,-2.9062 1.512,-5.9353 2.25,-9.0312 l -13.54,7.78 14.06,-10.06 c 0.92178,-3.9543 1.8354,-8.0372 2.7188,-12.25 l -18.188,12.875 18.906,-16.406 c 1.3869,-6.8048 2.7087,-13.9 3.9688,-21.125 l -19.875,22 20.96,-28.38 c 7.2214,-43.29 11.924,-90.896 11.906,-120.09 l -13,8.4375 c 12.83559,-7.69668 13.00208,-13.67041 12.59405,-26.343 l -13.281,12.094 13.188,-15.031 c -0.5639,-15.697 -1.5394,-30.203 -3.5,-42.625 l -18.11,15.38 14.19,-32.69 c -6.41339,-14.04841 -22.03415,-48.83827 -35.28095,-50.219 z" />
<path
id="path846"
style="fill:#f0e2e2;fill-rule:evenodd;stroke:#000000;stroke-width:0.30448;stroke-linecap:round"
inkscape:connector-curvature="0"
d="m 205.03,478.51 c 0.98759,-6.7e-4 1.7961,80.659 1.8047,180.04 0.009,99.385 -0.7859,180.05 -1.7735,180.05 -0.98759,6.7e-4 -1.7961,-80.659 -1.8047,-180.04 -0.009,-99.385 0.78591,-180.05 1.7735,-180.05 z" />
<path
id="path848"
sodipodi:nodetypes="cccc"
style="fill:#000000;fill-rule:evenodd"
inkscape:connector-curvature="0"
d="m 202.28,842.66 c 2.174,-4.381 4.3103,-2.3783 5.4014,0.47766 l -2.514,-28.929 z" />
</g>
<g
id="g842"
transform="matrix(-2.7355499,-0.95049478,-1.0223921,2.7094995,1991.4013,-1095.9208)">
<path
id="path836"
sodipodi:nodetypes="cccccccccccccccccscccccscacssccccccccccccccccccccccc"
style="color:#000000;opacity:1;fill:#1f5598;fill-rule:evenodd"
inkscape:connector-curvature="0"
d="m 205.22,478.53 c -23.15688,16.34454 -41.83323,53.12276 -43.6252,79.5 l 18.34,27.97 -18.6,-19.53 c -0.0333,8.4167 0.51776,17.394 1.125,27.094 l 12,14.844 -11.531,-6.375 c 1.61117,39.57325 4.38737,82.31761 8.625,116.907 l 15.16,31.78 -14.03,-23.22 c 1.2784,9.6063 2.6675,19.06 4.1875,28.094 l 14.156,17 -13.5,-13.312 c 1.3937,8.0034 2.8954,15.596 4.4688,22.656 l 14,9.1562 -18.741,-5.1097 c 2.2337,8.2287 16.005,10.247 20.225,13.24 0,0 -18.352,-1.4767 -16.481,0.0653 5.136,4.2312 12.223,5.0179 14.951,6.2104 0.58151,3.17031 -8.46009,4.5849 -9.5305,6.3068 -3.2433,-0.0256 2.6433,0.16019 6.3662,-0.25953 0,0 4.65117,2.59746 -4.1376,3.9445 -3.1577,0.21605 3.0489,1.4336 5.3547,0.35605 6.3347,-3.0329 12.819,-5.5291 19.655,-1.5848 4.907,2.8316 9.6512,-0.21607 7.8019,-1.3297 -1.7484,-1.8359 0.41271,0.30444 0.2971,0.43753 -1.4859,1.7106 -6.0522,-0.7293 -6.1023,-2.9946 0,0 1.71899,-1.59312 2.279,-2.59704 0.51529,-0.92375 1.8069,-3.3305 0.92239,-3.0232 -11.553,4.0142 6.8807,-4.0658 9.8015,-11.357 l -13.494,2.5441 10.051,-11.724 c 0.76355,-2.9062 1.512,-5.9353 2.25,-9.0312 l -13.54,7.78 14.06,-10.06 c 0.92178,-3.9543 1.8354,-8.0372 2.7188,-12.25 l -18.188,12.875 18.906,-16.406 c 1.3869,-6.8048 2.7087,-13.9 3.9688,-21.125 l -19.875,22 20.96,-28.38 c 7.2214,-43.29 11.924,-90.896 11.906,-120.09 l -13,8.4375 12.969,-10.656 c -0.0506,-5.26738 -0.22316,-10.99106 -0.37495,-15.687 l -13.281,12.094 13.188,-15.031 c -0.5639,-15.697 -1.5394,-30.203 -3.5,-42.625 l -18.11,15.38 14.19,-32.69 c -6.41339,-14.04841 -22.03415,-48.83827 -35.28095,-50.219 z" />
<path
id="path838"
style="fill:#f0e2e2;fill-rule:evenodd;stroke:#000000;stroke-width:0.30448;stroke-linecap:round"
inkscape:connector-curvature="0"
d="m 205.03,478.51 c 0.98759,-6.7e-4 1.7961,80.659 1.8047,180.04 0.009,99.385 -0.7859,180.05 -1.7735,180.05 -0.98759,6.7e-4 -1.7961,-80.659 -1.8047,-180.04 -0.009,-99.385 0.78591,-180.05 1.7735,-180.05 z" />
<path
id="path840"
sodipodi:nodetypes="cccc"
style="fill:#000000;fill-rule:evenodd"
inkscape:connector-curvature="0"
d="m 202.28,842.66 c 2.174,-4.381 4.3103,-2.3783 5.4014,0.47766 l -2.514,-28.929 z" />
</g>
<g
id="g858"
transform="matrix(2.7355499,-0.95049478,1.0223921,2.7094995,-991.40128,-1095.9208)">
<path
id="path852"
sodipodi:nodetypes="ssccccccccccccccccsscscssccssccccccccccccccccccccccs"
style="color:#000000;opacity:1;fill:#1f5598;fill-opacity:0.993151;fill-rule:evenodd"
inkscape:connector-curvature="0"
d="m 205.22,478.53 c -9.3228,0.20557 -32.409,40.138 -38.719,55.875 -2.9559,7.373 -4.3693,15.194 -4.9062,23.625 l 18.34,27.97 -18.6,-19.53 c -0.0333,8.4167 0.51776,17.394 1.125,27.094 l 12,14.844 -11.531,-6.375 c 1.61117,39.57325 4.38737,82.31761 8.625,116.907 l 15.16,31.78 -14.03,-23.22 c 1.2784,9.6063 2.6675,19.06 4.1875,28.094 l 14.156,17 -13.5,-13.312 c 1.3937,8.0034 2.8954,15.596 4.4688,22.656 l 14,9.1562 -18.741,-5.1097 c 2.2337,8.2287 16.005,10.247 20.225,13.24 0,0 -18.352,-1.4767 -16.481,0.0653 5.136,4.2312 12.223,5.0179 14.951,6.2104 5.2176,2.2806 3.3255,2.0318 3.3255,2.0318 -1.7183,-0.31873 -8.3403,4.3107 -12.856,4.275 -3.2433,-0.0256 2.6433,0.16019 6.3662,-0.25953 14.31,-4.1628 7.819,-1.0595 8.9684,-1.9324 1.8048,-1.3706 -10.876,5.7242 -13.106,5.8769 -3.1577,0.21605 3.0489,1.4336 5.3547,0.35605 6.3347,-3.0329 12.819,-5.5291 19.655,-1.5848 0.96206,-2.55384 0.78043,-5.49588 4.2757,-6.48381 2.47806,-0.70042 4.60156,-3.1899 3.71705,-2.8826 -11.553,4.0142 4.08604,-4.2064 7.00684,-11.4976 l -13.494,2.5441 10.051,-11.724 c 0.76355,-2.9062 1.512,-5.9353 2.25,-9.0312 l -13.54,7.78 14.06,-10.06 c 0.92178,-3.9543 1.8354,-8.0372 2.7188,-12.25 l -18.188,12.875 18.906,-16.406 c 1.3869,-6.8048 2.7087,-13.9 3.9688,-21.125 l -19.875,22 20.96,-28.38 c 7.2214,-43.29 11.924,-90.896 11.906,-120.09 l -13,8.4375 12.969,-10.656 c -0.0506,-5.26738 -0.22316,-10.99106 -0.37495,-15.687 l -13.281,12.094 13.188,-15.031 c -0.5639,-15.697 -1.5394,-30.203 -3.5,-42.625 l -18.11,15.38 14.19,-32.69 c -6.41339,-14.04841 -22.03415,-48.83827 -35.28095,-50.219 z" />
<path
id="path854"
style="fill:#f0e2e2;fill-rule:evenodd;stroke:#000000;stroke-width:0.30448;stroke-linecap:round"
inkscape:connector-curvature="0"
d="m 205.03,478.51 c 0.98759,-6.7e-4 1.7961,80.659 1.8047,180.04 0.009,99.385 -0.7859,180.05 -1.7735,180.05 -0.98759,6.7e-4 -1.7961,-80.659 -1.8047,-180.04 -0.009,-99.385 0.78591,-180.05 1.7735,-180.05 z" />
<path
id="path856"
sodipodi:nodetypes="cccc"
style="fill:#000000;fill-rule:evenodd"
inkscape:connector-curvature="0"
d="m 202.28,842.66 c 2.174,-4.381 4.3103,-2.3783 5.4014,0.47766 l -2.514,-28.929 z" />
</g>
</g>
</g>
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:publisher>
<cc:Agent
rdf:about="http://openclipart.org/">
<dc:title>Openclipart</dc:title>
</cc:Agent>
</dc:publisher>
<dc:date>2012-09-02T06:27:26</dc:date>
<dc:description>a blue feather</dc:description>
<dc:source>https://openclipart.org/detail/172047/feather-by-t-i-n-a-172047</dc:source>
<dc:creator>
<cc:Agent>
<dc:title>T-i-n-a</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>bird</rdf:li>
<rdf:li>blue</rdf:li>
<rdf:li>feather</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -5,6 +5,7 @@
{% load bootstrap %}
{% load i18n %}
{% load extras %}
{% block configuration %}
{{ block.super }}
@ -14,12 +15,12 @@
<div class="btn-toolbar">
<a href="{% url 'featherwiki:create' %}" class="btn btn-default"
role="button" title="{% trans 'Create Wiki' %}">
<span class="fa fa-plus" aria-hidden="true"></span>
{% icon 'plus' %}
{% trans 'Create Wiki' %}
</a>
<a href="{% url 'featherwiki:upload' %}" class="btn btn-default"
role="button" title="{% trans 'Upload Wiki' %}">
<span class="fa fa-upload" aria-hidden="true"></span>
{% icon 'upload' %}
{% trans 'Upload Wiki' %}
</a>
</div>
@ -41,14 +42,14 @@
class="wiki-edit btn btn-default btn-sm secondary"
role="button"
title="{% blocktrans %}Rename wiki {{ wiki }}{% endblocktrans %}">
<span class="fa fa-pencil-square-o" aria-hidden="true"></span>
{% icon 'pencil-square-o' %}
</a>
<a href="{% url 'featherwiki:delete' wiki %}"
class="wiki-delete btn btn-default btn-sm secondary"
role="button"
title="{% blocktrans %}Delete wiki {{ wiki }}{% endblocktrans %}">
<span class="fa fa-trash-o" aria-hidden="true"></span>
{% icon 'trash-o' %}
</a>
</div>
{% endfor %}

View File

@ -8,7 +8,7 @@
{% block page_head %}
<link type="text/css" rel="stylesheet"
href="{% static 'firewall/firewall.css' %}"/>
href="{% static 'firewall/firewall.css' %}">
{% endblock %}
{% block configuration %}

View File

@ -5,6 +5,7 @@
{% load bootstrap %}
{% load i18n %}
{% load extras %}
{% block breadcrumbs %}
{% endblock %}
@ -15,7 +16,7 @@
<ol class='next-steps'>
<li>
<div class="app-icon fa fa-refresh"></div>
{% icon 'refresh' class='svg-icon app-icon' %}
<div class="step-text">
{% url 'upgrades:index' as upgrades_url %}
{% blocktrans trimmed %}
@ -33,7 +34,7 @@
</li>
<li>
<div class="app-icon fa fa-eye-slash"></div>
{% icon 'eye-slash' class='svg-icon app-icon' %}
<div class="step-text">
{% url 'privacy:index' as privacy_url %}
{% blocktrans trimmed %}
@ -43,7 +44,7 @@
</li>
<li>
<div class="app-icon fa fa-signal"></div>
{% icon 'signal' class='svg-icon app-icon' %}
<div class="step-text">
{% url 'networks:index' as networks_url %}
{% blocktrans trimmed %}
@ -54,7 +55,7 @@
</li>
<li>
<div class="app-icon fa fa-tags"></div>
{% icon 'tags' class='svg-icon app-icon' %}
<div class="step-text">
{% url 'names:index' as names_url %}
{% blocktrans trimmed %}
@ -64,7 +65,7 @@
</li>
<li>
<div class="app-icon fa fa-files-o"></div>
{% icon 'files-o' class='svg-icon app-icon' %}
<div class="step-text">
{% url 'backups:index' as backups_url %}
{% blocktrans trimmed %}
@ -75,7 +76,7 @@
</li>
<li>
<div class="app-icon fa fa-th"></div>
{% icon 'th' class='svg-icon app-icon' %}
<div class="step-text">
{% url 'apps' as apps_url %}
{% blocktrans trimmed %}

View File

@ -14,7 +14,7 @@ no-brand
{% block content %}
<div class="logo">
<img class="firstboot img-fluid" alt="{{ box_name }}"
src="{% static 'theme/img/freedombox-logo-standard.svg' %}"/>
src="{% static 'theme/img/freedombox-logo-standard.svg' %}">
</div>
<form class="form form-start text-center" method="post">

View File

@ -1,73 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
width="512"
height="512"
viewBox="0 0 512 512"
sodipodi:docname="gitweb.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<sodipodi:namedview
pagecolor="#575757"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1020"
id="namedview4"
showgrid="true"
inkscape:zoom="2"
inkscape:cx="195.3288"
inkscape:cy="254.07096"
inkscape:window-x="0"
inkscape:window-y="31"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
showguides="true">
<inkscape:grid
type="xygrid"
id="grid7767" />
</sodipodi:namedview>
viewBox="0 0 512 512" >
<g
id="g7765"
transform="matrix(1.7663401,0,0,1.7663401,-4.5673475,9.5668645)">
<path
sodipodi:nodetypes="cccccccccccccccccccscscccsc"
style="display:inline;fill:#bf0303;stroke-width:0.31999999"
d="M 11.7124,83.16759 V 70.847587 h 36.96 36.96 v 12.320003 12.32 h -36.96 -36.96 z m 98.88,0 V 70.847587 h 36.95999 36.96 v 12.320003 12.32 h -36.96 -36.95999 z m 98.75423,11.81382 c -0.10683,-0.27839 -0.19424,-5.59461 -0.19424,-11.81382 0,-6.219213 0.0874,-11.535437 0.19424,-11.81383 0.17556,-0.457517 3.74373,-0.506173 37.12,-0.506173 h 36.92576 v 12.320003 12.32 h -36.92576 c -33.37627,0 -36.94444,-0.0487 -37.12,-0.50618 z"
id="path7107"
inkscape:connector-curvature="0" />
d="M 11.7124,83.16759 V 70.847587 h 36.96 36.96 v 12.320003 12.32 h -36.96 -36.96 z m 98.88,0 V 70.847587 h 36.95999 36.96 v 12.320003 12.32 h -36.96 -36.95999 z m 98.75423,11.81382 c -0.10683,-0.27839 -0.19424,-5.59461 -0.19424,-11.81382 0,-6.219213 0.0874,-11.535437 0.19424,-11.81383 0.17556,-0.457517 3.74373,-0.506173 37.12,-0.506173 h 36.92576 v 12.320003 12.32 h -36.92576 c -33.37627,0 -36.94444,-0.0487 -37.12,-0.50618 z" />
<path
style="display:inline;fill:#007f00;stroke-width:0.31999999"
d="m 36.52795,207.93332 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.16,-12.16 0.16,-12.16 h 12.16 12.16 l 0.16,12.16 0.16,12.16 12.16,0.16 12.16,0.16 v 12.32 12.32 l -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0637,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.336,0 -11.69824,-0.1132 -11.91609,-0.25157 z m 98.88,0 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.16,-12.16 0.16,-12.16 h 12.15999 12.16 l 0.16,12.16 0.16,12.16 12.16,0.16 12.16,0.16 v 12.32 12.32 l -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0637,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.33599,0 -11.69823,-0.1132 -11.91608,-0.25157 z m 98.87999,0 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.0838,-12.24379 0.0838,-12.2438 12.2362,0.0838 12.23619,0.0838 0.16,12.16 0.16,12.16 12.16,0.16966 c 6.688,0.0933 12.19771,0.2013 12.2438,0.24 0.0461,0.0387 0.0461,5.57834 0,12.31034 l -0.0838,12.24 -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0638,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.336,0 -11.69824,-0.1132 -11.91609,-0.25157 z"
id="path7105"
inkscape:connector-curvature="0" />
d="m 36.52795,207.93332 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.16,-12.16 0.16,-12.16 h 12.16 12.16 l 0.16,12.16 0.16,12.16 12.16,0.16 12.16,0.16 v 12.32 12.32 l -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0637,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.336,0 -11.69824,-0.1132 -11.91609,-0.25157 z m 98.88,0 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.16,-12.16 0.16,-12.16 h 12.15999 12.16 l 0.16,12.16 0.16,12.16 12.16,0.16 12.16,0.16 v 12.32 12.32 l -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0637,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.33599,0 -11.69823,-0.1132 -11.91608,-0.25157 z m 98.87999,0 c -0.30094,-0.19113 -0.41625,-3.16879 -0.48,-12.3951 l -0.0839,-12.14353 -12.16,-0.16 -12.16,-0.16 v -12.32 -12.32 l 12.16,-0.16 12.16,-0.16 0.0838,-12.24379 0.0838,-12.2438 12.2362,0.0838 12.23619,0.0838 0.16,12.16 0.16,12.16 12.16,0.16966 c 6.688,0.0933 12.19771,0.2013 12.2438,0.24 0.0461,0.0387 0.0461,5.57834 0,12.31034 l -0.0838,12.24 -12.16,0.16 -12.16,0.16 -0.0839,12.14353 c -0.0638,9.22631 -0.17906,12.20397 -0.48,12.3951 -0.21785,0.13837 -5.58009,0.25157 -11.91609,0.25157 -6.336,0 -11.69824,-0.1132 -11.91609,-0.25157 z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

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

View File

@ -1,178 +1,124 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="512"
height="512"
version="1.1"
id="svg140"
sodipodi:docname="gnome.svg"
inkscape:export-filename="gnome.png"
inkscape:export-xdpi="48"
inkscape:export-ydpi="48"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview142"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.96950969"
inkscape:cx="68.591372"
inkscape:cy="440.42881"
inkscape:window-width="3840"
inkscape:window-height="2091"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg140" />
<defs
id="defs84">
viewBox="0 0 512 512">
<defs>
<linearGradient
id="k">
id="autoidmagic-k">
<stop
offset="0"
stop-color="#d8dfd6"
id="stop2" />
stop-color="#d8dfd6" />
<stop
offset="1"
stop-color="#d8dfd6"
stop-opacity="0"
id="stop4" />
stop-opacity="0" />
</linearGradient>
<linearGradient
id="i">
id="autoidmagic-i">
<stop
offset="0"
stop-color="#9d9d9d"
id="stop7" />
stop-color="#9d9d9d" />
<stop
offset="1"
stop-color="#b9b9b9"
id="stop9" />
stop-color="#b9b9b9" />
</linearGradient>
<linearGradient
id="g">
id="autoidmagic-g">
<stop
offset="0"
stop-color="#909090"
id="stop12" />
stop-color="#909090" />
<stop
offset="1"
stop-color="#bebebe"
stop-opacity="0"
id="stop14" />
stop-opacity="0" />
</linearGradient>
<linearGradient
id="f">
id="autoidmagic-f">
<stop
offset="0"
stop-color="#585956"
id="stop17" />
stop-color="#585956" />
<stop
offset="1"
stop-color="#bbbeb8"
id="stop19" />
stop-color="#bbbeb8" />
</linearGradient>
<linearGradient
id="e">
id="autoidmagic-e">
<stop
offset="0"
id="stop22" />
offset="0" />
<stop
offset="1"
stop-opacity="0"
id="stop24" />
stop-opacity="0" />
</linearGradient>
<linearGradient
id="d">
id="autoidmagic-d">
<stop
offset="0"
stop-color="#5b5b97"
id="stop27" />
stop-color="#5b5b97" />
<stop
offset="1"
stop-color="#1b1b43"
id="stop29" />
stop-color="#1b1b43" />
</linearGradient>
<linearGradient
id="c">
id="autoidmagic-c">
<stop
offset="0"
stop-color="#fff"
id="stop32" />
stop-color="#fff" />
<stop
offset="1"
stop-color="#fcfcff"
stop-opacity="0"
id="stop34" />
stop-opacity="0" />
</linearGradient>
<linearGradient
id="h">
id="autoidmagic-h">
<stop
offset="0"
stop-color="#f9fff5"
id="stop37" />
stop-color="#f9fff5" />
<stop
offset="1"
stop-color="#f9fff5"
stop-opacity="0"
id="stop39" />
stop-opacity="0" />
</linearGradient>
<linearGradient
id="l">
id="autoidmagic-l">
<stop
offset="0"
id="stop42" />
offset="0" />
<stop
offset="1"
stop-opacity="0"
id="stop44" />
stop-opacity="0" />
</linearGradient>
<linearGradient
id="b">
id="autoidmagic-b">
<stop
offset="0"
stop-color="#fff"
id="stop47" />
stop-color="#fff" />
<stop
offset="1"
stop-color="#fff"
stop-opacity="0"
id="stop49" />
stop-opacity="0" />
</linearGradient>
<linearGradient
id="j">
id="autoidmagic-j">
<stop
offset="0"
stop-color="#8f8f8f"
id="stop52" />
stop-color="#8f8f8f" />
<stop
offset="1"
stop-color="#494949"
id="stop54" />
stop-color="#494949" />
</linearGradient>
<linearGradient
id="a">
id="autoidmagic-a">
<stop
offset="0"
stop-color="#dde1d9"
id="stop57" />
stop-color="#dde1d9" />
<stop
offset="1"
stop-color="#cacdc6"
id="stop59" />
stop-color="#cacdc6" />
</linearGradient>
<linearGradient
xlink:href="#a"
id="q"
xlink:href="#autoidmagic-a"
id="autoidmagic-q"
x1="8.6116238"
x2="34.784473"
y1="7.2293582"
@ -180,8 +126,8 @@
gradientTransform="matrix(12.591195,0,0,9.8631362,-5.8847298,-27.860012)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#b"
id="u"
xlink:href="#autoidmagic-b"
id="autoidmagic-u"
x1="17.698339"
x2="34.974548"
y1="13.004725"
@ -189,8 +135,8 @@
gradientTransform="matrix(12.348367,0,0,10.057154,23.370366,-2.1800188)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#c"
id="v"
xlink:href="#autoidmagic-c"
id="autoidmagic-v"
x1="11.492236"
x2="17.199417"
y1="1.6537577"
@ -198,8 +144,8 @@
gradientTransform="matrix(13.807232,0,0,9.9844946,34.28426,-28.162594)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#d"
id="s"
xlink:href="#autoidmagic-d"
id="autoidmagic-s"
x1="19.150396"
x2="16.315819"
y1="32.622238"
@ -207,8 +153,8 @@
gradientTransform="matrix(13.084653,0,0,10.535901,30.091445,-28.162594)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#e"
id="t"
xlink:href="#autoidmagic-e"
id="autoidmagic-t"
x1="3.7069976"
x2="3.7069974"
y1="171.29134"
@ -216,8 +162,8 @@
gradientTransform="matrix(63.57848,0,0,1.9533258,23.182557,-20.895004)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#f"
id="p"
xlink:href="#autoidmagic-f"
id="autoidmagic-p"
x1="12.206709"
x2="12.127711"
y1="53.535141"
@ -225,8 +171,8 @@
gradientTransform="matrix(20.241462,0,0,6.1354577,10.917863,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#g"
id="D"
xlink:href="#autoidmagic-g"
id="autoidmagic-D"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -234,8 +180,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98661,18.479522)" />
<linearGradient
xlink:href="#g"
id="E"
xlink:href="#autoidmagic-g"
id="autoidmagic-E"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -243,8 +189,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.9866,41.946455)" />
<linearGradient
xlink:href="#g"
id="F"
xlink:href="#autoidmagic-g"
id="autoidmagic-F"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -252,8 +198,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.9866,64.234517)" />
<linearGradient
xlink:href="#g"
id="G"
xlink:href="#autoidmagic-g"
id="autoidmagic-G"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -261,8 +207,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98661,86.52258)" />
<linearGradient
xlink:href="#g"
id="H"
xlink:href="#autoidmagic-g"
id="autoidmagic-H"
x1="34.300991"
x2="35.520542"
y1="3.9384086"
@ -270,8 +216,8 @@
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(14.83538,0,0,7.3377873,-259.98662,108.81063)" />
<linearGradient
xlink:href="#h"
id="C"
xlink:href="#autoidmagic-h"
id="autoidmagic-C"
x1="13.62871"
x2="8.6485014"
y1="101.2846"
@ -279,8 +225,8 @@
gradientTransform="matrix(23.88868,0,0,5.1986904,22.418008,-18.994423)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#i"
id="z"
xlink:href="#autoidmagic-i"
id="autoidmagic-z"
x1="8.1134243"
x2="8.1134233"
y1="88.509071"
@ -288,8 +234,8 @@
gradientTransform="matrix(25.74104,0,0,4.8245853,-142.74252,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#j"
id="r"
xlink:href="#autoidmagic-j"
id="autoidmagic-r"
x1="10.390738"
x2="32.536823"
y1="5.3817744"
@ -297,8 +243,8 @@
gradientTransform="matrix(12.307468,0,0,10.090586,12.22432,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#a"
id="x"
xlink:href="#autoidmagic-a"
id="autoidmagic-x"
x1="18.316999"
x2="18.176752"
y1="48.643234"
@ -306,8 +252,8 @@
gradientTransform="matrix(12.591195,0,0,9.8631362,11.239333,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#k"
id="n"
xlink:href="#autoidmagic-k"
id="autoidmagic-n"
x1="-23.8857"
x2="-23.8857"
y1="49.953003"
@ -315,8 +261,8 @@
gradientTransform="matrix(15.642886,0,0,7.018955,629.64278,25.916246)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#i"
id="B"
xlink:href="#autoidmagic-i"
id="autoidmagic-B"
x1="8.1134243"
x2="8.1134233"
y1="88.509071"
@ -324,8 +270,8 @@
gradientTransform="matrix(25.74104,0,0,4.8245853,55.242987,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#i"
id="A"
xlink:href="#autoidmagic-i"
id="autoidmagic-A"
x1="8.1134243"
x2="8.1134233"
y1="88.509071"
@ -333,8 +279,8 @@
gradientTransform="matrix(25.74104,0,0,4.8245853,50.810482,-13.32405)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#j"
id="y"
xlink:href="#autoidmagic-j"
id="autoidmagic-y"
x1="10.390738"
x2="32.536823"
y1="5.3817744"
@ -342,8 +288,8 @@
gradientTransform="matrix(12.307468,0,0,10.090586,11.239333,-13.32405)"
gradientUnits="userSpaceOnUse" />
<radialGradient
xlink:href="#l"
id="m"
xlink:href="#autoidmagic-l"
id="autoidmagic-m"
cx="12.57571"
cy="67.501709"
r="8.7662792"
@ -352,8 +298,8 @@
gradientTransform="matrix(21.461174,0,0,7.9215182,244.5075,-162.63215)"
gradientUnits="userSpaceOnUse" />
<radialGradient
xlink:href="#l"
id="o"
xlink:href="#autoidmagic-l"
id="autoidmagic-o"
cx="12.57571"
cy="67.501709"
r="8.7662792"
@ -362,8 +308,8 @@
gradientTransform="matrix(21.461174,0,0,7.9215182,-13.890674,-225.29756)"
gradientUnits="userSpaceOnUse" />
<radialGradient
xlink:href="#l"
id="w"
xlink:href="#autoidmagic-l"
id="autoidmagic-w"
cx="12.57571"
cy="67.501709"
r="8.7662792"
@ -372,9 +318,8 @@
gradientTransform="matrix(27.135509,0,0,7.4720691,-85.249767,-57.904888)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5716"
id="linearGradient32682"
xlink:href="#autoidmagic-linearGradient5716"
id="autoidmagic-linearGradient32682"
gradientUnits="userSpaceOnUse"
x1="29.089951"
y1="11.772627"
@ -382,15 +327,13 @@
y2="9.7093649"
gradientTransform="matrix(6.372617,0,0,6.372617,57.029062,91.84993)" />
<linearGradient
id="linearGradient5716">
id="autoidmagic-linearGradient5716">
<stop
style="stop-color:#727272;stop-opacity:1;"
offset="0"
id="stop5718" />
offset="0" />
<stop
style="stop-color:#484848;stop-opacity:1;"
offset="1"
id="stop5720" />
offset="1" />
</linearGradient>
</defs>
<path
@ -400,105 +343,92 @@
d="m 360.69169,353.53372 a 104.69169,43.902974 0 1 1 -209.38339,0 104.6917,43.902972 0 1 1 209.38339,0 z"
color="#000000"
overflow="visible"
style="stroke-width:11.144;marker:none"
id="path88" />
style="stroke-width:11.144;marker:none" />
<path
fill="none"
stroke="#7b7f7a"
d="m 354.43845,345.65284 a 98.438459,41.280646 0 1 1 -196.87691,0 98.438459,41.280646 0 1 1 196.87691,0 z"
color="#000000"
overflow="visible"
style="stroke-width:10.4784;marker:none"
id="path90" />
style="stroke-width:10.4784;marker:none" />
<path
fill="none"
stroke="url(#n)"
stroke="url(#autoidmagic-n)"
stroke-width="7.13216"
d="m 354.43845,337.29482 a 98.438459,41.280646 0 1 1 -196.87691,0 98.438459,41.280646 0 1 1 196.87691,0 z"
color="#000000"
overflow="visible"
style="stroke:url(#n);marker:none"
id="path92" />
style="stroke:url(#autoidmagic-n);marker:none" />
<path
fill="#d0d0d0"
fill-rule="evenodd"
stroke="#979797"
stroke-linejoin="round"
stroke-width="4.45761"
d="m 137.35944,307.24786 -0.6965,11.14402 c 0,0 48.18799,40.10923 100.29629,46.83289 26.05413,3.36181 52.97509,7.82769 75.2222,13.23353 22.2471,5.40583 39.98875,12.47692 45.96913,18.4573 3.45923,3.45923 5.02666,6.39264 5.57202,8.70627 0.54538,2.31361 0.42593,3.95406 -1.04476,6.26852 -2.94127,4.62889 -12.03397,10.78355 -27.51182,15.6713 -30.95573,9.77548 -86.03665,16.01954 -162.28496,16.01954 v 11.14403 c 76.84921,0 132.20905,-5.88038 165.41922,-16.3678 16.60506,-5.2437 28.13802,-11.31885 33.78034,-20.19855 2.82115,-4.43986 3.98199,-9.90091 2.78601,-14.9748 -1.19599,-5.07389 -4.2855,-9.85751 -8.70629,-14.27828 -9.77966,-9.77968 -28.27059,-15.67342 -51.19288,-21.24332 -22.9223,-5.5699 -50.3235,-10.18931 -76.61521,-13.58178 -52.58341,-6.78496 -100.99279,-46.83287 -100.99279,-46.83287 z"
id="path94" />
d="m 137.35944,307.24786 -0.6965,11.14402 c 0,0 48.18799,40.10923 100.29629,46.83289 26.05413,3.36181 52.97509,7.82769 75.2222,13.23353 22.2471,5.40583 39.98875,12.47692 45.96913,18.4573 3.45923,3.45923 5.02666,6.39264 5.57202,8.70627 0.54538,2.31361 0.42593,3.95406 -1.04476,6.26852 -2.94127,4.62889 -12.03397,10.78355 -27.51182,15.6713 -30.95573,9.77548 -86.03665,16.01954 -162.28496,16.01954 v 11.14403 c 76.84921,0 132.20905,-5.88038 165.41922,-16.3678 16.60506,-5.2437 28.13802,-11.31885 33.78034,-20.19855 2.82115,-4.43986 3.98199,-9.90091 2.78601,-14.9748 -1.19599,-5.07389 -4.2855,-9.85751 -8.70629,-14.27828 -9.77966,-9.77968 -28.27059,-15.67342 -51.19288,-21.24332 -22.9223,-5.5699 -50.3235,-10.18931 -76.61521,-13.58178 -52.58341,-6.78496 -100.99279,-46.83287 -100.99279,-46.83287 z" />
<path
fill="url(#q)"
fill="url(#autoidmagic-q)"
fill-rule="evenodd"
stroke="url(#r)"
stroke="url(#autoidmagic-r)"
d="M 91.134117,5.5720155 H 420.86588 c 10.15603,0 18.09954,6.5023395 18.57433,15.6193295 l 14.84434,285.043295 c 0.6487,12.45607 -10.04139,22.51435 -22.51434,22.51435 H 80.22979 c -12.472947,0 -23.163025,-10.05828 -22.514344,-22.51435 L 72.559783,21.191345 C 73.00871,12.571051 78.66117,5.5720155 91.134117,5.5720155 Z"
color="#000000"
overflow="visible"
style="fill:url(#q);stroke:url(#r);stroke-width:11.144;marker:none"
id="path100" />
style="fill:url(#autoidmagic-q);stroke:url(#autoidmagic-r);stroke-width:11.144;marker:none" />
<path
fill="url(#s)"
fill="url(#autoidmagic-s)"
fill-rule="evenodd"
stroke="#000079"
stroke-linejoin="round"
stroke-width="5.57202"
d="M 115.77466,34.660223 101.93161,280.33393 H 410.0684 L 395.19094,35.701393 Z"
id="path102"
style="fill:url(#s)" />
style="fill:url(#autoidmagic-s)" />
<path
fill="none"
stroke="url(#t)"
stroke="url(#autoidmagic-t)"
stroke-linecap="round"
stroke-opacity="0.248408"
stroke-width="11.1015"
d="M 80.880032,306.90848 H 431.11997"
id="path104"
style="stroke:url(#t)" />
style="stroke:url(#autoidmagic-t)" />
<path
fill="none"
stroke="url(#u)"
stroke="url(#autoidmagic-u)"
stroke-opacity="0.700637"
stroke-width="11.144"
d="M 89.282836,16.835483 421.88205,16.414224 c 3.16154,-0.004 6.23288,2.64392 6.487,7.271968 l 15.17696,276.408168 c 0.6468,11.77959 -6.01498,19.9018 -17.81229,19.9018 H 85.573654 c -11.797326,0 -17.752602,-8.12167 -17.115799,-19.9018 L 83.21356,27.130602 c 0.431228,-7.977238 1.854204,-10.28978 6.069276,-10.295119 z"
color="#000000"
overflow="visible"
style="stroke:url(#u);marker:none"
id="path106" />
style="stroke:url(#autoidmagic-u);marker:none" />
<path
fill="url(#v)"
fill="url(#autoidmagic-v)"
fill-rule="evenodd"
d="M 124.78475,39.569563 115.84134,238.71708 C 238.92314,211.96439 243.12248,121.79169 396.15866,92.209285 l -1.79945,-51.903503 z"
opacity="0.531429"
id="path108"
style="fill:url(#v);stroke-width:11.144" />
style="fill:url(#autoidmagic-v);stroke-width:11.144" />
<path
fill="url(#w)"
fill="url(#autoidmagic-w)"
fill-rule="evenodd"
d="m 493.87848,446.47497 a 237.8785,65.502559 0 1 1 -475.756961,0 237.8785,65.502559 0 1 1 475.756961,0 z"
color="#000000"
overflow="visible"
style="fill:url(#w);stroke-width:14.2394;marker:none"
id="path110" />
style="fill:url(#autoidmagic-w);stroke-width:14.2394;marker:none" />
<path
fill="url(#x)"
fill="url(#autoidmagic-x)"
fill-rule="evenodd"
stroke="url(#y)"
stroke="url(#autoidmagic-y)"
d="M 83.254112,396.97079 H 428.74589 c 12.47294,0 10.89167,3.0249 12.17182,6.82957 l 31.58938,93.88633 c 1.28012,3.80468 0.3011,6.82958 -12.17182,6.82958 H 51.664732 c -12.472947,0 -13.451955,-3.0249 -12.171817,-6.82958 l 31.58938,-93.88633 c 1.280137,-3.80468 -0.301134,-6.82957 12.171817,-6.82957 z"
color="#000000"
overflow="visible"
style="fill:url(#x);stroke:url(#y);stroke-width:11.144;marker:none"
id="path112" />
style="fill:url(#autoidmagic-x);stroke:url(#autoidmagic-y);stroke-width:11.144;marker:none" />
<path
fill="#7a7d77"
fill-rule="evenodd"
d="m 122.03967,419.38879 -19.70005,57.13015 h 61.07015 l 5.91002,-22.65505 H 334.8002 l 6.12564,23.12514 h 68.73454 l -18.71502,-57.60024 z"
id="path114"
style="stroke-width:11.144" />
<path
fill="#777874"
fill-rule="evenodd"
d="m 178.67731,457.80391 -4.92502,18.71505 h 164.49542 l -4.92502,-19.70005 z"
id="path116"
style="stroke-width:11.144" />
<path
fill="#777a75"
@ -506,44 +436,36 @@
d="m 276.19255,419.38881 18.71505,56.14515 -61.07016,-0.98503 -16.74504,-54.17514 z"
color="#000000"
overflow="visible"
style="stroke-width:11.144;marker:none"
id="path118" />
style="stroke-width:11.144;marker:none" />
<path
fill="url(#z)"
fill="url(#autoidmagic-z)"
fill-rule="evenodd"
d="M 276.19255,413.47881 294.9076,469.62396 233.83744,468.63894 217.0924,414.4638 Z"
color="#000000"
overflow="visible"
style="fill:url(#z);stroke-width:11.144;marker:none"
id="path120" />
style="fill:url(#autoidmagic-z);stroke-width:11.144;marker:none" />
<path
fill="url(#A)"
fill="url(#autoidmagic-A)"
fill-rule="evenodd"
d="m 122.03967,412.49381 -19.70005,57.13015 h 61.07015 l 5.91002,-22.65506 H 334.8002 l 6.12564,23.12514 h 68.73454 l -18.71502,-57.60023 z"
id="path122"
style="fill:url(#A);stroke-width:11.144" />
style="fill:url(#autoidmagic-A);stroke-width:11.144" />
<path
fill="url(#B)"
fill="url(#autoidmagic-B)"
fill-rule="evenodd"
d="m 178.67731,451.89391 -4.92502,18.71506 h 164.49542 l -4.92502,-19.70006 z"
color="#000000"
overflow="visible"
style="fill:url(#B);stroke-width:11.144;marker:none"
id="path124" />
style="fill:url(#autoidmagic-B);stroke-width:11.144;marker:none" />
<path
fill="none"
stroke="url(#C)"
stroke="url(#autoidmagic-C)"
stroke-linejoin="round"
stroke-width="5.57202"
d="m 79.56258,405.44765 h 354.66789 l 29.38879,90.18377 H 48.380735 Z"
color="#000000"
overflow="visible"
style="stroke:url(#C);marker:none"
id="path126" />
style="stroke:url(#autoidmagic-C);marker:none" />
<path
sodipodi:nodetypes="cccccccc"
id="path5565"
d="m 226.57187,106.62161 v 104.76731 l 23.65714,-23.09387 13.51835,27.59999 c 3.3112,7.46474 20.52532,1.46267 15.63062,-8.51939 l -13.37756,-28.65611 29.85305,-2.8e-4 z"
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient32682);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:6.37262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
inkscape:connector-curvature="0" />
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#autoidmagic-linearGradient32682);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:6.37262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -5,12 +5,13 @@
{% load i18n %}
{% load static %}
{% load extras %}
{% block content %}
<p class="text-center">
<img src="{% static 'theme/img/freedombox-logo-250px.png' %}"
class="main-graphic" />
class="main-graphic">
</p>
{% if version %}
@ -18,10 +19,10 @@
d-flex align-items-center">
<div class="me-2">
{% if new_version %}
<span class="fa fa-exclamation-triangle" aria-hidden="true"></span>
{% icon 'exclamation-triangle' %}
<span class="visually-hidden">{% trans "Caution:" %}</span>
{% else %}
<span class="fa fa-check-circle" aria-hidden="true"></span>
{% icon 'check-circle' %}
<span class="visually-hidden">{% trans "Success:" %}</span>
{% endif %}
</div>

View File

@ -16,7 +16,7 @@
<span class="navbar-brand">
<img src="{% static 'theme/img/freedombox-logo-32px.png' %}"
alt="{{ cfg.box_name }}" />
alt="{{ cfg.box_name }}">
<a href="{% url 'index' %}">
{% blocktrans trimmed %}{{ box_name }} Setup{% endblocktrans %}
</a>

View File

@ -4,6 +4,7 @@
{% endcomment %}
{% load i18n %}
{% load extras %}
{% block content %}
<h2>{% trans "Contribute" %}</h2>
@ -55,7 +56,7 @@
<a class="btn btn-default collapsed collapsible-button" role="button"
data-bs-toggle="collapse" href="#collapse-issues" aria-expanded="false"
aria-controls="collapse-issues">
<span class="fa fa-chevron-right fa-fw" aria-hidden="true"></span>
{% icon 'chevron-right' %}
{% trans "Show issues" %}
</a>

View File

@ -58,7 +58,7 @@
<span class="navbar-brand">
<img src="{% static 'theme/img/freedombox-logo-32px.png' %}"
alt="{{ cfg.box_name }}" />
alt="{{ cfg.box_name }}">
<a href="{% url 'index' %}">
{% blocktrans trimmed %}{{ box_name }} Setup{% endblocktrans %}
</a>

View File

@ -5,16 +5,17 @@
{% 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">
<span class="fa fa-download fa-fw fa-lg"></span>
{% icon 'download' %}
{% trans 'Download as PDF' %}
</a>
{{ content|safe }}

View File

@ -1,70 +1,13 @@
<?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"
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">
xmlns="http://www.w3.org/2000/svg">
<g>
<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"
@ -73,116 +16,95 @@
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"
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">
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>
<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"
sodipodi:nodetypes="ccccccccccccccccccccccccccc" />
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" />
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -1,115 +1,24 @@
<?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"
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>
viewBox="0 0 512 512">
<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"
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" />
style="fill:currentColor;fill-opacity:1;stroke:none"/>
<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)"
id="rect2103"
style="fill:#c00040;fill-opacity:0.94117647;stroke:none"
inkscape:connector-curvature="0" />
style="fill:#c00040;fill-opacity:0.94117647;stroke:none" />
<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)"
id="rect2105"
style="fill:#c00040;fill-opacity:0.94117647;stroke:none"
inkscape:connector-curvature="0" />
style="fill:#c00040;fill-opacity:0.94117647;stroke:none" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

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