Commit Graph

1407 Commits

Author SHA1 Message Date
eleith 10aa22dd45
Merge pull request #23070 from eleith/complex-recurrance-imports
handle vcalander documents with multiple VEVENTS not in order
2020-11-10 05:20:56 -08:00
Joas Schilling 8027dcbc6f
Don't leave cursors open when tests fail
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-11-09 12:28:17 +01:00
Richard Steinmetz f1c242c71d
Use png icons in caldav reminder emails
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2020-11-07 14:09:22 +01:00
Roeland Jago Douma 8bd39fccf4
Have the CommentsPropertiesPlugin use the new fancy method
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2020-11-04 16:37:42 +01:00
Morris Jobke dc479aae2d
Improve CertificateManager to not be user context dependent
* removes the ability for users to import their own certificates (for external storage)
* reliably returns the same certificate bundles system wide (and not depending on the user context and available sessions)

The user specific certificates were broken in some cases anyways, as they are only loaded if the specific user is logged in and thus causing unexpected behavior for background jobs and other non-user triggered code paths.

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2020-11-03 00:13:01 +01:00
leith abdulla 8c1f17383b resolve review comments
update styling for conditionals and simplifying conditional by only
relying on dtstart instead of also counting vevents (since they imply
the same condition, assuming valid events)

Signed-off-by: leith abdulla <online-nextcloud@eleith.com>
2020-10-29 07:31:56 -07:00
leith abdulla a40a307b65 handle vcalander documents with recurrence with exemptions or edits
when importing ics files from third party services (ex: google), long
running recurrence vcalander objects can contain numerous vevents
relating to past exemptions or edits.

these objects are handled incorrectly, leading to incorrect first and/or
last occurence dates from being inferred. as a result, a number of
imported events are not rendered in the calendar.

this PR makes use of EventIterator's constructor that takes in an array
of VEVENTS to properly handle these complex cases.

Also of note is that other parameter signatures of EventIterator's constructor,
will be deprecated, according to comments in sabre dav EventIterator.php

Signed-off-by: leith abdulla <online-nextcloud@eleith.com>
2020-10-28 21:07:00 -07:00
Roeland Jago Douma c5e0ef1972
Don't overwrite the event if we use it later
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2020-10-28 13:24:17 +01:00
Roeland Jago Douma 46ce7277c7
Also run the SabreAuthInitEvent for the main server
else for example trusted servers breaks

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2020-10-27 15:23:27 +01:00
Simon Spannagel 9956d13b90 CalDavBackend: check if timerange is array before accessing
Signed-off-by: Simon Spannagel <simonspa@kth.se>
2020-10-16 07:50:36 +02:00
call-me-matt 1b2386d108
handle nested properties, fixes #20544
Signed-off-by: call-me-matt <nextcloud@matthiasheinisch.de>
2020-10-12 21:27:38 +02:00
Morris Jobke ca5e8d2093
Merge pull request #23025 from Iscle/master
DirectController: Let users choose the link expiration time
2020-10-06 22:12:22 +02:00
Morris Jobke 5169976d2b
Merge pull request #23028 from nextcloud/bugfix/noid/array-to-string-conversion-on-event-search
Fix array to string conversion on event search
2020-10-05 23:04:48 +02:00
Christoph Wurst d9015a8c94
Format code to a single space around binary operators
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-10-05 20:25:24 +02:00
Roeland Jago Douma 0bca480efd
Merge pull request #22969 from eleith/catch-no-instance-exception
broaden exception handling on webcal refresh
2020-10-04 11:14:00 +02:00
Iscle 0e5d692866 DirectController: Verify that expirationTime is between 0s and 24h
Signed-off-by: Iscle <albertiscle9@gmail.com>
2020-10-01 23:48:41 +02:00
eleith aa956ab46e broaden exception handling on webcal refresh
when iterating through a calendar, recurrance events can throw an
exception if no instances of the recurrance are found.

this exception is of class `Exception` but the try/catch clause in the
webcal refresh loop only catches `BadRequest` exception.

this leads to the exception bubbling up and thus other calendar events
do not get processed by the event iterator.

this PR broadens the exception to handle both BadRequest and
NoInstanceFoundException so that the full webcal can be processed, even
if minor hiccups are processing on vobject

