Commit Graph
2469 Commits
Author SHA1 Message Date
Miguel de la CruzandMiguel de la Cruz a9b894b7c3 Move mmctl cpa subcommands under mmctl user attributes (#33975)
Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
2025-09-29 11:29:30 +00:00
f8b3ce4e3b Add multiform functionality to Interactivedialog (#33076)
* Implement Interactive Dialog field refresh and multi-step form functionality

- Add field refresh capability to interactive dialogs
- Implement multi-step form support
- Add comprehensive E2E tests for new features
- Enhance InteractiveDialogAdapter with server-side error handling
- Optimize form validation and performance
- Add internationalization support for error messages
- Maintain backward compatibility with existing dialogs

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fixes and cleanup

* Enhance field refresh e2e tests with improved field ordering and form submission

- Reverse field order: project name first, then project type (with refresh)
- Ensure all tests enter project name to verify value preservation
- Add form submission to MM-T2540B test to verify complete workflow
- Update webhook server to preserve project name values during refresh
- Add submission handler for field refresh dialog callback
- Update introduction text to reflect new field ordering workflow

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* code review updates

* Simplify apps form value preservation by always merging previous values

- Remove AppFormUpdateType enum and updateType props throughout apps form system
- Simplify getDerivedStateFromProps to always preserve existing values via spread operator
- Remove restoreFormFieldValues function and manual value restoration logic
- Eliminate conditional refresh vs submit behavior in favor of consistent value preservation

This change makes apps form behavior consistent regardless of whether it's a
multi-step submission or field refresh, improving reliability and reducing complexity.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Add server-side validation for SubmitDialogResponse

- Add SubmitDialogResponseType enum with OK, Form, Navigate, and Empty types
- Implement IsValid() method with fail-fast validation logic
- Validate type field and ensure Form field consistency based on type
- Add comprehensive test coverage for all validation scenarios
- Integration validates responses in SubmitInteractiveDialog handler

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* lint fixes

* Fix test case for multierror format in Dialog.IsValid()

The Dialog.IsValid() method returns multierror format, so the test
expectation needs to match the actual error format with line breaks.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* i18n-extract

* log dialog errors, allow invalid dialog

* Fix interactive dialog test assertions for undefined values

Handle cases where dialog elements have undefined default values or
placeholders by providing empty string fallbacks. This resolves CI
test failures where undefined values were expected but empty strings
were returned from DOM elements.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-26 11:09:50 -06:00
Jesse Hallam 6b72b2f308 build 1.24.6, ignore Docker.buildenv* for server-ci (#33979) 2025-09-26 09:43:47 -03:00
Guillermo Vayá 9d16035212 [MM-65769] Add UpdatedSince to properties search in pluginapi (#33959)
* add since to properties search

* improve testing

* fix tests

* address naming concerns

* adapt comments to new naming

* style fixes

* who you gonna call?
2025-09-26 13:14:29 +02:00
Pablo VélezandMattermost Build de686b80bf MM-65661 - channel admin abac override previous jobs (#33872)
* MM-65661 - channel admin abac override previous jobs

* more UX adjustments; always show the self-exclusion warning modal

* use SubjectID parameter for more performant user lookup instead of fetching all matching users

* improve validation of result based on PR feedback

* performance optimization and DoS protection for access control sync jobs

* refactor: rename context parameter from 'c' to 'rctx' in job-related functions for consistency

* prevent duplicate save button clicks with immediate response and remove unnecessary debouncing time

* remove dedicated endpoint and unify logic

* improve filtering performance by including statuses

* use a flag to use master directly to prevent db replication lags

* adjust unit tests based on pr feedback

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-26 12:33:31 +02:00
Miguel de la CruzandMiguel de la Cruz f5693467db Adds value endpoints to local mode (#33950)
Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
2025-09-26 10:57:13 +02:00
Miguel de la CruzandMiguel de la Cruz cd3f4483ee Improves mmctl cpa subcommands' output to show human readable values instead of IDs (#33943)
* Improves `mmctl cpa` subcommands' output to show human readable values instead of IDs

* Adds mmctl docs updates

* Fixed linter

---------

Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
2025-09-26 10:56:01 +02:00
Abbas Mehdi Naqvi 0eeac66eef Bump prepackage Gitlab plugin version to 1.11.0 (#33867) 2025-09-25 10:28:01 -04:00
Lorenzo 7f83098b33 fix: keycloak attribute mappings to match realm-export.json (#33964) 2025-09-25 05:29:22 +00:00
Harshil Sharma da47477956 Added API docs for /common_teams API (#33941)
* Added API docs for /common_teams API

* removed error from known error list
2025-09-25 08:41:48 +05:30
80410e99db Add e2e tests for ConfigMigrateCmdF (#30161)
* add e2e tests for ConfigMigrateCmdF

* resolve review comments

---------

Co-authored-by: Ben Schumacher <ben.schumacher@mattermost.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-23 14:27:01 +02:00
Ben Schumacher bd8bbcb503 Fix bad merge (#33949) 2025-09-23 11:34:04 +02:00
Ben Schumacher d203ab7ee5 [MM-62582] Don't require email address verification for SAML/LDAP users when their email address changes (#30308)
* Don't invalidate email adress of SAML/LDAP users

* Add lazy migration to fix broken records
2025-09-23 09:39:19 +02:00
Tom De Moor 73a20ec3d8 Translated using Weblate (Dutch)
Currently translated at 100.0% (2693 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nl/
2025-09-22 14:54:34 +02:00
Kaya Zeren 4a2125bb3a Translated using Weblate (Turkish)
Currently translated at 100.0% (2693 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/tr/
2025-09-22 14:54:34 +02:00
Sharuru 99e357b74a Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (2693 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/zh_Hans/
2025-09-22 14:54:34 +02:00
Kaya Zeren b046c50992 Translated using Weblate (Turkish)
Currently translated at 100.0% (2693 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/tr/
2025-09-22 14:54:34 +02:00
Kaya Zeren fbf9bd774f Translated using Weblate (Turkish)
Currently translated at 98.9% (2664 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/tr/
2025-09-22 14:54:34 +02:00
Kaya Zeren 02eec0e939 Translated using Weblate (Turkish)
Currently translated at 98.4% (2650 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/tr/
2025-09-22 14:54:34 +02:00
master7 745631e378 Translated using Weblate (Polish)
Currently translated at 100.0% (2693 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/pl/
2025-09-22 14:54:34 +02:00
jprusch 3e1ebb5dba Translated using Weblate (German)
Currently translated at 100.0% (2693 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/de/
2025-09-22 14:54:34 +02:00
Kaya Zeren 05db555516 Translated using Weblate (Turkish)
Currently translated at 96.5% (2600 of 2693 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/tr/
2025-09-22 14:54:34 +02:00
Miguel de la CruzandMiguel de la Cruz b9cf758756 Adds upper limit validation to property fields and values (#33659)
Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
2025-09-19 18:52:34 +00:00
Alejandro García Montoro e87ee7fd9e Prepackage Playbooks FIPS v2.4.2 (#33934) 2025-09-19 16:55:37 +02:00
Julien Tant 3f5665f324 Update playbooks plugin to v2.4.2 (#33927)
Updated mattermost-plugin-playbooks from v2.4.1 to v2.4.2 in the Makefile plugin packages list.
2025-09-18 18:38:01 +00:00
Ben Schumacher 18eb1347db [MM-64900] Migrate to use request.CTX instead of context.Context (#33541)
* Migrate GetRoleByName

* Migrate users GetUsers

* Migrate Post and Thread store

* Migrate channel store

* Fix TestConvertGroupMessageToChannel

* Fix TestGetMemberCountsByGroup

* Fix TestPostStoreLastPostTimeCache
2025-09-18 16:14:24 +02:00
sabril f10997a351 fix /var/tmp permission (#33918) 2025-09-17 14:36:30 +00:00
f6ce0e439e Improve self checks when adding a new channel member (#33404)
* Improve self checks when adding a new channel member

* Fix linter

---------

Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-17 10:20:58 +00:00
Jesse Hallam 8d74c6c45c MM-64395: Remove unused searchArchivedChannelsForTeam API and implementations (#33885)
The searchArchivedChannelsForTeam functionality has been superseded by the
searchAllChannels API with include_deleted parameter. The Browse Channels modal
and other UI components now use the modern searchAllChannels approach.

Fixes: https://mattermost.atlassian.net/browse/MM-64395
2025-09-16 09:51:37 -03:00
Miguel de la CruzandMiguel de la Cruz b3c4aa4cc8 Ensures new CPA fields are created without DeleteAt set (#33652)
* Ensures new CPA fields are created without DeleteAt set

* Move the DeleteAt check to the main property logic

* Apply timestamps unconditinally as this method is only run before creating a new field

* Fix the linter and test

---------

Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
2025-09-16 11:19:18 +00:00
Ben SchumacherandCopilot 832d033785 [MM-64517] Fix NPE in PluginSettings.Sanitize (#31361)
* Fix NPE in PluginSettings.Sanitize

* Don't return settings that the plugin doesn't define any longer

* Fix TestPluginAPILoadPluginConfiguration

* Apply suggestions from code review

* Update server/public/model/config.go

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-16 12:57:28 +02:00
Eva Sarafianou 75d5371cd8 Update msteams plugin (#33899) 2025-09-16 13:35:26 +03:00
Nick Misasi d1b7ccc454 Add support for pgvector in local dev (#33900) 2025-09-15 18:58:43 +00:00
Frank Paul Silye c9b74053e2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 4.4% (119 of 2690 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nb_NO/
2025-09-15 19:59:12 +02:00
Maria A Nunez 072c402e49 Team Edition User Limit Update (#33888)
* Lower user limit for TE to final limit

* Added warning banner for user soft limit

* Linting

* Fix test

* Fix tests
2025-09-15 11:39:52 -04:00
06b1bf3a51 MM-64878: FIPS Build (#33809)
* pin to ubuntu-24.04

* always use FIPS compatible Postgres settings

* use sha256 for remote cluster IDs

* use sha256 for client config hash

* rework S3 backend to be FIPS compatible

* skip setup-node during build, since already in container

* support FIPS builds

* Dockerfile for FIPS image, using glibc-openssl-fips

* workaround entrypoint inconsistencies

* authenticate to DockerHub

* fix FIPS_ENABLED, add test-mmctl-fips

* decouple check-mattermost-vet from test/build steps

* fixup! decouple check-mattermost-vet from test/build steps

* only build-linux-amd64 for fips

* rm entrypoint workaround

* tweak comment grammar

* rm unused Dockerfile.fips (for now)

* ignore gpg import errors, since would fail later anyway

* for fips, only make package-linux-amd64

* set FIPS_ENABLED for build step

* Add a FIPS-specific list of prepackaged plugins

Note that the names are still temporary, since they are not uploaded to
S3 yet. We may need to tweak them when that happens.

* s/golangci-lint/check-style/

This ensures we run all the `check-style` checks: previously,
`modernize` was missing.

* pin go-vet to @v2, remove annoying comment

* add -fips to linux-amd64.tz.gz package

* rm unused setup-chainctl

* use BUILD_TYPE_NAME instead

* mv fips build to enterprise-only

* fixup! use BUILD_TYPE_NAME instead

* temporarily pre-package no plugins for FIPS

* split package-cleanup

* undo package-cleanup, just skip ARM, also test

* skip arm for FIPS in second target too

* fmt Makefile

* Revert "rm unused Dockerfile.fips (for now)"

This reverts commit 601e37e0ff.

* reintroduce Dockerfile.fips and align with existing Dockerfile

* s/IMAGE/BUILD_IMAGE/

* bump the glibc-openssl-fips version

* rm redundant comment

* fix FIPS checks

* set PLUGIN_PACKAGES empty until prepackaged plugins ready

* upgrade glibc-openssl-fips, use non-dev version for final stage

* another BUILD_IMAGE case

* Prepackage the FIPS versions of plugins

* relocate FIPS_ENABLED initialization before use

* s/Config File MD5/Config File Hash/

* Update the FIPS plugin names and encode the + sign

* add /var/tmp for local socket manipulation

---------

Co-authored-by: Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-15 10:53:28 -03:00
Eva Sarafianou b617153d79 import/export directories cloud restricable (#33506) 2025-09-15 15:28:50 +03:00
Maria A NunezandNick Misasi 1a713021c6 Post history limit banner (#33846)
* Support for Entry license with limits + updates to Edition & License screen

* Refactor message history limit to use entry sku limits

* Fixed missing update on license change

* Fix typo in limit types

* Revert unnecessary thread change

* Revert merge issue

* Cleanup

* Fix CTAs of limit notifications

* Linting

* More linting

* Linting and fix tests

* More linting

* Fix tests

* PR feedback and fix tests

* Fix tests

* Fix test

* Fix test

* Linting

* Initial commit

* Cleanup

* PR Feedback

* Fix merge conflict

* PR feedback

* Fix bad merge

* PR feedback, Fix test

* PR feedback

* Fixed stacking banner issue

* Revert unnecessary change

* Linting

---------

Co-authored-by: Nick Misasi <nick.misasi@mattermost.com>
2025-09-13 21:20:02 -04:00
Pablo VélezandMattermost Build f2f83187b8 MM-65618 - filter based on admin values (#33857)
* MM-65618 - filter based on admin values

* add open api documentation

* adjust api description and adjust UX to match design

* reorganize function and add unit tests

* more UX adjustments; always show the self-exclusion warning modal

* use SubjectID parameter for more performant user lookup instead of fetching all matching users

* fix unit tests and remove wrong condition for job run

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-12 20:09:47 +02:00
Alejandro García Montoro 2ed93b8b77 Increase timeout in test-server-race to two hours (#33883) 2025-09-12 17:41:16 +00:00
Miguel de la CruzandMiguel de la Cruz aad2fa1461 Adds Custom Profile Attributes value commands to mmctl (#33881)
Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
2025-09-12 17:59:40 +02:00
Rajat Dabade e8288b8b71 Upgrade board prepackage version v9.1.6 (#33871) 2025-09-12 18:10:15 +05:30
catalintomai 7d8b7b5e4a MM-63930: Lack of MFA enforcement in Websocket connections (#33381) 2025-09-12 08:35:06 +02:00
Julien Tant 78050bb0d3 Change properties search signature to support multiple TargetIDs (#33873)
* change properties search

* add tests

* Fix calls to to the search methods

* Fix SearchPropertyFields call with wrong signature
2025-09-11 22:56:01 +00:00
d15b933888 [MM-64683] Implement property field counting functionality in Plugin API (#33438)
* Implement property field limit enforcement and counting functionality in Plugin API

- Added a limit of 20 property fields per group in the CreatePropertyField method.
- Introduced CountPropertyFields method to count active and all property fields, including deleted ones.
- Enhanced tests to validate the new property field limit and counting behavior.
- Updated related API and service methods to support the new functionality.

* Update server/channels/app/properties/property_field.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix vet

* fix lint error

* fix test

* fix tests

* fix test

* count properties + targets

* Update server/channels/app/plugin_api.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* remove test for limit

* fix more tests

* improve testing messages now that the limit is removed

* Apply suggestion from @calebroseland

Co-authored-by: Caleb Roseland <caleb@calebroseland.com>

* Apply suggestion from @calebroseland

Co-authored-by: Caleb Roseland <caleb@calebroseland.com>

* Apply suggestion from @calebroseland

Co-authored-by: Caleb Roseland <caleb@calebroseland.com>

* Apply suggestion from @calebroseland

Co-authored-by: Caleb Roseland <caleb@calebroseland.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Julien Tant <785518+JulienTant@users.noreply.github.com>
Co-authored-by: Caleb Roseland <caleb@calebroseland.com>
2025-09-11 12:49:14 -07:00
316712522c Adds Custom Profile Attribute field commands to mmctl (#33789)
* Adds Custom Profile Attribute field commands to mmctl

* Fix linter

* Refactor buildFieldAttrs

* Reverse test to match implementation

* Adds a confirmation prompt

* Refactor the tests

---------

Co-authored-by: Miguel de la Cruz <miguel@ctrlz.es>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-11 18:38:21 +02:00
Pablo VélezandMattermost Build a062239402 MM-65182 - auto disable toggle on rules deleted and permissions update (#33810)
* MM-65182 - auto disable toggle on rules deleted and channel admin permissions update

* fix types and fix unit test

* adjust the useEffect hook and fix auto-save issue

* MM-65183 - rename access rules tab to access control (#33812)

* fix infinite loop issue and fix channel admin permissions issue

* fix linter and fix snapshots

* allow non-sysadmin users to see the system policy information banner

* stack modals backdrops

* address pr feedback; reorganize function and add unit tests

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-11 18:27:30 +02:00
c28d13cbc9 MM-64692: Migrate passwords to PBKDF2 (#33830)
* Add parser and hasher packages

The new `password` module includes two packages:
- `hashers` provides a structure allowing for seamless migrations
between password hashing methods. It also implements two password
hashers: bcrypt, which was the current hashing method, and PBKDF2, which
is the one we are migrating to.
- `parser` provides types and primitives to parse PHC[0] strings,
serving as the foundation of the `PasswordHasher` interface and
implementations, which are all PHC-based.

[0] https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md

* Use latest hasher to hash new passwords

The previous commit added a LatestHasher variable, that contains the
`PasswordHasher` currently in use. Here, we make sure we use it for
hashing new passwords, instead of the currently hardcoded bcrypt.

* Use errors from hashers' package

Some chore work to unify errors defined in `hashers`, not from external
packages like `bcrypt`.

* Implement password migration logic

This commit implements the actual logic to migrate passwords, which
can be summarized as:

0. When the user enters their password (either for login in
`App.CheckPasswordAndAllCriteria` or for double-checking the password
when the app needs additional confirmation for anything in
`App.DoubleCheckPassword`), this process is started.
1. The new `App.checkUserPassword` is called. In
`users.CheckUserPassword`, we parse the stored hashed password with the
new PHC parser and identify whether it was generated with the current
hashing method (PBKDF2). If it is, just verify the password as usual and
continue normally.
2. If not, start the migration calling `App.migratePassword`:
  a. First, we call `Users.MigratePassword`, which validates that the
  stored hash and the provided password match, using the hasher that
  generated the old hash.
  b. If the user-provided password matches the old hash, then we simply
  re-hash that password with our current hasher, the one in
  `hashers.LatestHasher`. If not, we fail.
  c. Back in `App.migratePassword`, if the migration was successful,
  then we update the user in the database with the newly generated hash.

* make i18n-extract

* Rename getDefaultHasher to getOriginalHasher

* Refactor App checkUserPsasword and migratePassword

Simplify the flow in these two methods, removing the similarly named
users.CheckUserPassword and users.MigratePassword, inlining the logic
needed in the App layer and at the same time removing the need to parse
the stored hash twice.

This implements a package-level function, CompareHashAndPassword: the
first step to unexport LatestHasher.

* Add a package level Hash method

This completely removes the need to expose LatestHasher, and lets us
also remove model.HashPassword, in favour of the new hashers.Hash

* Unexport LatestHasher

* Remove tests for removed functions

* Make the linter happy

* Remove error no longer used

* Allow for parameter migrations on the same hasher

Before this, we were only checking that the function ID of the stored
hash was the ID of the latest hashing method. Here, we no longer ignore
the parameters, so that if in the future we need to migrate to the same
hashing method with a different parameter (let's say PBKDF2 with work
factor 120,000 instead of work factor 60,000), we can do it by updating
the latestHasher variable. IsPHCValid will detect this change and force
a migration if needed.

* Document new functions

* make i18n-extract

* Fix typo in comment

Co-authored-by: Ben Cooke <benkcooke@gmail.com>

* Rename parser package to phcparser

* Simplify phcparser.New documentation

* Rename scanSymbol to scanSeparator

Redefine the list of separator tokens, including EOF as one.

* Document undocumented functions that are unexported

* Reorder error block in checkUserPassword

* Add unit tests for IsLatestHasher

* Reorder code in parser.go

* Enforce SHA256 as internal function for PBKDF2

* Fix typo in comment

Co-authored-by: Eva Sarafianou <eva.sarafianou@gmail.com>

---------

Co-authored-by: Ben Cooke <benkcooke@gmail.com>
Co-authored-by: Eva Sarafianou <eva.sarafianou@gmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-11 16:43:34 +02:00
3253b9ff6d Message History Limits in Entry Edition (#33831)
* Support for Entry license with limits + updates to Edition & License screen

* Refactor message history limit to use entry sku limits

* Fixed missing update on license change

* Fix typo in limit types

* Revert unnecessary thread change

* Revert merge issue

* Cleanup

* Fix CTAs of limit notifications

* Linting

* More linting

* Linting and fix tests

* More linting

* Fix tests

* PR feedback and fix tests

* Fix tests

* Fix test

* Fix test

* Linting

* Simplified Limit panels

* Linting

* PR feedback

* Revert back job time

* Linting

* linting

* Fixed issue switching in RHS

* PR Feedback

---------

Co-authored-by: Nick Misasi <nick.misasi@mattermost.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2025-09-10 22:52:19 -04:00
Ben Schumacher 06a46f6080 Lower Job complete log message to debug (#33828) 2025-09-10 15:40:30 +02:00