Commit Graph

1241 Commits

Author SHA1 Message Date
Mole
5ae5fe338a V13: Set request culture for VirtualPageController (#16572)
* Rename FindDomain to FindAndSetDomain

* Ensure VariationContext and PublishedRequest is updated for virtual page controller
2024-06-07 12:49:13 +02:00
Rasmus John Pedersen
cfcdc9c98d Webhook log improvements (#16200)
* fix: include all headers in webhook log

* feat: return webhook log status from server

* feat: make webhook logs deep linkable

* feat: add webhook log pagination

* feat: improve webhook request/response body preview
2024-05-06 13:14:11 +02:00
nzdev
ac5539a8be Avoid string.Format allocations when profiler is not enabled. 2024-03-13 14:39:57 +00:00
Jacob Overgaard
12355219d4 V13: The login screen does not display external login errors (#15715)
* show external login errors as a subheadline on the login screen
* fix: migrate error handling from v12 for external login
* cleanup unused client-side javascript
2024-02-14 13:24:10 +01:00
Jacob Overgaard
36402a149a Merge remote-tracking branch 'origin/v13/dev' into contrib
# Conflicts:
#	build/azure-pipelines.yml
2024-02-02 13:43:49 +01:00
Andy Butland
b5b9c13bad Allow methods that call GetCropUrl to be verified in unit tests. (#15674) 2024-02-02 13:12:26 +01:00
Sebastiaan Janssen
db545a33e1 Merge branch 'v13/dev' into contrib 2024-01-31 10:49:42 +01:00
Liam Laverty
dd3ab3a0dc Temp/15591 serilog string conventions (#15592)
* Updaets `MigrationPlanExecutor.cs` to use serilog convention for strings

* Updaets `ExamineManagementController.cs` to use serilog convention for strings

* Updaets `HelpController.cs` to use serilog convention for strings

* Updaets `PreviewAuthenticationMiddleware.cs` to use serilog convention for strings
2024-01-22 02:57:58 +01:00
Bjarke Berg
d3dc85f31f Only update security stamp once per request (#15562)
* Add item in requestcache when security stamp is already updated in request

* Propagate constructur obsoletion to implementing services and fix unit tests

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-01-11 10:20:58 +01:00
Sebastiaan Janssen
6258fa6a35 Merge branch 'v13/dev' into contrib
# Conflicts:
#	src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Default.cshtml
#	src/Umbraco.Core/EmbeddedResources/Lang/en.xml
#	src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js
#	tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts
2024-01-02 10:33:35 +01:00
Bjarke Berg
28fc85a96c Merge remote-tracking branch 'origin/release/13.0' into v13/dev
# Conflicts:
#	version.json
2023-12-20 09:52:57 +01:00
Kenn Jacobsen
e34b2c09e0 Add policies for content template handling (#15482) 2023-12-19 14:20:31 +01:00
Bjarke Berg
8a9e6ee82d Merge remote-tracking branch 'origin/v12/dev' into v13/dev
# Conflicts:
#	global.json
#	src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Default.cshtml
#	src/Umbraco.Cms.StaticAssets/wwwroot/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoRichTextBlock.html
#	src/Umbraco.Core/EmbeddedResources/Lang/da.xml
#	src/Umbraco.Core/EmbeddedResources/Lang/en.xml
#	src/Umbraco.Core/EmbeddedResources/Lang/fr.xml
#	src/Umbraco.Core/EmbeddedResources/Lang/tr.xml
#	src/Umbraco.Core/Models/PublishedContent/PublishedPropertyType.cs
#	src/Umbraco.Infrastructure/BackgroundJobs/Jobs/HealthCheckNotifierJob.cs
#	src/Umbraco.Infrastructure/BackgroundJobs/RecurringBackgroundJobHostedServiceRunner.cs
#	src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs
#	src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js
#	src/Umbraco.Web.UI.Client/src/common/services/editor.service.js
#	src/Umbraco.Web.UI.Client/src/views/components/application/umb-login.html
#	src/Umbraco.Web.UI/Startup.cs
#	tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts
#	tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/HealthCheckNotifierJobTests.cs
#	version.json
2023-12-13 09:55:34 +01:00
Sebastiaan Janssen
6f582451ed Merge branch 'release/13.0' into v13/dev
# Conflicts:
#	version.json
2023-12-08 15:54:06 +01:00
Ronald Barendse
9e96bba9bc Disable transitive package version pinning (#15406)
* Disable transitive package version pinning

* Take top-level dependencies on Azure.Identity and System.Net.Http

* Take top-level dependencies on System.Security.Cryptography.Xml and System.Text.RegularExpressions
2023-12-08 15:00:18 +01:00
Nikolaj Geisle
b50353b238 V13: Log webhook firing exceptions when they happen (#15393)
* Refactor Webhook logging to handle exceptions

* Add Exception occured property to WebhookLog.
2023-12-07 14:25:26 +01:00
Nikolaj Geisle
4ff2572d78 Use named HttpClients (#15375)
* Use named HttpClients

* Register as named client

* Set headers on request message.

* Add User agent header to http client

* Add headers within Try-catch

* Add using for HttpResponseMessage

* Update src/Umbraco.Infrastructure/BackgroundJobs/Jobs/WebhookFiring.cs

Co-authored-by: Ronald Barendse <ronald@barend.se>

* Update src/Umbraco.Infrastructure/BackgroundJobs/Jobs/WebhookFiring.cs

Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>

* Log key instead of entire webhook

* Update src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs

Co-authored-by: Ronald Barendse <ronald@barend.se>

* Create constant for User agent header name

* Update src/Umbraco.Infrastructure/BackgroundJobs/Jobs/WebhookFiring.cs

Co-authored-by: Ronald Barendse <ronald@barend.se>

* Use datetime.now

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Ronald Barendse <ronald@barend.se>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
2023-12-07 09:51:44 +01:00
Sebastiaan Janssen
024a57e098 Merge branch 'v12/dev' into v13/dev
# Conflicts:
#	global.json
#	src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Default.cshtml
#	src/Umbraco.Cms.StaticAssets/wwwroot/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoRichTextBlock.html
#	src/Umbraco.Core/EmbeddedResources/Lang/da.xml
#	src/Umbraco.Core/EmbeddedResources/Lang/en.xml
#	src/Umbraco.Core/EmbeddedResources/Lang/tr.xml
#	src/Umbraco.Core/Models/PublishedContent/PublishedPropertyType.cs
#	src/Umbraco.Infrastructure/BackgroundJobs/Jobs/HealthCheckNotifierJob.cs
#	src/Umbraco.Infrastructure/BackgroundJobs/RecurringBackgroundJobHostedServiceRunner.cs
#	src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs
#	src/Umbraco.Web.UI.Client/src/common/services/blockeditormodelobject.service.js
#	src/Umbraco.Web.UI.Client/src/common/services/editor.service.js
#	src/Umbraco.Web.UI/Startup.cs
#	tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts
#	tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/HealthCheckNotifierJobTests.cs

(cherry picked from commit ef3f2c48198d8baed9d3340f926cd07e80720428)
2023-12-06 12:47:51 +01:00
Sebastiaan Janssen
319d98ef23 Merge branch 'v12/dev' into contrib 2023-12-05 12:36:34 +01:00
Bjarke Berg
1f527fefd8 Merge remote-tracking branch 'origin/v12/dev' into v13/dev
# Conflicts:
#	build/azure-pipelines.yml
#	src/Umbraco.New.Cms.Infrastructure/Umbraco.New.Cms.Infrastructure.csproj
#	src/Umbraco.Web.UI.Client/package-lock.json
#	src/Umbraco.Web.UI.Client/package.json
#	tests/Umbraco.Tests.Integration/CompatibilitySuppressions.xml
2023-11-28 11:20:02 +01:00
Bjarke Berg
280518c9d6 Merge remote-tracking branch 'origin/v11/dev' into v12/dev
# Conflicts:
#	build/azure-pipelines.yml
#	src/Umbraco.Cms.ManagementApi/Umbraco.Cms.ManagementApi.csproj
#	src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs
#	src/Umbraco.Web.UI.Client/.nvmrc
#	src/Umbraco.Web.UI.Client/package-lock.json
#	src/Umbraco.Web.UI.Client/package.json
2023-11-28 09:39:31 +01:00
Bjarke Berg
ab781560bc Merge remote-tracking branch 'origin/v10/dev' into v11/dev
# Conflicts:
#	build/azure-pipelines.yml
#	src/Umbraco.Web.BackOffice/Controllers/ContentController.cs
#	src/Umbraco.Web.UI.Client/package-lock.json
#	src/Umbraco.Web.UI.Client/package.json
#	tests/Umbraco.Tests.AcceptanceTest/package-lock.json
2023-11-27 19:47:24 +01:00
Bjarke Berg
bf8af4588e Centralised NuGet packages (#15293)
* Moved to centralized nuget packages

* Handle JsonSchema

* Change PackageReference to PackageVersion

* Opt out of central package management for mangement api (at least for versions less than 14) and the UI project

* ManagePackageVersionsCentrally = false

* Change folder acceptance tests are build, to avoid reading the test Directory.Packages.props

* Change folder acceptance tests are build, to avoid reading the test Directory.Packages.props

* change working directory

* workingDirectory

* Force the template to use local nuget packages

* Force the template to use local nuget packages

* clean up

* added wait on

* added wait on
2023-11-27 15:18:00 +01:00
Ronald Barendse
e22c43b471 Update to Serilog 8.0.0 2023-11-21 10:51:03 +01:00
Nikolaj Geisle
960d70ec54 V13: Webhook logging cleanup (#15198)
* Add log cleanup settings

* Start implementation of WebhookLoggingCleanup

* Add WebhookLog database locks

* Refactor repository to allow cleanup

* Refactor WebhookLoggingCleanup to fix bugs

* FIx up tests

* WebhookLoggingCleanup PR review suggestions

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Sven Geusens <sge@umbraco.dk>
2023-11-16 13:49:05 +01:00
Bjarke Berg
ab2ebba690 remove imagesharp reference 2023-11-15 12:05:19 +01:00
Vitor Rodrigues
44c3c3741e Fix potential NullReferenceException 2023-11-15 11:49:36 +01:00
Bjarke Berg
65b7967fed Updated to .NET 8 final (#15204) 2023-11-15 09:29:50 +01:00
Bjarke Berg
80631e77c9 Post merge fixes with versions and updated nuget packages 2023-11-14 12:49:02 +01:00
Bjarke Berg
97aa623e87 Fixed smalled things due to nullable refernece types 2023-11-14 10:51:06 +01:00
Bjarke Berg
cea6c3f20e Merge remote-tracking branch 'origin/v12/dev' into v13/dev 2023-11-14 09:31:25 +01:00
Bjarke Berg
74f06bd6bd Merge remote-tracking branch 'origin/release/13.0' into v13/dev 2023-11-14 09:30:53 +01:00
Bjarke Berg
fee9bf12c0 Updated nuget packages 2023-11-13 18:56:57 +01:00
Bjarke Berg
633f649be9 Merge remote-tracking branch 'origin/v11/dev' into v12/dev
# Conflicts:
#	src/Umbraco.Cms.ManagementApi/Umbraco.Cms.ManagementApi.csproj
#	src/Umbraco.Infrastructure/Cache/DistributedCacheBinder_Handlers.cs
2023-11-13 18:40:11 +01:00
Bjarke Berg
74cfd9c9a0 Updated nuget packages 2023-11-13 18:38:15 +01:00
Bjarke Berg
d6751e2832 Merge remote-tracking branch 'origin/v10/dev' into v11/dev
# Conflicts:
#	version.json
2023-11-13 18:30:50 +01:00
Nikolaj Geisle
46df3a05a7 V13: request queueing (#15176)
* Implement persistence

* Start implementing repository

* Implement repository

* Implement request service

* Dont run WebhookFiring if not in runtime mode run

* Refactor repository and service to have full CRUD

* add tests for Request service

* Implement WebhookRequest lock

* Register hosted service

* Add try catch when firing HttpRequest

* Add migration

* Refactor to use renamed IWebhookService

* Refactor tests too

* Add setting to configure webhook firing period

* Update docs

* Review fixes

* Add column renaming migration

* Remove unused service

* run request in parralel

* Refactor to fire parallel in background

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2023-11-13 15:49:02 +01:00
Bjarke Berg
e5de8bf56b Updated nuget packages (#15192) 2023-11-13 14:59:52 +01:00
Bjarke Berg
16a27a4c52 use header value instead if present to set culture on request (#15168) 2023-11-13 13:33:02 +01:00
Andrew McKaskill
04ac1542aa Refactor hostedServices into background jobs (#14291)
* Refactor jobs from HostedServices into BackgroundJobs

* Clean up generics and DI setup

* Add RecurringBackgroundJob Unit Tests

* Add ServiceCollection helper

* Add Obsolete attributes

* Add Notification Classes

* Add UnitTests for RecurringBackgroundJob HostedService

* Add NotificationEvents

* Add state to notifications

* Update UnitTests

* Add Obsolete Attributes to old hosted service classes

* Updated xmldoc in IRecurringBackgroundJob.cs

* Update Obsolete attribute messages to indicate classes will be removed in Umbraco 14

(cherry picked from commit c30ffa9ac3)
2023-11-13 11:10:58 +01:00
Bjarne Fyrstenborg
1d43a67934 Add edit page for webhook (#15175)
* Add edit page for webhook

* Remove function again

* Remove old edit in overlay

* Update language keys

* Update GetByKey to get model as camel case properties

* Localize "select event"

* Localize "create header"

* Don't show input field in header for now

* Add generic class to limit property editor width

* Remove loading check since already checked when loading entire editor view

* Add empty message

* Update col span

* Set edit name

* Map id property

* Return webhook model after update

* Translate speech bubble text

* Resolve content types

* Only push if not already exists

* Check webhook headers

* Set webhook enabled by default
2023-11-13 10:14:40 +01:00
Nikolaj Geisle
7bde16b4ef V13: Add eventype to webhookevents (#15157)
* Refactor IWebhookEvent to contain event type.

* refactor frontend to filter on eventType.

* Display event names

* refactor to use eventNames

* remove npm from overview

* implement alias for WebhookEvents

* Implement [WebhookEvent] attribute

* Refactor IWebhookService to get by event alias and not name

* Rename parameter to fit method name

* to lower event type to avoid casing issues

* Apply suggestions from code review

Co-authored-by: Ronald Barendse <ronald@barend.se>

* Change event names from constants to hard coded. And give more friendly names

* Refactor to not use event names, where it was not intended

* Add renaming column migration

* display event alias in logs

* Update migration to check if old column is there

* Apply suggestions from code review

Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>

* add determineResource function to avoid duplicate code

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Ronald Barendse <ronald@barend.se>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
2023-11-09 14:18:34 +01:00
Bjarke Berg
836f173925 Merge remote-tracking branch 'origin/release/13.0' into v13/dev 2023-11-09 09:23:44 +01:00
Ronald Barendse
d301679e53 Include Umbraco.Web.UI.Login project, update compatibility suppressions and remove unnecessary package references (#15163)
* Fix Umbraco.Web.UI.Login not showing up in solution

* Update PackageValidationBaselineVersion  to 13.0.0-rc1 and remove all CompatibilitySuppressions.xml files

* Remove unnecessary package references

* Move Microsoft.EntityFrameworkCore.Design reference and add comment

* Disable package validation and fix override in tests

* Inherit package validation setting for EF Core projects
2023-11-09 08:39:42 +01:00
Bjarne Fyrstenborg
a648dda61b Add tree access to webhooks (#15156)
* Add tree access to webhooks

* Update authorize attribute

* Add webhooks tree policy
2023-11-07 11:17:31 +01:00
Vitor Rodrigues
53b152d501 Fix potential NullReferenceException 2023-11-03 13:31:01 +00:00
Andrew McKaskill
c30ffa9ac3 Refactor hostedServices into background jobs (#14291)
* Refactor jobs from HostedServices into BackgroundJobs

* Clean up generics and DI setup

* Add RecurringBackgroundJob Unit Tests

* Add ServiceCollection helper

* Add Obsolete attributes

* Add Notification Classes

* Add UnitTests for RecurringBackgroundJob HostedService

* Add NotificationEvents

* Add state to notifications

* Update UnitTests

* Add Obsolete Attributes to old hosted service classes

* Updated xmldoc in IRecurringBackgroundJob.cs

* Update Obsolete attribute messages to indicate classes will be removed in Umbraco 14
2023-11-02 13:15:14 +01:00
Niels Lyngsø
ae84d324ab V13/feature/blocks in rte (#15029)
* insert umb rte block web component in rte

* First stab at moving the RTE markup to a nested "markup" property in the property value.

* initial work

* only rewrite markup

* transform RTE into component

* parse scope in grid.rte

* revert use a fallback instead

* block insertion and sync in place

* block picker partly impl

* remove test of old controller

* remove test of old controller

* block with block data

* proper block with api connection

* remove log

* styling

* Persist blocks data (still a temporary solution)

* styling allows for interaction

* block actions

* tinyMCE styling

* paste feature

* prevalue display Inline toggle

* inline mode in RTE

* todo note

* fixes wording

* preparation for editor communication

* remove val-server-match for now

* clean up blocks that does not belong in markup

* remove blocks not used in the markup

* liveEditing

* displayAsBlock formatting

* clean up

* TODO note

* Serverside handling for RTE blocks (incl. refactor of Block List and Block Grid)

* ensure rich text loads after block editor

* trigger resize on block init

* Handle RTE blocks output in Delivery API

* sanitize ng classes

* simplify calls to init blocks

* move sanitisation

* make validation work

* only warn when missing one

* clean up

* remove validation border as it does not work

* more clean up

* add unsupported block entry editor

* Revert breaking functionality for Block List and Grid

* prevent re-inits of blocks

* make sure delete blocks triggers an update

* Refactor RichTextPropertyIndexValueFactory to index values from blocks + clean up RichTextPropertyEditor dependencies

* first working cursor solution

* inline element approach

* Handle both inline and block level blocks

* Fix the RTE block parser regex so it handles multiple inline blocks.

* Fix reference and tags tracking, add tests, make the editor backwards compatible and make deploy happy

* Use RichTextPropertyEditorHelper serialization in tests

* Ensure correct model in Block Grid value converter (incl unit test to prove it)

* do not include umbblockpicker in grid

* make blocks the new default, instead of macros

* only send value of body from DOMParser

* Blocks of deleted ElementTypes shows unsupported

* do not edit a unsupported block

* remove trying to be smart on the init

* fix missing culture issue

* set dirty

* alert when no blocks

* Revert "make blocks the new default, instead of macros"

This reverts commit 283e8aa473fdfde075197d34aa47e35dfc64a8ae.

---------

Co-authored-by: kjac <kja@umbraco.dk>
2023-10-31 12:52:35 +01:00
Nikolaj Geisle
1b34d33eb7 Webhooks administration from Backoffice (#15050)
* Create webhook models

* Define interfaces for service and repository

* Create Webhook dto and corresponding factory

* implement WebhookRepository.cs

* Remove entity name from models, as that should be resolved in mapping instead

* Add new table to schema creator

* Register repo for DI

* Remove more mentions of entityname

* Refactor repository to guids

* Implement WebhookService

* Use scopes in service

* Start creating tests for service

* Refactor delete to use Id and not entire entity

* Rework Webhooks to be able to have multiple entity keys

* Implement GetAll functionality

* Implement webhook controller

* Imeplement get all events action

* Add equalityComparer deletegate to Webhook

* Add datacontract attirbutes to properties

* Implement backoffice webhooks tree

* Implement first webhooks menu

* Make WebHookController authorized

* Update to have tabs with webhooks and logs

* Enable create overlay

* Push to entityKeys array

* Fix up pagination

* Implement delete functionality

* remove pagination

* add log view

* Fix create to be able to select more than one content type

* implement type name resolving for content

* Refactor to use less duplication

* Implement update functionality in frontend

* Rename database table

* Make multiple events possible

* create new event picker

* Refactor to actually add new database table with proper name

* Make it possible to select multiple events

* Fix updating current items

* Fix up update functionality after db rework

* Add webhook icon

* Switch to match heartcore icons

* Refactor to use bases instead of Enum

* Refactor to make IWebhookEvent to Collection, so it can be injected instead of using reflection

* Fix up frontend to match new models

* Fix integration tests

* Remove obsolete entity key from webhookdto

* Introduce constants instead of hard coded strings

* Start implementation of firing mechanism

* Add new GetByEventName method

* Add 1 to many list on WebhookDto

* Implement new repository pattern

* Implement GetByEventName

* Fix up repository to use all async

* Refactor events to fire

* Refactor WebhookEvents to be more DRY

* Add custom header

* Start implementing log repository

* Implement GetPaged

* Implement WebhookLogService

* Implement GetLogs

* Add url to webhook log

* Implement log overview

* Formatting

* Implement details view

* Refactor to get actual retry count

* Refactor firing to fire only when Enabled

* Add Status code to detailed view

* Add configuration to disable webhooks entirely

* Implement custom headers frontend

* Implement persistence of custom headers

* Refactor retry service to also retry on non success status codes.

* Refactor registration of Webhooks, to also register as NotificationHandler

* Add webhooks migration

* Add key for adding webhook headers

* Fix up test

* Change event icon to flag

* Remember event, when editing what events you have chosen

* Refactor reflection to check if INotificationAsyncHandler instead

* Formatting

* Refactor webhook model to no longer derive from EntityBase

* Rename entityKeys to content keys

* Rename controller to lowercase H

* Add null check before trying to access selectedEvents

* Add configuration for maximum number of retries

* Add index to date

* Add webhook Key to logs

* Check for SchedulingPublisher before sending webhooks

* rename requestObject to payload

* Refactor event to send appropriate payloads

* Refactor logging to happen for every try.

* Order date by descending

* Add todo

* Change firing service to use String not ByteContent

* Update Headers to Interface instead of concrete implementation

* Dont return if a table exists already

* Rename updateModel to webhook

* Annotate WebhookController.cs with PluginController attribute

* Add danish translations

* Do not check if fail

* Dont filter when selecting custom items

* Remove delay from WebhookFiringService

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
2023-10-31 10:06:14 +01:00
Nikolaj Geisle
8dff55fced Update nuget packages (#15039)
* Update nuget packages

* Update to use latest rc2 version of packages instead of specific

* Update src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj

* dont add private/include assets

* Remove duplicate serilog reference

* Revert Moq update

* Update src/Umbraco.Web.UI/Umbraco.Web.UI.csproj

---------

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2023-10-26 09:01:29 +02:00