Signed-off-by: leith abdulla <online-nextcloud@eleith.com>
2020-09-29 20:47:38 -07:00
Roeland Jago Douma 4175c3f499
Merge pull request #22983 from nextcloud/bugfix/noid/sync-all-users-to-systemaddressbook
Sync all users to the system addresssbook
2020-09-29 09:12:40 +02:00
Joas Schilling 6db5f53bc6
Fix numeric folders throwing on markDirty
TypeError: strpos() expects parameter 1 to be string, int given

The problem is that in cacheNode() we strip of any slashes, so
a folder "0/" will be trimmed to "0" and be used as an array key.
Since PHP automatically casts numeric array keys to integers,
you afterwards get $nodePath as int(0). Since it's now a number,
the strpos() function does not accept it anymore. Simply casting
$nodePath to a string again in the foreach solves the issue

Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-09-24 15:02:30 +02:00
Joas Schilling cea7252874
Fix array to string conversion on event search
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-09-24 13:52:24 +02:00
Iscle ebd734dc86 DirectController: Let users choose the expiration time
Signed-off-by: Iscle <albertiscle9@gmail.com>
2020-09-24 01:27:33 +02:00
Joas Schilling 8b77aa6b4f
Sync all users to the system addresssbook
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-09-21 09:01:39 +02:00
J0WI 1639289b95 Update urls to stackoverflow.com to "HTTPS"
Signed-off-by: J0WI <J0WI@users.noreply.github.com>
2020-09-17 17:38:27 +02:00
Morris Jobke 99c9423766
Remove @suppress SqlInjectionChecker
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2020-09-16 15:53:56 +02:00
Morris Jobke 04a3580d19
Remove phan config - was replaced by Psalm
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2020-09-16 14:46:29 +02:00
Morris Jobke c1ff011990
Merge pull request #22799 from nextcloud/bugfix/noid/dont-log-microsoft-webdav-client-trying-to-tag
Don't log Microsoft WebDAV client trying to tag things
2020-09-14 14:43:54 +02:00
Joas Schilling 2dbd6424f7
Don't log Microsoft WebDAV client trying to tag things
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-09-11 11:52:05 +02:00
Georg Ehrke b5204a78cc
Mitigate encoding issue with user principal uri
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
2020-09-10 16:00:03 +02:00
Julius Härtl 1dddf6adc7
Properly catch exception from writing to stream when copying a file
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2020-09-10 09:03:53 +02:00
Christoph Wurst 1f7f93a695
Update license headers for Nextcloud 20 (again)
There are still lots of outdated headers, so time for another round of
updates.

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-09-07 14:37:44 +02:00
Jacob Neplokh e8a4feb1c6
Change Content-Disposition Header
- Make ALLOWED_CONTENT_TYPES public in order to use
- Add $fileName variable which uses "$node->getName()" to get the proper file name and "$file->getMimeType()" along with the ALLOWED_CONTENT_TYPES array in PhotoCache.php to get the proper file extension
- Make "$fileName" the name of the file in the Content-Disposition header when downloading a Contact's photo
- Add filename to the CardDAV integration image export test header
- Change headers in ImageExportPluginTest to reflect changes

Signed-off-by: Jacob Neplokh <me@jacobneplokh.com>
2020-09-05 11:46:25 -07:00
John Molakvoæ 593d64d935
Merge pull request #17456 from brad2014/feature/brad2014/12391-improve-imip-mail-message-take-2 2020-09-04 19:53:02 +02:00
Julius Härtl 4cf29e598d
Do not keep the part file if the forbidden exception has retry set to false
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2020-09-03 11:00:24 +02:00
Brad Rubenstein 442af8c5d5 Minor cleanup: php-cs-fixer, tests, interface consistency
IMipPlugin.php Removed blank lines to make php-cs-fixer happy.
Minor cleanup:  bugs found by Psalm static checker
IEMailTemplate: The public interface to addBodyListItem also needs to include the new plainIndent parameter.
IMipPlugin: Fixes an undefined variable for events that do not have DTEND.  Also use explicit string conversion for parameters and properties in several places.

The new email template adds an additional blank line before "button" links in plain text, so the tests were fixed to include that additional blank line.

Signed-off-by: Brad Rubenstein <brad@wbr.tech>
2020-09-02 17:54:36 +02:00
Robin Appelman 460db942a0
Update apps/dav/lib/CalDAV/Activity/Setting/CalDAVSetting.php
Co-authored-by: Joas Schilling <213943+nickvergessen@users.noreply.github.com>
2020-08-26 12:20:46 +00:00
Robin Appelman aadf0f6f87
move calendar settings into their own group
Signed-off-by: Robin Appelman <robin@icewind.nl>
2020-08-25 19:11:28 +02:00
Christoph Wurst 2a054e6c04
Update the license headers for Nextcloud 20
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-08-24 14:54:25 +02:00
brad2014 b0687b1182 Make icon set for CalDav event presentation, use in iMIP email.
iMIP e-mails were, as a hack, using filetypes icons for caldav
elements (titles, locations).  This commit creates a folder of
caldav element icons. To start, they are used in iMIP emails,
but eventually should be used by any app that wants to have icon
labels for caldav elements.

Signed-off-by: brad2014 <brad2014@users.noreply.github.com>
2020-08-20 22:16:47 +02:00
brad2014 781359a582 iMIP email improvements (take 2)
This PR is a replacement for PR #17195. It is intended to be simpler
to review and approve, with fewer changes, some disabled by default.

It addresses issues #12391 and #13555, with the following changes:

- The plainText of iMIP emails has been upgraded as described in
issue #12391. The HTML design style has not been changed.

- Some of the HTML and plainText content has been rearranged
(simplified header language, moving the event title to from text
body to the first item in the bullet list, spelling corrections,
moving the description to the end of the list), per issue #12391.

- The interface for EMailTemplate has been extended: addBodyListItem
now takes an optional `plainIndent` parameter. Existing callers
see no change. Where new calls set the  new parameter >0, the list
item label (metaInfo) is put in column 1, and the value is indented
into column 2 (properly accounting for multiple lines, if any).

- An optional dav config setting has been added,
`invitation_list_attendees`. It defaults to 'no', leaving emails
unchanged. If set by the site admin to 'yes', then iMIP emails
include, for the organizer and each attendee, their name, email,
and a ✔︎ if they have accepted the invitation.

- Minor refactoring.

Notes:

- The labels for organizers and attendees list items are new, and
require translation/localization.

- Dav config settings are documented in the code, but not in the
Administrator's Guide.

Signed-off-by: brad2014 <brad2014@users.noreply.github.com>
2020-08-20 22:16:47 +02:00
Joas Schilling 553cda2a6d
Don't load all calendar objects into memory
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-08-20 07:56:25 +02:00
Morris Jobke 4361d65f5f
Merge pull request #22041 from nextcloud/feature/noid/typed_events_dav
Add Typed Events for CalDAV- and CardDAV-related Events
2020-08-19 19:34:12 +02:00
Morris Jobke fedf9c69d9
Use matching parameter names form interfaces and implementations
Found by Psalm 3.14.1

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2020-08-19 18:16:35 +02:00
Georg Ehrke e6433eeb02
Typecast parameter of getAddressBookById
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
2020-08-19 15:30:13 +02:00
Georg Ehrke 67f1ef4658
Add Typed Events for CalDAV- and CardDAV-related Events
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
2020-08-18 21:40:57 +02:00
Morris Jobke 05df385538
Merge pull request #22236 from nextcloud/bugfix/noid/dav_sharing_backend_canWrite_isOwner
CalDAV: Add ability to limit sharing to owner
2020-08-18 16:48:43 +02:00
Georg Ehrke 14755d85d6
Add ability to limit sharing to owner
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
2020-08-18 13:18:00 +02:00
Daniel Kesselberg 6f8147b18f
Fix some MissingDocblockType or InvalidDocblock warnings.
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2020-08-14 15:10:48 +02:00
Roeland Jago Douma f1dd87dc50
Merge pull request #22200 from cweiske/duplicated-sql-where-line
Remove duplicated SQL addWhere line
2020-08-14 05:43:42 +02:00
Julius Härtl 6722246aca
Return proper status when file didn't exist before
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2020-08-13 15:26:42 +02:00
Julius Härtl 860f6d8fcf
Delete chunks if the move on an upload failed
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2020-08-12 08:18:46 +02:00
Christian Weiske ebe7081c2b Remove duplicated SQL addWhere line 2020-08-11 21:35:48 +02:00
John Molakvoæ (skjnldsv) d2c0569b49
Fix search providers order and IDs
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
2020-08-05 17:57:17 +02:00
Joas Schilling 55473dd2eb
Merge pull request #22104 from nextcloud/enh/search/make-app-handle-the-order-logic
Make apps handle the order logic
2020-08-05 16:38:45 +02:00
Joas Schilling ea8f68bea6 Hand in the route and the parameters of the request
Signed-off-by: Joas Schilling <coding@schilljs.com>
Signed-off-by: npmbuildbot[bot] <npmbuildbot[bot]@users.noreply.github.com>
2020-08-05 12:52:16 +00:00
John Molakvoæ a4d511d827
Merge pull request #22099 from nextcloud/fix/unified-search 2020-08-05 14:17:42 +02:00
John Molakvoæ (skjnldsv) d98f7c1bd8
Make apps handle the order logic
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
2020-08-05 11:37:45 +02:00
Georg Ehrke b0c5457c42
IAddressBook: add isShared and isSystemAddressBook
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
2020-08-05 09:04:41 +02:00
John Molakvoæ (skjnldsv) 71b62c4203
Show mime icon, bump bundles, make the SearchResultEntry class non-abstract, Fix header search icon, various fixes
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
2020-08-04 21:36:22 +02:00
John Molakvoæ 72b45f9546
Merge pull request #22020 from nextcloud/feature/20918/calendar_search
Add Event and Task Backends for Unified Search
2020-08-04 20:54:27 +02:00
blizzz 7d2f5aff1a
Merge pull request #22062 from nextcloud/fix/noid/displayname-in-incoming-remote-share-notification
fix display of remote users in incoming share notifications
2020-08-04 16:26:41 +00:00
Georg Ehrke 900617e7d7
Add Event and Task Backends for Unified Search
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
2020-08-04 16:01:59 +02:00
Georg Ehrke 5fb2562332
Implement Contacts Backend for Unified Search
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
2020-08-03 16:29:01 +02:00
Joas Schilling a0ee4b584c
Short php syntax
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-08-03 11:25:21 +02:00
matt 4679e85076
adding social profile to search index
required in order to optimize regular background updates of contact avatars from social networks (see https://github.com/nextcloud/contacts/pull/1722#discussion_r463782429)
2020-08-02 14:16:50 +02:00
Arthur Schiwon 04521c6afc
coding style fixes
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2020-07-30 21:18:20 +02:00
Arthur Schiwon b79e34c57b
fix check for Cloud ID, missing return statements, wrong param use
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2020-07-30 21:10:54 +02:00
Morris Jobke 0763a17332
Move federated_share_added into a typed event
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2020-07-23 08:33:17 +02:00
Christoph Wurst 5005510d82
Migrate DAV to the PSR container
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-07-16 15:44:03 +02:00
Roeland Jago Douma 68f1283691
Do not log RequestedRangeNotSatisfiable exceptions in DAV
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2020-07-14 20:46:33 +02:00
Morris Jobke aab646a9d0
Update system addressbook card only when there was a change based on a cached etag
Due to our old and new hook system the card dav backend listens to old and new hooks. This triggers this code multiple times and always causes an update. With this change we cache the etag during a request and only trigger the update if the etag has changed. This does not catches all not needed updates, but it does not need another round trip to the database and still covers most cases where multiple attributes are updated during one single request.

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2020-07-09 11:43:58 +02:00
Morris Jobke e878c0a054
Merge pull request #21074 from jvsalo/shared-lock-multi-release
Fix releasing a shared lock multiple times
2020-07-06 14:06:41 +02:00
Morris Jobke db782fefa1
Merge pull request #21222 from nextcloud/bugfix/18965/reduce-contacts-search-load
Reduce contacts search load
2020-07-06 13:56:06 +02:00
Morris Jobke d78449c01c
Merge pull request #18895 from nextcloud/bugfix/noid/fix_birthday_calendar_color
Changes the Birthday calendar color to slightly brighter one
2020-07-06 13:20:55 +02:00
Morris Jobke d3d11cb826
Merge pull request #21626 from nextcloud/enhancement/injectible-callables
Callable parameter injection
2020-07-05 22:03:12 +02:00
Roeland Jago Douma 4d8b4ef3cc
Merge pull request #21533 from nextcloud/techdebt/noid/dedicated-method-to-get-a-users-language
Techdebt/noid/dedicated method to get a users language
2020-07-04 08:56:13 +02:00
Christoph Wurst 8150bcb60c
Use \OCP\IContainer::injectFn to boot the DAV app
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-07-03 14:37:53 +02:00
Joas Schilling db8267db26
Use the new method everywhere
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-07-03 10:59:43 +02:00
Roeland Jago Douma 0157e30ad4
Merge pull request #21599 from nextcloud/debt/noid/type-to-types
Replace TYPE with TYPES
2020-07-02 12:21:01 +02:00
Daniel Kesselberg 87dd760a89
Replace TYPE with TYPES
As TYPE::* is deprecated.

Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2020-06-30 23:46:22 +02:00
Joas Schilling d7c0b9cced
Also always return in app commands
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-06-26 15:12:11 +02:00
Joas Schilling 89ed2c37bf
Update share type constant usage
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-06-24 16:49:16 +02:00
Christoph Wurst 1285be2bd1
Move DAV to the new bootstrap mechanism
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-06-19 15:10:20 +02:00
Joas Schilling 00e7b2b956
Reduce load of the contacts search when we know it can't match
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-06-15 08:47:30 +02:00
Joas Schilling fdd8c86c60
Fix pagination of contacts search
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-06-10 09:38:59 +02:00
Roeland Jago Douma 7b6b946470
Allow for compression of the PROPFIND responses
For now it just gzip and only for propfind (the 99% case). Already saves
a bunch since the propfinds compress so nicely.

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2020-06-06 15:55:04 +02:00
Thomas Citharel b61b74e81a
Fix empty event UUID reminder notifications
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2020-06-04 11:25:36 +02:00
Jaakko Salo 6886b46ee2 In LockPlugin, only release a lock if it was acquired
When uploading new files, getNodeForPath() will not succeed
yet so the lock cannot be acquired.

In that case, don't try to unlock it either.

Signed-off-by: Jaakko Salo <jaakkos@gmail.com>
2020-05-24 20:26:38 +03:00
Roeland Jago Douma 6aea539745
Merge pull request #20844 from nextcloud/feature/noid/maintenance-mode-webdav-translated
Translate the maintenance mode message in webdav
2020-05-11 13:10:26 +02:00
Georg Ehrke cbbe11fa1f
Rename app-generated to z-app-generated, because macOS Contacts supports only one and will pick the first one alphabetically
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
2020-05-07 16:48:32 +02:00
Morris Jobke ecbc009e2f
Translate the maintenance mode message in webdav
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2020-05-06 18:11:54 +02:00
Roeland Jago Douma b7b7b2872c
Fix owner on publicownerwrapper
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2020-05-01 10:50:26 +02:00
Morris Jobke 0f9b88c5a9
Merge pull request #20718 from nextcloud/fix/public_share_owner_activity_mess
Add a wrapper to fall back to the share owner on public shares
2020-04-30 13:46:13 +02:00
Roeland Jago Douma b8b53a2d9a
Merge pull request #19436 from nextcloud/bugfix/noid/dav-quota-calculation
Do not include mountpoints when calculating quota usage on WebDAV
2020-04-30 09:13:19 +02:00
Roeland Jago Douma a1f3293c06
Merge pull request #19039 from nextcloud/dav-activity-provide-links-to-calendar
Provide links to calendar in event creation/update activities
2020-04-30 09:10:56 +02:00
Roeland Jago Douma bc66bdc072
Add a wrapper to fall back to the share owner on public shares
Else it might happen that we setup a storage that has no real owner and
activities do boom etc (looking at you groupfolders and external
storages!).

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
2020-04-30 08:57:01 +02:00
Joas Schilling f662d3663b
Temporary fix contacts search
Signed-off-by: Joas Schilling <coding@schilljs.com>
2020-04-29 14:48:41 +02:00
Christoph Wurst cb057829f7
Update license headers for 19
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2020-04-29 11:57:22 +02:00
Morris Jobke 3c5c4caa4d
Merge pull request #20632 from nextcloud/bugfix/20624
Only catch anonymous OPTIONS for Office
2020-04-27 10:38:32 +02:00
Thomas Citharel deb2ea9cea
Provide links to calendar in event creation/update activities
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2020-04-26 11:11:50 +02:00
Julius Härtl 902d12555e
Do not include mountpoints when calculating quota usage on WebDAV
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2020-04-24 18:15:43 +02:00